• 中文
    • English
  • 注册
  • 查看作者
  • 《算法第四版》课后练习题1.2.4答案

    习题1.2.4

    以下这段代码会打印出什么?

    String string1 = "hello";
    String string2 = string1;
    string1 = "world";
    StdOut.println(string1);
    StdOut.println(string2);

    要点分析

    首先我们做一个测试类:

    import edu.princeton.cs.algs4.StdOut;
    
    /**
     * @description:
     * @author: ZhangJia
     * @create: 2018-08-07 14:36a
     **/
    public class Four {
        public static void main(String[] args) {
            String string1 = "hello";
            String string2 = string1;
            string1 = "world";
            StdOut.println(string1);
            StdOut.println(string2);
        }
    }
    
    输出:
    world
    hello

    可能看到这里大家会有疑惑,String不是基本的数据类型,那么为什么修改了string1的值,string2的值却没有收到影响呢?

    其实这里涉及到Java中的String的特性问题。

    在Java中,String对象是不可变的,查看JDk文档你就会发现,String类的每一个看起来会修改String类值的方法,实际上都是创建了一个全新的对象,用以包含修改后的字符串内容[1] 。我们可以输入string1和strng2的hashcode来证实这一说法。

    import edu.princeton.cs.algs4.StdOut;
    
    /**
     * @description:
     * @author: ZhangJia
     * @create: 2018-08-07 14:36a
     **/
    public class Four {
        public static void main(String[] args) {
            String string1 = "hello";
            String string2 = string1;
            System.out.println("string1的hashcode:" + string1.hashCode());
            System.out.println("string2的hashcode:" + string2.hashCode());
            string1 = "world";
            StdOut.println(string1);
            StdOut.println(string2);
            System.out.println("string1的hashcode:" + string1.hashCode());
            System.out.println("string2的hashcode:" + string2.hashCode());
        }
    }
    
    输出:
    string1的hashcode:99162322
    string2的hashcode:99162322
    world
    hello
    string1的hashcode:113318802
    string2的hashcode:99162322

    可以看到,在修改了string1的值后,可以看到,string1的hashcode值已经改变,而string2的保持不变。

    参考答案

    world

    hello

    参考资料

    [1] Java编程思想

  • 0
  • 0
  • 0
  • 2.3k
  • 请登录之后再进行评论

    登录
    单栏布局 侧栏位置: