zoukankan      html  css  js  c++  java
  • 实习第二天-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覆盖

    复制代码
  • 相关阅读:
    IntelliJ IDEA 14.03 java 中文文本处理中的编码格式设置
    应聘感悟
    STL string分析
    CUDA SDK VolumeRender 分析 (1)
    BSP
    CUDA SDK VolumeRender 分析 (3)
    CUDA SDK VolumeRender 分析 (2)
    Windows软件发布时遇到的一些问题
    Ten Commandments of Egoless Programming (转载)
    复习下光照知识
  • 原文地址:https://www.cnblogs.com/cs-lcy/p/6613725.html
Copyright © 2011-2022 走看看