java String与数组同为引用类型 但为何有如下区别?(初学者,求大神)

public class TestC {

/**
* <String, String[]>
*/
public static void main(String[] args) {

String[] c = {"1", "2", "3"};
String[] d = c;
if (c == d) {
System.out.println("c,d同");
} else {
System.out.println("c,d不同");
}
c[1] = "3";
System.out.print("c:");
for (int i = 0; i < c.length; i++) {
System.out.print(c[i]);
}
System.out.println();
System.out.print("d:");
for (int i = 0; i < d.length; i++) {
System.out.print(d[i]);
}
System.out.println();
String g = "abc";
String h = g;
if (g == h) {
System.out.println("g,h同");
} else {
System.out.println("g,h不同");
}
g = "cd";
System.out.println("g:" + g);
System.out.println("h:" + h);
String i = "asd";
String k = "asd";
}

}
结果:
c,d同
c:133
d:133
g,h同
g:cd
h:abc

String[] c = {"1", "2", "3"};
String[] d = c;


它们都是数组, 数组元素是引用类型,  那么数组元素里面放的是引用,   通过引用来指向一块内存,   c 和  d  是指向同一个数组  还有就String 类型的字符串不可改变,   如果改变另外创建一个对象


开始是

然后就是


String g = "abc";
String h = g;

    开始

然后

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-11-19
1、数组跟基本类型变量不一样,创建数组的时候必须声明长度大小,或者直接实例化,然后由JVM创建一个对象类来构造数组,所以这里的传递具有联动性,因为是指向同一个内存地址,改变的同一个内存中的值
2、String这个是在内存中创建了两块内存块,值都是一样的,这里是两块内存就是两个不同的对象,修改一个不会影响另一个的(参考:The JavaTM Virtual Machine Specification Second Edition)
第2个回答  2013-11-19

因为在java中String是不可变类型,每一次赋值都会产生一个新的字符串(不考虑字符串堆栈),所以,你的g和h一开始都是指向"abc"这个字符串的引用,你重新给g赋值的时候,g指向了"cd"这个字符串,但是h依然是指向“abc”的,所以会出现最后的结果,但是数组是可变对象,而且,你的程序也并没有给数组重新赋值,只是改变了数组内容,所以,指向数组的两个引用内容是一样的,你将程序稍微做个调整,就会的到不一样的结果

    public static void main(String[] args) {

        String[] c = { "1", "2", "3" };
        String[] d = c;
        if (c == d) {
            System.out.println("c,d同");
        } else {
            System.out.println("c,d不同");
        }
        c = new String[] { "4", "5", "6" }; // 在这里给数组C重新赋值,而不是改变内容
        System.out.print("c:");
        for (int i = 0; i < c.length; i++) {
            System.out.print(c[i]);
        }
        System.out.println();
        System.out.print("d:");
        for (int i = 0; i < d.length; i++) {
            System.out.print(d[i]);
        }

        System.out.println();
        String g = "abc";
        String h = g;
        if (g == h) {
            System.out.println("g,h同");
        } else {
            System.out.println("g,h不同");
        }
        g = "cd";
        System.out.println("g:" + g);
        System.out.println("h:" + h);
    }

这和c里面的指针的概念是一样的。

第3个回答  2013-11-19
下边的用equal比较
第4个回答  2013-11-19
不明白你想问什么地方不同追问

g,h是String类的,但改变g值,h值不变;而c,d为数组,改变c,d也变了。(同为引用类型,照常理前者h也应该随着g变),这是为什么?——大神求解!

相似回答