码迷,mamicode.com
首页 > 其他好文 > 详细

实习第二天-String对象的不可变性-未解决

时间:2017-03-24 22:55:53      阅读:279      评论:0      收藏:0      [点我收藏+]

标签:技术   bar   赋值   自己   内存   span   new   地址   string   

public class Reverse {
    public static void main(String[] args)
    {
        String c1=new String("abc");
        String c2=new String("abc");
        String c3=c1;
        System.out.println("c1==c2:"+  (c1==c2));  //c1==c2:false   
第一个输出语句c1==c2很好理解,因为c1和c2都是用new 创建的对象的引用,虽然对象的值相同,但两个对象在不同的内存空间
虽然对象的值相同,但两个对象在不同的内存空间,也就是说c1和c2是对两个不同的对象的引用,
第二个输出语句c1.equals(c2)是调用了String类的equals方法,该方法用于比较两个字符串对象的值是否相等,所以结果为true。
System.out.println("c1.equals(c2):"+c1.equals(c2));//c1.equals(c2):true System.out.println("c3==c1:"+(c3==c1));//c3==c1:true System.out.println("c1.equals(c3):"+c1.equals(c3));//c1.equals(c3):true
      System.out.println(""+(c3==c1));//结果是true c1="han"; System.out.println(c1+" "+c3);// han   abc System.out.println(""+(c3==c1)); //false } }

技术分享技术分享

对于c3==c1为true是因为将c1赋值给了c3 也就是将c1对象的引用赋值给了c3

c1和c3的值都是对象abc的地址

 

String c1=new String("abc");
String c2=new String("abc");
String c3=c1;//
 c1="han";
System.out.println(c1+" "+c3);// han abc
System.out.println(""+(c3==c1)); //false

对于System.out.println(c1+"   "+c3),这个输出语句有人会问既然c1和c3引用的是同一个对象,为什么改变c1的值c3的值并不会改变呢?

这就涉及到了Java中String对象的不可变性,什么叫不可变性呢,简单的说就是一旦一个String对象被创建并被赋值(初始化)这个对象的值就不会变化。

一旦一个String对象在内存中创建,它将是不可改变的,所有的String类中方法并不是改变String对象自己,而是重新创建一个新的String对象。

也就是说c1=han,并不是改变了原有对象的值,而是创建了一个新的字符串对象,这个对象的值是han,并把这个对象的引用赋值给了c1。

技术分享

 技术分享

 这幅图意思是:s以前的值google没有被runoob覆盖

技术分享

实习第二天-String对象的不可变性-未解决

标签:技术   bar   赋值   自己   内存   span   new   地址   string   

原文地址:http://www.cnblogs.com/cs-lcy/p/6613725.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!