Java 中初始化两个数组,值一样,为什么equals 会是false??

我不明白.还有就是说String是特殊的引用类型,对比基本类型和一般引用类型,其特殊具体表现在哪?final,数组不也是一旦定义长度,不可更改吗?代码:publicsta... 我不明白.还有就是说String是特殊的引用类型,对比基本类型和一般引用类型,其特殊具体表现在哪?final,数组不也是一旦定义长度,不可更改吗?
代码:public static void main(String[] args) {

String a = "abc";
String b = "abc";
String c = new String("abc");
String d = new String ("abc");
int []a1 = {1,2,3};
int []b1 = {1,2,3};

System.out.println(a==b);
System.out.println(a==c);
System.out.println(c==d);
System.out.println(c.equals(d));
System.out.println(a1==b1);
System.out.println(a1.equals(b1));

}
true
false
false
true
false
false
展开
 我来答
尺蠖丨蚩
2020-11-20 · TA获得超过303个赞
知道答主
回答量:68
采纳率:75%
帮助的人:5.6万
展开全部
数组默认的equals方法直接比较对象:
public boolean equals(Object obj) {
return (this == obj);
}
String先直接比较若不是,则判断是否同一类型,若是则判断内容是否一致.
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
安永贞4J
2016-06-16 · 超过13用户采纳过TA的回答
知道答主
回答量:78
采纳率:0%
帮助的人:22.4万
展开全部
==比较的引用地址 equals比较的内容
System.out.println(a==b); 同一个对象所以相等
System.out.println(a==c); 不同对象,内存地址肯定不一样
System.out.println(c==d);不同对象,内存地址肯定不一样
System.out.println(c.equals(d));内容一样,所以true
System.out.println(a1==b1);不同对象
System.out.println(a1.equals(b1));因为是引用类型,要重写equals方法内容才是一样的!
更多追问追答
追问
那么,String 的特殊之处表现在色盲地方?
追答
java
里面,
String
是最特殊的一个类。说它是基本类型,它又不是,说它不是
基本类型,又和基本类型很

像,如果不搞清楚,很容易出现一些问题。下面我们来分析它的一些特点。

我们知道,
String

int
等基本类型一样,可以不用
new
关键字来对它进行赋
值,如:

String s1="abc";
String s2="abc";
下面来了一个问题,问:由以上创建的
s2

s2,s1==s2

true
还是
false


可能你一不小心就答
false
了,但是经过你的测试,它是返回
true
的。

再一个问题:

String s1="abc";
String s2="abc";
以下表达式中得到的结果是什么?

1

s1+s2=="abcabc"
2

s1+"abc"=="abcabc"
3

s1=="ab"+"c";
4

"abc"+"abc"=="abcabc"
你可以自己测试一下,答案是:

1

false
2

false
3

true
4

true
这是为什么呢?

这就要从内存说起了。
java
的基本数据类型只在栈内存中操作,
其中包括
char


String,
我们知道,字

符串其实是由字符数组变换而来的,
所以
String
实际上就是一组
char
串。
为了
使用的方便,
java

String
设计成可以由栈内存中存储字符串对它进行赋值。
由于栈内存中的内容是唯一的,
所以当
s2
被赋成
"abc"
时,
并没有新创建一个字符串;
两个无引用的字符串进行加法操作,
它是在栈中
进行的,即把它当作基本

数据类型来对待,所以第
3
和第
4
个表达式是
true
。但是两个字符串进行加法
操作时,有一个为有引用的类

型时,它们的加法操作将被放到堆中进行。这就是为什么
1

2
两个表达式为
false
了。

(关于栈内存和堆内存的内容可以到网上查找,这里不再说明。)

另外还要注意的是,
String
是不可变的,就是说,对某个字符串进行任何操作
都不能改变它的内容
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
旺猛岛1
2016-06-16
知道答主
回答量:31
采纳率:0%
帮助的人:10.1万
展开全部
这个应该是堆内存空间指向不一样
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 3条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式