String a1="xxx"和String a2=new String("xxx")的区别
String a1="xxx"和String a2=new String("xxx")的区别
字符串常量池本质上是个HashSet<Set> 存储的是string对象的引用,不存储实际的内容
1.a1会在编译期间查看字符串常量池是否存在该字符串,没有的话会现在常量池注册,栈直接引用常量池中的字符串,如果已经存在就不再创建,所以可能创建0个或1个对象
2.a2会在编译期间查看字符串常量池是否存在该字符串,没有的话会现在常量池注册,然后再堆开辟一个内存空间,存在该字符串在常量池的地址值,栈指向堆内存,堆内存指向常量池,所以至少创建了1个对象,也可能2个
调用intern()会去查看常量池是否有该字符串实例
stringbuffer(线程安全)和stringbuild(线程不安全)可以解决,多个string对象拼接会产生过多的未使用对象
+号拼接字符串对象,底层实现是stringbuilder.append(),最后toString输出新的字符串是通过new String()实现的
String b1="ab"
String b2="a"
String b3="b"
String b4=b2+b3 b1不等于b4
intern()返回常量池中该字符串的引用,查看该字符串是否在常量池,不在就注册,在就引用常量池中的该字符串