Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用==还 是 equals()?它们有何区别?

转载:https://www.cnblogs.com/ncl-960301-success/p/7631707.html

Set 里的元素是不能重复的,元素重复与否是使用 equals()方法进行判断的。
equals()==方法决定引用值是否指向同一对象 equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

equals()和==的区别

==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存
储的数值是否相同, 要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存, 对象本身占用一块内存(堆内存),
变量也占用一块内存,例如 Objet obj = new Object();变量 obj 是一个内存,
new Object()是另一个内存,此时,变量 obj 所对应的内存中存储的数值就是对象占用的那块内存的首地址
对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
equals 方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。
例如,对于下面的代码:

String a=new String("foo");
String b=new String("foo");

 


两条 new 语句创建了两个对象,然后用 a/b 这两个变量分别指向了其中一个对象,这是两
个不同的对象,它们的首地址是不同的,即 和 中存储的数值是不相同的,所以,表达
式 a==b 将返回 false,而这两个对象中的内容是相同的,所以,表达式 a.equals(b)将返回
true
在实际开发中,我们经常要比较传递进行来的字符串内容是否等,例如, String input
;input.equals(quit),许多人稍不注意就使用==进行比较了,这是错误的,随便从网上
找几个项目实战的教学视频看看,里面就有大量这样的错误。记住,字符串的比较基本上都
是使用 equals 方法。
如果一个类没有自己定义 equals 方法,那么它将继承 Object 类的 equals 方法, Object 
的 equals 方法的实现代码如下:

boolean equals(Object o){
return this==o;
}

 


这说明,如果一个类没有自己定义 equals 方法,它默认的 equals 方法(从 Object 类继承
的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用
equals 和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回 false。如果你
编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖 equals
方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的

由上述可见:

总结如下:

==:

  基本类型:比较的是值是否相同

  引用类型:比较的是地址值是否相同

equals():

  引用类型:默认情况下,比较的是地址值,可进行重写,比较的是对象的成员变量值是否相同

 

虽然网上很多文章都说是== 或者equals() 决定set中的元素是否是相同的,如果set 一个student对象,再次set一个student对象也是可以的,判断set的对象是否相同,取决于student对象是否重写了equals和hashcode方法,如果两者相同就是相同对象,不同就是不同对象,另外,string默认已经重写了equals方法。

1.当向集合Set中增加对象时,首先集合计算要增加对象的hashCode码,根据该值来得到 一个位置用来存放当前对象。

如果在该位置没有一个对象存在的话,那么集合Set认为该对象在集合中不存在,直接 增加进去。 如果在该位置有一个对象存在的话,接着将准备增加到集合中的对象与该位置上的对象 进行equals方法比较。

如果该equals方法返回false,那么集合认为集合中不存在该对象,再进行一次散列, 将该对象放到散列后计算出来的地址中。

如果equals方法返回true,那么集合认为集合中已经存在该对象了,不再将该对象增加到集合中。

2 重写equals方法的时候必须重写hashCode方法。如果一个类的两个对象,使用equals 方法比较时,结果为true,那么这两个对象具有相同的hashCode。原因是equals方法为true,表明是同一个对象,它们的hashCode当然相同。(Object类的equals方法比较的是地址)

3 Object类的hashCode方法返回的是Object对象的内存地址。我们可以通过Integer.toHexString(newObject().hashCode());来得到。 Java里面的hashSet中,如何判断两个对象是否相等? a. 判断两个对象的hashCode是否相等。 如果不相等,认为两个对象不相等。反之 如果相等,见上面 2 的解释

        b. 判断两个对象是否equals 如果不相等,认为两个对象不相等。 如果相等,认为两个对象相等。

 

posted @ 2018-11-20 22:51  爱睡觉的Koala  阅读(1389)  评论(0编辑  收藏  举报