浅谈 String s = “hello” 与 String s = new String(“hello”) 的区别
String s = “hello” 与 String s = new String(“hello”) 都在编译期间生成了字面常量和符号引用,运行期间字面常量 “hello” 被存储在运行时常量池中。通过这种方法来将 String 对象跟引用绑定的话,JVM执行引擎会先在运行时常量池查找是否存在相同的字面常量,如果查找,则直接将引用指向已经存在的字面常量;否则在运行时常量池开辟一个空间来存储字面常量,并将引用指向该字面常量。
通过 new 关键字来生成对象是在堆区进行的,而在堆区进行对象生成的过程是不会检测该对象是否已经存在的。因此通过 new 来创建对象,创建出的一定是不同的对象。
StringBuffer 与 StringBuilder 的区别
String 不擅长字符串频繁的增删,它每次会 new 出一个 StringBuilder 对象,然后进行 append 操作,通过 toString 方法返回 String 对象,造成资源的浪费。StringBuffer 与 StringBuilder 拥有的成员属性以及成员方法基本相同,区别是 StringBuffer 类的成员方法前面多了一个关键字:synchronized,作用是在多线程访问的时候起到安全保护作用的,也就是说 StringBuffer是线程安全的。
String、StringBuffer 与 StringBuilder 三者的执行效率
StringBuffer > StringBuilder > String
String、StringBuffer 与 StringBuilder 三者的使用场景
1、当字符串相加操作或者改动较少的情况下,建议使用 String str = “” 这种形式定义变量;
2、当字符串相加操作较多的情况下,建议使用 StringBuilder;
3、如果采用了多线程,则使用 StringBuffer。