java中,两个String类型的字符串相加得到一个新的字符串,请问原来的字符串是否改变,为什么?

Python013

java中,两个String类型的字符串相加得到一个新的字符串,请问原来的字符串是否改变,为什么?,第1张

java中 有String 和StringBUffer

String 长度不可变

StringBuffer长度可变

String相加 原来的不变

可变不可变的意思是说

你新建一个String型的 你第一次使用呢 他就给你分配那么长的内存堆栈 不可变长度的

你要给他重新赋值了呢 他是重新开辟了一块内存空间指针指向他

原来的内存空间 会被gc() 垃圾回收掉 这样消耗系统内存

而stringBuffer呢开辟出来了 长度可变了 你重新赋值了之后还是指向那块内存 只不过长度变了

首先你要搞清楚的是字符串用==比较,是比较两个字符串是不是指向同一个对象

程序在运行的时候会创建一个字符串缓冲池,程序会把字符串常量(如程序中的"a","b","ab","a"+"b")放入字符串缓冲池中(这里"ab","a"+"b"是一个对象)。当使用

String s3 = "ab"

String s4 = s1 + s2

String s5 = "a" + "b"

这样的表达是创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象,s3先被放到了池中,所以在s5被创建的时候,程序找到了具有相同值的 s3,将s5引用s3所引用的对象"ab"。所以比较s5==s3由于两个是指向同一个对象,所以为true。

但是在这些赋值中,涉及到变量运算,所以得到的字符串对象存储在各自的内存中,不是缓冲池中的s3对象,如

String s4 = s1 + s2

String s6 = s1 + "b"

所以 尽管s4,s6的值均为"ab",但是 s4==s3,s6==s3返回的结果均为false

同时s4,s6也不是指向相同的对象,因为他们在不同内存中。

StringBuffer s7 = new StringBuffer("abc")

String s8 = s7.substring(3) //这个方法是从第3个字符取字符串,得到的s8为"'为空字符串。

所以s8==s3的结果也为false

如果相比较两个字符串的值是不是相等,最好用.equals()方法。