當(dāng)前位置:
首頁(yè) >
HashSet存储自定义对象保证元素唯一性图解原理及代码优化
發(fā)布時(shí)間:2024/7/5
50
豆豆
生活随笔
收集整理的這篇文章主要介紹了
HashSet存储自定义对象保证元素唯一性图解原理及代码优化
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
HashSet存儲(chǔ)自定義對(duì)象保證元素唯一性圖解原理及代碼優(yōu)化
1.原理:
?* 1.HashSet原理
????? * 我們使用Set集合都是需要去掉重復(fù)元素的, 如果在存儲(chǔ)的時(shí)候逐個(gè)equals()比較,
??????? 效率較低,哈希算法提高了去重復(fù)的效率, 降低了使用equals()方法的次數(shù)
?? * 當(dāng)HashSet調(diào)用add()方法存儲(chǔ)對(duì)象的時(shí)候, 先調(diào)用對(duì)象的hashCode()方法得到一個(gè)哈希值, 然后在集合中查找是否有哈希值相同的對(duì)象
???? * 如果沒(méi)有哈希值相同的對(duì)象就直接存入集合
????? * 如果有哈希值相同的對(duì)象, 就和哈希值相同的對(duì)象逐個(gè)進(jìn)行equals()比較,比較結(jié)果為false就存入, true則不存
???? * 2.將自定義類的對(duì)象存入HashSet去重復(fù)
???? * 類中必須重寫hashCode()和equals()方法
??? * hashCode(): 屬性相同的對(duì)象返回值必須相同, 屬性不同的返回值盡量不同(提高效率)
??? * equals(): 屬性相同返回true, 屬性不同返回false,返回false的時(shí)候存儲(chǔ)
2.示例:
在新定義的Person類中重寫hashCode()和equals()方法
盡量使屬性值的哈希值不同,盡可能減少調(diào)用equals()方法
?
/*
* hashCode()方法返回屬性的哈希值,如果相同要調(diào)用equals()方法
* 用這個(gè)方法減少調(diào)用equals()的次數(shù)
* */
/*為什么是31?
* 1.31是一個(gè)質(zhì)數(shù)只能被1和本身整除
* 2.31既不大也不小
* 3.31好算=2的五次方-1
* */
public class Person implements Comparable<Person>{String name;int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic int compareTo(@NotNull Person o) {int num=this.name.compareTo(o.name);return num==0?this.age-o.age:num;}@Overridepublic boolean equals(Object o) { //健壯性判斷if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;if (age != person.age) return false;return name != null ? name.equals(person.name) : person.name == null;}@Overridepublic int hashCode() {/** hashCode()方法返回屬性的哈希值,如果相同要調(diào)用equals()方法* 用這個(gè)方法減少調(diào)用equals()的次數(shù)* *//*為什么是31?* 1.31是一個(gè)質(zhì)數(shù)只能被1和本身整除* 2.31既不大也不小* 3.31好算=2的五次方-1* */int result = name != null ? name.hashCode() : 0;result = 31 * result + age;return result;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}HashSet<Person> hs = new HashSet<>();hs.add(new Person("張三", 23)); //new Person()每一次的地址不一樣,對(duì)象不同hs.add(new Person("張三", 23));hs.add(new Person("李四", 23));hs.add(new Person("李四", 23));hs.add(new Person("王五", 23));hs.add(new Person("趙六", 23));hs.add(new Person("張三", 23));hs.add(new Person("李四", 23));hs.add(new Person("李四", 23));hs.add(new Person("王五", 23));hs.add(new Person("趙六", 23));System.out.println(hs);
2.圖解
?
總結(jié)
以上是生活随笔為你收集整理的HashSet存储自定义对象保证元素唯一性图解原理及代码优化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 解决安装IIS时提示找不到zClient
- 下一篇: 数字化转型知识方法系列之五:数字化转型战