String的那些事
2019-04-24 本文已影响0人
ZMRWEGo
- String常量池与堆
String a = "123";
String b = "123";
String c = new String("456");
String b = new String("456");
System.out.println(a==b);//返回true
System.out.println(c==d);//返回false
String a=("123")直接使用的是常量池中的引用,所以a和b所引用的都是常量池中的同一个地址。而new String("456")的时候是首先在堆中新建一个对象,然后指向该引用,同时如果常量池中没有该值,也会向常量池中放入456.
- String与StringBuilder、StringBuffer
- StringBuilder、StringBuffer都是用来进行字符串拼接的,但是StringBuffer
是线程安全的,内部利用sychronized来锁住方法,StringBuilder则没有考虑线程安全性,一般情况下速度是比StringBuilder快的。 - String利用
+
也可以进行字符串拼接,但是其和StringBuilder相比性能差了许多,例如String temp = "a"+"b"
,首先会向常量池中添加字符串"a"、"b"但是这些只是临时字符串其实是没有用的,会占用内存,第二就是+本质上还是利用StringBuiler来实现的拼接(这一步是靠编译器进行优化的),我们利用反编译可以发现,每次+的时候都会new StringBuiler在执行append方法,肯定会比直接使用StringBuiler慢很多。