String,StringBuilder,StringBuffer区别

254 阅读3分钟

每日一读:

上班为了下班,下班为了第二天上班,日复一日,慌慌张张,也不过是为了碎银几两。可偏偏这碎银几两,压断了世人肩膀,这就是生活。
很喜欢一段话:
生活各自不易,各人所求不同,各自立场不一。勿在别人心中修行自己,勿在自己心中强求别人

String

string是java语言非常基础重要的类,提供了构造和管理字符串的各种基本逻辑。

由于string在java中用的比较频繁,java为了避免一个系统产生大量的string对象,引入了字符串常量池。其运行机制是:创建一个字符串时,首先检查常量池中是否有相同的字符串对象,如果有则不需要创建直接从池中刚查找到的对象引用,如果没有,则新建字符串对象,返回对象引用。并且将新建的对象放入池中。但是,通过new方法创建的String对象是不检查常量池的,而是在堆或栈中创建一个新的对象。也不会把对象放入池中;上述原则只适用于通过直接量给String对象引用赋值的情况

举例: String str = “123”;通过直接量赋值方式,是进常量池的

String str = new String(“1230”);通过new的赋值方式,是不进常量池的

注意:String提供了inter()方法,调用该方法的时候,如果常量池中包括了一个等于此String对象字符串(equal)则返回池中的字符串对象,否则,将此String对象添加到池中,并且返回此池中对象的引用。

String的特性:

【A】不可变,是指String对象一旦生成,则不能在对他进行改变。不可变的主要作用于当一个对象需要被多线程共享时,并且访问频繁,可以忽略同步和锁的等待时间,从而大幅度的提高性能

【B】针对常量的优化,当两个String对象拥有相同的值时,他们只引用常量池中同一个拷贝。当一个字符串反复出现时,这个技术可以大幅度节省内存空间。

StringBuffer

可以用append和add进行字符串拼接,本质上是一线程安全的可修改字符序列。除非需要保证线程安全的问题,否则性能方面 更推荐stringBuilder来使用

stringBuilder

它跟stringBuffer性质一样,只是去掉了线程安全的问题。

知识扩展

String 是 Immutable 类的典型实现,原生的保证了基础线程安全,因为他无法对内部数据进行任何修改。这种遍历甚至体现在构造函数中,由于不可变,immutable对象在拷贝时不需要额外复制数据。

StringBuffer线程安全主要通过把各种修改数据的方法加上了synchronized关键字实现的,

StringBuffer和StringBuilder底层都是利用了可修改的,(char,jdk9,以后是byte)数组,二者都继承了AbstractStringBuilder,里面包含了基本操作,区别最终体现在是否加了synchronized。