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 展开
代码: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 展开
展开全部
数组默认的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;
}
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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
==比较的引用地址 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方法内容才是一样的!
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
是不可变的,就是说,对某个字符串进行任何操作
都不能改变它的内容
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个应该是堆内存空间指向不一样
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询