java中字符串的一个问题

来源:百度知道 编辑:UC知道 时间:2024/06/21 22:07:02
String str1="1";
String str2="2";
String str3=str1+str2;
String str4=str1+str2;
System.out.println(str4==str3);

final String s1="1";
final String s2="2";
String s3=s1+s2;
String s4=s1+s2;
System.out.println(s3==s4);

为什么上边是false下边是TRUE呢

用final修饰的成员变量表示常量,值一旦给定就无法改变。

String str1="1"; //str1是字符串对象的引用
String str2="2"; //同上
String str3=str1+str2; //同上
String str4=str1+str2; //同上
System.out.println(str4==str3); //他们是两个不同的对象引用,地址不一样,所以false

final String s1="1";
final String s2="2";
String s3=s1+s2;
String s4=s1+s2;
System.out.println(s3==s4);
而上面s1,s2是字符串常量 ,常量相加减也是常量 s3跟s4指向同一个常量,所以Java应该为同样的常量分配相同的地址 节省内存资源吧

可能跟定义的变量类型有关(局部或成员)

与常量final 有关! 常量相加转换string类型不能比较!

String 定义变量有两种形式
第一种:
str2="2";这样,将一个字符串常量付给String变量,这个叫字面量赋值
这种写法有个特点:例子:
String s1 = “1”;String s2 = “1”;当两个变量像这样都是赋的相同的一个常量字符串(注意是常量字符串,如果是变量的话就相当于第二种形式),当为s1分配号内存,分配s2时,发现赋的字符串常量相同,就不会在分配内存给s2,而是让s2和s1指向同一个对象(他们的引用相同),再用==比较时(==比较的是是不是同一个引用,不是比较的对象内容是不是相同),就是true;
第二种
就是new
这个不管赋的是不是同一个常量字符串,只要遇到,java就会重新分配内存

所以这里出现的是上面的情况(final关键字就是让s1和s2变成常量)

2楼说的对

二楼说得对。
再补充一