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

publicclassTestC{/***<String,String[]>*/publicstaticvoidmain(String[]args){String[]c=... 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
展开
 我来答
epdc147
2013-11-19 · TA获得超过488个赞
知道小有建树答主
回答量:492
采纳率:0%
帮助的人:328万
展开全部

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


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


开始是

然后就是


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

    开始

然后

严肃的甲道士
2013-11-19 · 传播技术传播爱,笔芯❤️
严肃的甲道士
采纳数:337 获赞数:619

向TA提问 私信TA
展开全部
1、数组跟基本类型变量不一样,创建数组的时候必须声明长度大小,或者直接实例化,然后由JVM创建一个对象类来构造数组,所以这里的传递具有联动性,因为是指向同一个内存地址,改变的同一个内存中的值
2、String这个是在内存中创建了两块内存块,值都是一样的,这里是两块内存就是两个不同的对象,修改一个不会影响另一个的(参考:The JavaTM Virtual Machine Specification Second Edition)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
依土天羽
2013-11-19 · TA获得超过289个赞
知道小有建树答主
回答量:337
采纳率:100%
帮助的人:400万
展开全部

因为在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里面的指针的概念是一样的。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
欲成龙成仙2
2013-11-19
知道答主
回答量:41
采纳率:0%
帮助的人:12.6万
展开全部
下边的用equal比较
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友b92e89e
2013-11-19
知道答主
回答量:68
采纳率:0%
帮助的人:10.8万
展开全部
不明白你想问什么地方不同
追问
g,h是String类的,但改变g值,h值不变;而c,d为数组,改变c,d也变了。(同为引用类型,照常理前者h也应该随着g变),这是为什么?——大神求解!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式