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()返回常量池中该字符串的引用,查看该字符串是否在常量池,不在就注册,在就引用常量池中的该字符串

 

posted @ 2020-09-10 04:28  s459165447  阅读(181)  评论(0编辑  收藏  举报