正确生成hashCode和equals方法,以及联合Map,set集合达到去重目的

Idea自动生成HashCode和equals视频链接

https://live.csdn.net/v/330419

在这里插入图片描述

实体类 对name和age两个属性重写hashCode,equals方法

package TestEqualsHashCode;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.util.Objects;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class Student {
    private String name;
    private int age;
    private String address;
    private String school;
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

测试

@Test
    public void test1(){
        Student s1 = new Student("张三",11,"河南","太康");
        Student s2 = new Student("李四",66,"郑州","扶沟");
        Student s3 = new Student("张三",11,"河北","武汉");
        Student s4 = new Student("李四",66,"广东","深圳");

        Set<Student> students = new HashSet<>();
        students.add(s1);
        students.add(s2);
        students.add(s3);
        students.add(s4);
        System.out.println(students);
    }

运行结果

[Student(name=李四, age=66, address=郑州, school=扶沟), Student(name=张三, age=11, address=河南, school=太康)]

**> 使用map联合equals和hashCode来实现去重

HashMap存储自定义类型键值: (扩展方法的快捷键 Ctrl+Alt+M)
Map集合保证key是唯一的,作为key的元素,必须重写hashCode()和equals()方法,以保证key唯一。**

HashMap存储自定义类型键值:
	-key:String类型
		String类型重写hashCode()方法和equals()方法,可以保证key唯一。
	-value:Person类型
		-value可以重复(同名同年龄的人视为同一个,覆盖)

HashMap存储自定义类型键值

Map集合保证key是唯一的:
    作为key的元素,必须重写hashCode方法和equals方法,以保证key唯一
    HashMap存储自定义类型键值
    key:Person类型
        Person类就必须重写hashCode方法和equals方法,以保证key唯一
    value:String类型
        可以重复
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class Student {
    private String name;
    private int age;
    private String address;
    private String school;
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }
    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}
@Test
    public void test2() {
        Student s1 = new Student("张三",11,"河南","太康");
        Student s2 = new Student("李四",66,"郑州","扶沟");
        Student s3 = new Student("张三",11,"河北","武汉");
        Student s4 = new Student("李四",66,"广东","深圳");
        HashMap<Student,String> map = new HashMap<>();
        map.put(s1,"中国");
        map.put(s4,"韩国");
        map.put(s3,"意大利");
        map.put(s2,"美国");
        System.out.println(map);
    }

运行结果

{Student(name=李四, age=66, address=广东, school=深圳)=美国, Student(name=张三, age=11, address=河南, school=太康)=意大利}

集合的常用分类

List集合有序,可重复
分类:
	ArrayList:集合数据存储的结构是数组结构。元素增删慢,查找快
	LinkedList:集合数据存储的结构是链表结构。查找慢,增删快
Set集合,无序,不可重复
	分类:
		HashSet:它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不一致),HashSet是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证元素唯一性的方式依赖于:hashCode与equals方法。
		LinkedHashSet:有序,不可重复
简单排序:
	ArrayList<String> list = new ArrayList<String>();
        list.add("cba");
        list.add("aba");
        list.add("sba");
        list.add("nba");
        //排序方法  按照第一个单词的降序
        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o2.charAt(0) - o1.charAt(0);
            }
        });
        System.out.println(list);
    }
Map集合:集合不能包含重复的键,值可以重复;每个键只能对应一个值
	分类:
		HashMap<K,V>:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。
		LinkedHashMap<K,V>:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
当我们将自定义对象作为MapSet的键时,由于需要寻找对应的键值对或元素,需要根据hashCodeequals方法来进行比较和匹配。因此,重写hashCodeequals方法是非常重要的。 在重写hashCode方法时,我们需要保证同一对象多次调用hashCode方法得到的返回值是相同的。一般来说,可以将对象中的每个字段的hashCode值相加,得到一个综合的hashCode值。 在重写equals方法时,我们需要保证同一对象与自身相等,即x.equals(x)为true;同时,我们需要满足以下条件: 1. 对象与null比较时返回false,即x.equals(null)为false; 2. 对象与其他类比较时返回false,即x.equals(y)为false,当且仅当x和y不是同一类型的对象; 3. 对象的字段值相等时返回true,即当且仅当x和y的每个字段都相等时,x.equals(y)为true。 下面是一个示例代码: ```java public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public int hashCode() { int result = 17; result = 31 * result + name.hashCode(); result = 31 * result + age; return result; } @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (obj == this) { return true; } if (!(obj instanceof Person)) { return false; } Person other = (Person) obj; return this.name.equals(other.name) && this.age == other.age; } } ``` 在这个示例中,我们重写了Person类的hashCodeequals方法,其中: 1. hashCode方法使用了31这个素数,常量17以及对象的每个字段的hashCode值相加的方式来计算综合的hashCode值。 2. equals方法首先判断了是否为null或同一对象;然后判断了是否为Person类的对象;最后比较了name和age字段的值是否相等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

最好的期待,未来可期

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值