1、关于Object类的equals方法的特点

a) 自反性: x.equals(x) 应该返回true

b) 对称性: x.equals(y)为true,那么y.equals(x) 也为true

c) 传递性: x.equals(y)为true,并且y.equals(z) 为true, 那么x.equals(z) 也为true

d) 一致性   x.equals(y)  第一次调用为true,那么在没有修改x和y时, 第二次,第n次调用也应该为true。

2、关于Object类的hashcode()方法

a) 在Java应用的一次执行过程中,对同一个对象的hasCode方法的多次调用,他们应该返回同样的值(前提示该对象的信息没有变化)

b)对应两个对象来说,如果使用equals方法比较返回true,那么这两个对象的hashCode值一定是相同的。

c)对于两个对象来说,如果使用equals方法比较返回false,那么这两个对象的hashCode值不一定是相同的。如果不同,可以提高应用的性能。

d) 对于Object类来说,不同的Object对象的hashCode值是不同的。(Object类的hashCode值表示对象的地址)

3、当使用HashSet的add方法时,hashCode方法就会得到调用,判断已经存储在集合中的所有对象的hash code值是否与增加的对象的hash code值一致;如果不一致,直接加进去;如果一致,再进行equals方法的比较,equals方法如果返回true,表示对象已经加进去了,就不会再增加新的对象,否则加进去。

1)demo1

public static void main(String[] args) {
HashSet set = new HashSet();
set.add(new People("Tom"));
set.add(new People("Nick"));
set.add(new People("Nick")); System.out.println(set);
}

  返回

[com.example.collectiondemo.People@7852e922, com.example.collectiondemo.People@15db9742, com.example.collectiondemo.People@6d06d69c]

2)、demo2

	public static void main(String[] args) {
HashSet set = new HashSet(); People lisi = new People("Lisi");
set.add(lisi);
set.add(lisi); System.out.println(set);
}

  返回

[com.example.collectiondemo.People@15db9742]

3)demo3

public static void main(String[] args) {
HashSet set = new HashSet();
String s1 = new String("a");
String s2 = new String("a");
set.add(s1);
set.add(s2);
System.out.println(set);
}

  返回

[a]

4、如果我们重写equals方法,那么也要重写hashCode方法,反之亦然。

5、Demo: 创建一个Student对象,如果名字一样,就不添加到Set集合中。

public class SetTest3 {

	public static void main(String[] args) {
HashSet set = new HashSet();
Student s1 = new Student("Tom");
Student s2 = new Student("Tom");
set.add(s1);
set.add(s2);
System.out.println(set); } } class Student{
String name; public Student(String name) {
this.name = name;
} @Override
public int hashCode() {
return this.name.hashCode();
} @Override
public boolean equals(Object obj) {
if(this == obj){
return true;
}
if(null != obj && obj instanceof Student){
Student s = (Student)obj;
if(name.equals(s.name)){
return true;
} }
return false;
} @Override
public String toString() {
return "Student [name=" + name + "]";
} }

  打印

[Student [name=Tom]]

Java hashCode与equals学习的更多相关文章

  1. Java hashCode() 和 equals()的若干问题

    原文:http://www.cnblogs.com/skywang12345/p/3324958.html 本章的内容主要解决下面几个问题: 1 equals() 的作用是什么? 2 equals() ...

  2. Java hashCode() 和 equals()的若干问题解答

    本章的内容主要解决下面几个问题: 1 equals() 的作用是什么? 2 equals() 与 == 的区别是什么? 3 hashCode() 的作用是什么? 4 hashCode() 和 equa ...

  3. Java hashCode 和 equals()

    1 Object中定义的hashCode() public int hashCode() Returns a hash code value for the object. This method i ...

  4. Java hashCode() 和 equals()的若干问题解答<转载自skywang12345>

    第1部分 equals() 的作用equals()的作用是用来判断两个对象是否相等.equals()定义在JDK的Object类中.通过判断两个对象的地址是否相等(即,是否是同一个对象)来区分它们是否 ...

  5. Java中的equals学习小结

    Java中的equals是十分重要的,和= =要区别开来,现在小结其主要内容,而且要将 = =和 equals列为重要的对比概念来学习 1.声明格式    public  boolean equals ...

  6. 高强度学习训练第十二天总结:Java hashCode和equals的关系

    今天要收拾东西.草草的总结下.. 1.如果两个对象相等,则hashcode一定也是相同的 2.两个对象相等,对两个对象分别调用equals方法都返回true 3.两个对象有相同的hashcode值,它 ...

  7. JAVA - hashcode与equals作用、关系

      Hashcode的作用 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set.前者集合内的元素是有序的,元素可以重复:后者元素无序,但元素不可重复.      ...

  8. java hashCode()与equals()的作用

    1.hashcode是用来查找的,如果你学过数据结构就应该知道,在查找和排序这一章有 例如内存中有这样的位置 0  1  2  3  4  5  6  7 而我有个类,这个类有个字段叫ID,我要把这个 ...

  9. Java提高篇——equals()与hashCode()方法详解

    java.lang.Object类中有两个非常重要的方法: 1 2 public boolean equals(Object obj) public int hashCode() Object类是类继 ...

随机推荐

  1. linux学习记录--比较基本的文件档案知识

    [档案类型权限,连接数,档案拥有者,档案所属群组,档案容量,修改日期,档名],对应了上面的每一列的参数属性. 档案类型权限那一部分总共有十个字母,第一个字母代表档案类型: 当为[ d ]则是目录,例如 ...

  2. 解决Centos7安装python3后pip工具无法使用

    问题描述: Centos7安装python3,正常流程全部配置完成,python3,pip3的软链接也建立了 但是python3可以正常使用,而pip3报错,无法找到文件或目录 解决方法: which ...

  3. python网络-静态Web服务器案例(29)

    一.静态Web服务器案例代码static_web_server.py # coding:utf-8 # 导入socket模块 import socket # 导入正则表达式模块 import re # ...

  4. SVM:从数学上分析为什么优化cost function会产生大距离(margin)分类器

    向量内积 uTv = vTu为两个二维向量的内积,它等于p*||u||(其中p为向量v在向量u上的投影长度,是有+/-之分的,||u||为向量u的长度也称为范数),它是一个实数(是一个标量). 如上图 ...

  5. 创建型模式(三) 抽象工厂模式(Abstract Factory)

    一.动机(Motivation) 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时,由于需求的变化,往往存在更多系列对象的创建工作. 如何应对这种变化?如何绕过常规的对象创建方法(ne ...

  6. PHP——json_encode转码保留中文

    前言 特殊的情况,特殊对待吧.转码为GBK再json_encode会报错,因为json_encode是只支持utf8的. 代码 文档 | https://www.php.net/manual/en/f ...

  7. nginx+keepalived高可用 (主从+双主)

    1.Nginx+keepalived 主从配置这种方案,使用一个vip地址,前端使用2台机器,一台做主,一台做备,但同时只有一台机器工作,另一台备份机器在主机器不出现故障的时候,永远处于浪费状态,对于 ...

  8. [唐胡璐]Selenium技巧 - 利用MonteScreenRecorder录制视频

    我们可以用以下方式在Selenium Webdriver中capture video. 基本步骤: 从 http://www.randelshofer.ch/monte/,下载“MonteScreen ...

  9. js数组的操作大全

    用 js有很久了,但都没有深究过js的数组形式.偶尔用用也就是简单的string.split(char).这段时间做的一个项目,用到数组的地方很多,自以为js高手的自己居然无从下手,一下狠心,我学!呵 ...

  10. Tensorflow细节-P54-变量

    1.首先复习前面所学知识: (1)g = tf.Graph() (2)别忘了初始化时的initializer (3)with tf.name_scope("generate_constant ...