equals和HashCode都是用来去重的,即判断两个对象是否相等。如果是String类则我们直接用.equals()判断,如果是我们自己定义的类,需要有自己的判断方法,重写equals,如果是集合(HashSet、HashMap)判断加入的元素是否为重复,并且加入的元素是我们自己定义的类,这时用重写equals和HashCode两个一起判断:插入的元素是否相等(HashSet中),插入的key是否相同(HashMap中)。

设计一个标准的实体类四大原则:

1、封装:属性私有化,提供get/set方法等;

2、提供无参构造;

3、重写toString()、HashCode()、equals()这三个方法,(继承自根Object,不必须都重写按自己的需求定);

4、实现序列化接口(implements Serializable),这样类的对象可以经过二进制数据流进行传输。

例如:


  1. class Person2 implements Serializable{
  2. private static final long serialVersionUID = 1L;
  3. private String name;
  4. private int age;
  5. public Person2(){}
  6. public Person2(String name, int age){
  7. this.name = name;
  8. this.age = age;
  9. }
  10. // 重写equals,定义同一类型,并且属性name和age全部相等则实例对象相等
  11. public boolean equals(Object obj){
  12. if(this == obj){
  13. return true;
  14. }
  15. if(!(obj instanceof Person2)){
  16. return false;
  17. }
  18. Person2 p = (Person2) obj;
  19. if(this.name.equals(p.name)&&this.age == p.age){
  20. return true;
  21. }else{
  22. return false;
  23. }
  24. }
  25. // 重写HashCode将对象的某些信息映射成一个数值---散列值
  26. public int hashCode(){
  27. return this.name.hashCode()*this.age;
  28. }
  29. // 重写toString打印自己想要的格式,如果不重写默认直接继承Object类的toString 方法是获取对象在内存中的值可能会乱码
  30. public String toString(){
  31. return "姓名:"+this.name+";年龄:"+this.age;
  32. }
  33. }

1、首先说一下,什么情况下要重写toString,object类里的toString只是把字符串的直接打印,数字的要转化成字符再打印,而对象,则直接打印该对象的hash码。所以当你要想按照你想要的格式去字符串一些对象的时候,就需要重写toString了。比如一个Student对象,直接toString肯定是一个hash码。然而你想得到的比如是:name:***,age:***。这时就重写toString就是在toString里写:System.out.println(“name:”+student.getName);System.out.println(“age:”+student.getAge)。这样再toString就直接反回你想要的格式。通过查api我们就可以知道HashSet的toString是把s的值格式化成[*,
* ,*],就是给s的加个中括号,而且用逗号分开。而HashMap的toString是把m的值格式化成{key1=value1,key2=value2,key3=value3}所以你打印出来的是那样的格式,这就是重写toString的作用

equals和HashCode都是用来鉴定两个对象是否相等的。

2、一般来讲,equals是给用户调用的,如果你想判断两个实例对象是否相等,可以在自己定义的类中重写equals方法,然后在代码中调用这个方法就可以判断是否相等了。

简单的说,equals就是从表面和自己定义的规范内容上看两个对象是否相等。

举个例子,有个学生类,属性只有姓名和性别,那么我们可以认为只要姓名和性别相等,那么就说这2个对象是相等的。

3、HashCode的方法只有在散列集合中用到,这样的散列集合包括HashSet、HashMap以及HashTable。

例如在集合存储中,判断并不再插入重复的元素,也许大多数人都会想到调用equals方法来逐个进行比较,这个方法确实可行。但是如果集合中已经存在一万条数据或者更多的数据,如果采用equals方法去逐一比较,效率必然是一个问题。此时hashCode方法的作用就体现出来了。

当集合要添加新的对象时,先调用这个对象的hashCode方法,得到对应的hashcode值,实际上在HashMap的具体实现中会用一个table保存已经存进去的对象的hashcode值,如果table中没有该hashcode值,它就可以直接存进去,不用再进行任何比较了;如果存在该hashcode值,
就调用它的equals方法(可是被重写的)与新元素进行比较,相同的话就不存了,不相同就散列其它的地址,所以这里存在一个冲突解决的问题,这样一来实际调用equals方法的次数就大大降低了,说通俗一点:Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值

将元素放在集合中的流程:

equals、HashCode与实体类的设计的更多相关文章

  1. Rookey.Frame之实体类

    上周跟大家分享了Rookey.Frame框架的初始化功能,今天继续给大家介绍实体类的设计. 先看下下面菜单实体示例代码: using Rookey.Frame.EntityBase; using Ro ...

  2. Java课程设计---项目数据库设计(含实体类)

    1.表设计 (1)新建表tb_student(学生表) (2)新建表tb_admin(管理员表) (3)新建表tb_teacher(教师表) (4)新建表tb_course(课程表) (5)新建表tb ...

  3. Hibernate框架学习之注解映射实体类

         前面的相关文章中,我们已经介绍了使用XML配置文件映射实体类及其各种类型的属性的相关知识.然而不论是时代的潮流还是臃肿繁杂的配置代码告诉我们,注解配置才是更人性化的设计,于是学习了基本的映射 ...

  4. Java中entity(实体类)的写法规范

    在日常的Java项目开发中,entity(实体类)是必不可少的,它们一般都有很多的属性,并有相应的setter和getter方法.entity(实体类)的作用一般是和数据表做映射.所以快速写出规范的e ...

  5. YbSoftwareFactory 代码生成插件【十九】:实体类配合数据库表字段进行属性扩展的小技巧

    实体类通常需要和数据库表进行了ORM映射,当你需要添加新的属性时,往往同时也需要在数据库中添加相应的字段并配置好映射关系,同时可能还需对数据访问组件进行重新编译和部署才能有效.而当你开始设计一个通用数 ...

  6. Java List实体类去重

    版权声明:本文为博主原创文章,未经博主允许不得转载. List特点:元素有放入顺序,元素可重复 Map特点:元素按键值对存储,无放入顺序 Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入 ...

  7. JPA实体类注解、springboot测试类、lombok的使用

    前提准备: 搭建一个springboot项目,详情请参见其它博客:点击前往 1 引入相关依赖 web.mysql.jpa.lombok <?xml version="1.0" ...

  8. MP实战系列(三)之实体类讲解

    首先说一句,mybatis plus实在太好用了! mybaits plus的实体类: 以我博客的用户类作为讲解 package com.blog.entity; import com.baomido ...

  9. idea 从数据库快速生成Spring Data JPA实体类

    第一步,调出 Persistence 窗口. File—>Project Structure—>model—> + —>JPA 第二步:打开 Persistence窗口 配置 ...

随机推荐

  1. [Python] String Join

    Let's introduce a new string method, join: >>> nautical_directions = "\n".join([& ...

  2. Linux下Oracle的sqlplus中上下左右退格键无法使用

    一.配置yum源并安装readline* 配置本地yum 1.挂载光盘 mount /dev/cdrom /mnt/media 2,新建本地yun源的配置文件 vi /etc/yum.repos.d/ ...

  3. 设计模式之Build(生成者模式)

    一.生成器模式的定义: 生成器模式也称为建造者模式.生成器模式的意图在于将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示(GoF).在软件设计中,有时候面临着一个非常复杂的对象的创 ...

  4. FFT之大数乘法

    #include <iostream> #include <stdio.h> #include <cmath> #include <algorithm> ...

  5. 在英语中,in,on,at的用法是?

    在几点:at xx:xx ,在那月: in  Dec./Jan.……, 在那日:on Thur./Mon.……,on Jan. 16th 时间前面 at, 年月日前面如果有具体的日子,就是具体的哪一天 ...

  6. Intellij IDEA 部署Web项目,解决 404 错误

    https://blog.csdn.net/eaphyy/article/details/72513914

  7. PHP温习之二

    1.php包含的超全局变量 (1)$GLOBALS超全局变量组,在PHP脚本所有的作用域均可以访问到. <?php $x = 23; $y = 17; function addAction(){ ...

  8. android基于开源网络框架asychhttpclient,二次封装为通用网络请求组件

    网络请求是全部App都不可缺少的功能,假设每次开发都重写一次网络请求或者将曾经的代码拷贝到新的App中,不是非常合理,出于此目的,我希望将整个网络请求框架独立出来,与业务逻辑分隔开,这样就能够避免每次 ...

  9. js29--装饰着模式

    //装饰者模式:就是在保证不改变原有对象的基础上,去扩展一些想要的方法或去求 var CarInterface = new BH.Interface('CarInterface' , ['getPri ...

  10. Linux的一些简单命令操作

    防火墙 查看防火墙状态 systemctl status iptables (或service iptables status) 关闭防火墙 systemctl stop iptables(或serv ...