-------android培训、java培训、期待与您交流! ----------
字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。例如:
String str = "abc";
等效于:
char data[] = {'a', 'b', 'c'}; String str = new String(data);
String类型是将所有相同的字符串常量的引用地址指向同一个,不会为多个变量重新在内存中重新生成一个字符串常量。如果想要对字符串进行改变,java会在新的内存地址重新申请内存,将新的字符串写入。
但如果重新构造一个String对象,则重新申请内存,而不是共享。
而字符串比较中,“==”比的是内存地址,“equals”比较的是内容,就是真正的字符串值
public class StringDemo {
public static void main(String[] args) {
String str1 = "zhongguo";
String str2 = "zhongguo";
String str3 = new String("zhongguo");
String str4 = new String("zhongguo");
System.out.println("str1 == str2 :" + (str1 == str2));
System.out.println("str1 == str3 :" + (str1 == str3));
System.out.println("str3 == str4 :" + (str3 == str4));
System.out.println("str1.equals(str2) :" + str1.equals(str2));
System.out.println("str1.equals(str3) :" + str1.equals(str3));
System.out.println("str3.equals(str4) :" + str3.equals(str4));
}
}
<pre name="code" class="java">结果:
str1 == str2 :true
str1 == str3 :false
str3 == str4 :false
str1.equals(str2) :true
str1.equals(str3) :true
str3.equals(str4) :true
根据结果可知,str1与str2是相等的,因为String类型的“==”比较的是地址,也就是说他们引用的是同一个地址;
而常量str1与对象str3不等,对象str3与对象str4不等,说明他们引用的地址不同。由此可以证明,构造的对象是新开辟的内存空间来存储字符串的;
最后三个结果是相等的,因为equals比较的是内容,因为都是内容一样的,所以结果为true。
对于字符串常量连接,其实并不是在原来的基础上进行修改,而是新开辟内存(当然如果修改后的字符串,已经在内存中重新生成,则指向这个内存空间),如下:
“I am Tom"与”修改后“I am Tom"+".I am a boy"的引用地址是不同的。