String类中Equals方法和Object类中的Equals方法有啥不同?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了String类中Equals方法和Object类中的Equals方法有啥不同?相关的知识,希望对你有一定的参考价值。
参考技术A 没什么不同。。。所有类都是object的子类。。。。String的equals是重写的父类的 参考技术B 在Java中,每一个对象都有一个地址空间,在这空间保存着这个对象的值。equals
比较的是值,==比较的地址以及值。
用下面的例子来说明。
String
str1
=
"aaa";
String
str2
=
"aaa";
String
str3
=
new
String("aaa");
str1与str2使用的是同一地址空间,因为String使用的是对象池,对象池概念你再去百度一下。
而str3是new出来的,就相当于开辟了新的空间,地址也就跟str1,str2不一样的。
所以,下面输出的结果为:
System.out.println(str1.equals(str2));
--true,地址一样,值也一样
System.out.println(str1.equals(str3);
--true,地址不一样,但是值一样
System.out.println(str1
==
str2);
--true,地址一样,值也一样
System.out.println(str1
==
str3);
--false,地址不一样,值一样,还是false 参考技术C 在比较两个String对象的内容是否相同时是使用equals方法的
如:String
str1=new
String(“A”);
String
str2=new
String(“B”);
String
str3=new
String(“B”);
boolean
result1=
str1.equals(str2);
boolean
result2=
str1.equals(str3);
System.out.println(result1);
System.out.println(result2);
则输入的result1为false,result2为true。因为str1与str2的内容不相同,而str2与stR3内容相同都是“B”。
而在String类中使用“==”时,比较的是两个String对象的引用是否指向同一个对象,如
String
str4=new
String(“B”);
String
str5=new
String(“B”);
String
str6=str5;
boolean
result3=(str4==str5);
boolean
result4=
(str5==str6);
System.out.println(result3);
System.out.println(result4);
则输入的result3为false,result4为true。因为str4、str5虽然内容相同但它们是不同的对象,就像两个同样的杯子装着同样多的水,可它们是不同的,result3为false。而str5、str6是指向同一个String对象的,所以result4为true。
再说明一点,String
str
=
new
String("abc")和String
str
="abc"是有一点小区别的,对于new出来的String对象,是每new一个内存里生成一个,也就是说其允许存在内容相同的重复对象。而String
str
="abc"这种形式是不允许存在内容相同的重复对象,只要内存已经存在了,就不再新生成,而是把新的引用指向原来的对象。 参考技术D 在比较两个String对象的内容是否相同时是使用equals方法的
如:String str1=new String(“A”);
String str2=new String(“B”);
String str3=new String(“B”);
boolean result1= str1.equals(str2);
boolean result2= str1.equals(str3);
System.out.println(result1);
System.out.println(result2);
则输入的result1为false,result2为true。因为str1与str2的内容不相同,而str2与stR3内容相同都是“B”。
而在String类中使用“==”时,比较的是两个String对象的引用是否指向同一个对象,如
String str4=new String(“B”);
String str5=new String(“B”);
String str6=str5;
boolean result3=(str4==str5);
boolean result4= (str5==str6);
System.out.println(result3);
System.out.println(result4);
则输入的result3为false,result4为true。因为str4、str5虽然内容相同但它们是不同的对象,就像两个同样的杯子装着同样多的水,可它们是不同的,result3为false。而str5、str6是指向同一个String对象的,所以result4为true。
再说明一点,String str = new String("abc")和String str ="abc"是有一点小区别的,对于new出来的String对象,是每new一个内存里生成一个,也就是说其允许存在内容相同的重复对象。而String str ="abc"这种形式是不允许存在内容相同的重复对象,只要内存已经存在了,就不再新生成,而是把新的引用指向原来的对象。
字符串类中的Object的equals方法和自定义类中的Object的equal方法之间有什么区别
我无法理解String类中equals
方法的行为(区分),然后在自定义类中手动覆盖equals
方法。
根据java,如果我们希望两个对象相等,那么我们应该重写equals
方法以检查它们之间的相等性。因此,我制作了一个Dog
类并在该类中重写equals方法。为了进一步检查对象之间的相等性,我使用了Set
类型集合,因为它不允许重复。但是我很困惑看到输出。这是我的代码:
import java.util.*;
class Dog
int type;
public int getType()
return type;
public void setType(int type)
this.type = type;
public boolean equals(Object o)
if((o instanceof Dog) && ((Dog)o).getType()==this.getType())
return true;
else
return false;
public class CheckEquality
public static void main(String[] args)
Dog d1=new Dog();
Dog d2=new Dog();
d1.setType(12);
d2.setType(12);
Set set=new HashSet();
if(set.add(d1))
System.out.println("d1 added");
if(set.add(d2))
System.out.println("d2 added");
String s1=new String("ad");
String s2=new String("ad");
//String s1="ad";
//String s2="ad";
Set set2=new HashSet();
if(set2.add(s1))
System.out.println("s1 added");
if(set2.add(s2))
System.out.println("s2 added");
输出:
d1 added
d2 added
s1 added
我期望的是:
d1 added
s1 added
谁能告诉我为什么得到d2 addedd
语句,当可以看到具有相同type
的对象已经被添加到Set
时。
相反,String不允许语句s2 added
。为什么会这样呢?任何人都可以消除我的疑虑。
您缺少hashCode方法。
[此哈希值在存储或处理 实例–这些值旨在均匀分布以进行变化 输入以便在聚类中使用。此属性对 哈希表和其他存储的数据结构的性能 组中的对象(“存储桶”)基于其计算的哈希值
您可以使用Objects类生成哈希码。
public class Dog
@Override
public int hashCode()
return Objects.hash(type);
因为还必须覆盖hashCode
。检查Object#equals
的合同:
[注意,通常必须重写hashCode方法,以保持hashCode方法的常规约定,该约定规定相等的对象必须具有相等的哈希码。
将此添加到您的Object#equals
类:
Dog
这只是一个基本示例。如果public class Dog
@Override
public int hashCode()
return this.type;
是type
字段会更好。从final
:
[只要在Java应用程序执行期间在同一对象上多次调用它,则
Object#hashCode
方法必须一致地返回相同整数,前提是未修改该对象的相等比较中使用的信息。从一个应用程序的执行到同一应用程序的另一执行,此整数不必保持一致。
Object#hashCode
实现hashCode
期望通过使用Set
查找值。您的对象没有提供良好的hashCode,而是使用了HashSet中的版本。当实现等于时,通常还应该始终实现hashCode。这只是一个最佳实践。
在Java 8中,您可以使用以下代码来提供良好而有效的哈希值:
Object
如果使用正确,hashCode
将按预期工作。对于简单的Objects.hash(value1, value2, value3);
类,可以返回HashSet
,但对于包含更多属性的更复杂的对象,建议使用Dog
或类似属性。
如果不重写哈希码方法,则在将对象存储在哈希集中时会出现冲突问题。哈希集在内部使用哈希表来键和值对。
因为您必须重写哈希码,以便哈希集找到相同的哈希码,然后它将在内部调用equals方法。
type
以上是关于String类中Equals方法和Object类中的Equals方法有啥不同?的主要内容,如果未能解决你的问题,请参考以下文章