下面这个例子输出结果为:
AB@AB
AB
B
我想问下,在test方法中,s2=s1,此时s2他s1的值是相等的。s1.append(s2),s1的值变了,但是s1引用没变。等test方法结束后,内存中的堆栈是怎么变化的?谢谢了?
package com.expert58.practice;public class PracticeDemo2 { public static void main(String[] args) { StringBuilder s1 = new StringBuilder("A"); StringBuilder s2 = new StringBuilder("B"); test(s1, s2);

System.out.println(s1);
System.out.println(s2); //System.out.print(s1 + "~" + s2); } private static void test(StringBuilder s1, StringBuilder s2) { s1.append(s2); s2 = s1; System.out.println(s1 + "@" + s2); }}

解决方案 »

  1.   


    坐等大牛解释
    public class PracticeDemo2 {
    private static void test(StringBuilder s1, StringBuilder s2) {
    s1.append(s2);
    System.out.println(s1.hashCode());//hashcode=12677476
    System.out.println(s2.hashCode());//hashcode=33263331
    s2 = s1;
    System.out.println(s2.hashCode());//hashcode=12677476
    System.out.println(s2);//AB
    }
    public static void main(String[] args) {
    StringBuilder s1 = new StringBuilder("A");
    System.out.println(s1.hashCode());//hashcode=12677476
    StringBuilder s2 = new StringBuilder("B");
    System.out.println(s2.hashCode());//hashcode=33263331
    test(s1, s2);
    System.out.println(s1);//AB
    System.out.println(s2.hashCode());//hashcode=33263331
    System.out.print(s2);//B
    System.out.print(s1 + "@" + s2);//AB@B
    }
    }
      

  2.   

    package com.expert58.practice;public class PracticeDemo2 {public static void main(String[] args) {StringBuilder s1 = new StringBuilder("A");StringBuilder s2 = new StringBuilder("B");test(s1, s2);System.out.println(s1);
    System.out.println(s2); //System.out.print(s1 + "~" + s2);}private static void test(StringBuilder s1, StringBuilder s2) {s1.append(s2); //这里的s1不是main的s1,只是指向了和main的s1指向相同的对象s2 = s1; //这里的s2也不是main的s2,所以这里是改变test方法的s2的指向,不影响main的s2指向System.out.println(s1 + "@" + s2);}}就打个比方,我和你一起浏览这个页面,你的回复我能看到,我的回复你也能看到,因为我们浏览的是相同的页面,但不等于你就是我,而此时,如果你链接到别的页面去了,也就相当于test里的s2 = s1; test的s2链接到别处了,但main的s2没有动,此时你觉得我看到的页面会跟你一样吗?