关于String的等于号赋值

来源:百度知道 编辑:UC知道 时间:2024/06/07 16:33:31
代码 1:
String s1="s1";
String s2="s1";
这时s1==s2;
代码 2:
String s1="s1";
String s2="s1";
s1="s2"
这时s1!=s2;
代码 3:
String s1="s1";
String s2=s1;
这时s1==s2;
代码 3:
String s1="s1";
String s2=s1;
s1="s2"
这时s1!=s2;

以上几个例子 感觉String里的=号似乎有些奇特 还有字符串也很不一般
行 1 s1="s1";
行 2 s1="s2";
是不是可以这样理解 当执行了行2的代码后s1本身对象已经发生变化 已经不再是之前s1了 而不是只是值改变了 假设可以比较的话 是不是可以理解成先前的s1已经不等于之后s1了? ···
那是不是可以这样理解
s1="s1" 分解成
先判断有没有"s1"对象存在 如果没有 new一个 如果有则让s1指向他
所以s1="s1"并没有为s1创建对象 而是为"s1"创建了对象且只能创建唯一的对象 然后让他s1指向了他

你的理解只能基于同一个JVM,如果是不同的JVM下同样的String对象,确是不等的,因为他们的堆内存地址不同
String对象比较特殊,他在JVM堆内存中占据一个共享的内存池,JVM对String对象做多例池化管理,已提高性能,所以你在同一个JVM下建立两个"s1"对象,只在池中产生一个内存占用,也就是只产生了一个共享的对象,当s1="s2"时,JVM判断池中没有这个对象,就又产生了S2对象的内存占用
看了老半天还是来个例子吧,比如你先将String s1 = "s1";序列化到文件中,运行main方法
String s1="s1";
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("D:/test.txt")));
oos.writeObject(s1);
让后在反序列化回来,再次运行main方法,这样就早就了一个不同的JVM环境,现在就不等了:
String s2="s1";
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("D:/test.txt")));
String s1 = (String)ois.readObject();
System.out.println(s1);
System.out.println(s1 == s2);

String a=1,String a=new("1")

首先,毫无疑问,这两者是有区别的,如:
String a="1";
String b="1";
System.out.println(a==b);//打印true



String a = new String(&