java字符串的区别
存储区别
//堆栈有区别
//分在堆和栈中的地址不同但值相同,
//栈内存
String s0 = "abc";//栈 会在常量池里先检测,有就创建一个类似指针
//如果没有就开辟空间储存
//堆内存
String s1 = new String("abc");//无论常量池是否有都会创建
//两个存储位置不同
System.out.println(s0==s1);
System.out.println(s0.equals(s1));//equals是值对比和地址无关
System.out.println(s0.hashCode());
System.out.println(s1.hashCode());
这段代码将输出如下结果,创建字符串也区分是对内存存储还是栈内存存储,直接定义就是栈内存存储,通过new来创建就是堆内存存储。
这两种方式虽然值一样哈希地址也相同,但存储位置不同所以通过直接对比会返回flase,由此可见是区分堆栈内存的,因为值和哈希地址可以确定相等(s0.equals(s1)可以跳过其他只比较值是否一样,所以返回true)
栈内存
会在常量池里先检测,有就创建一个类似指针的量存储,这个量指向常量池的内容,如果没有就开辟新的空间储存
堆内存
无论常量池是否有当前值的变量都会创建,就算值一样,所以堆内存会占用较大内存效率不高,
![](https://i-blog.csdnimg.cn/blog_migrate/f9d69d9f834d5bb355063cbad37a404f.png)
字符串类型区别
String s0 = "abc";
String s1 = new String("abc");
//对字符串每次修改都会创建新的空间存储
String s2=s0+"d";
System.out.println(s2);
System.out.println(s0.hashCode());
System.out.println(s2.hashCode());
System.out.println(s0);
//----------------
System.out.println("-----------------------");
//buffer,builder可以避免
//buffer是线程安全的,支持并发操作,bulider只在单线程效率高
StringBuffer sb = new StringBuffer();
System.out.println(sb.hashCode());
sb.append("abc");
System.out.println(sb.hashCode());
// StringBuilder
这段代码将输出如下结果,
内存使用区别
可以看到,直接使用string创建的字符串,每一次对字符串进行修改之后,都会使用一个新的地方来存储,而通过StringBuffer和StringBuilder创建的字符串会在原来的地址上进行直接存储,所以对于string直接创建来说,使用StringBuffer和StringBuilder创建可以节省很多
StringBuffer:这种方法可以保证线程安全,支持并发操作,在处理效率上多线程中与StringBuilder区别不大
StringBuilder:不能保证线程安全,不支持并发操作,仅在单线程比StringBuffer有优势
![](https://i-blog.csdnimg.cn/blog_migrate/8379e566aba9d4f2edc71b8fbcb64606.png)