标签:bug learn 对象 system 版本 自动 数据 一个 元素
1 package cn.learn.collection.Set; 2 3 import java.util.Objects; 4 5 public class IsPerson { 6 private int age; 7 private String name; 8 9 //ide自动生成 10 @Override 11 public boolean equals(Object o) { 12 if (this == o) return true; 13 if (o == null || getClass() != o.getClass()) return false; 14 IsPerson isPerson = (IsPerson) o; 15 return age == isPerson.age && 16 Objects.equals(name, isPerson.name); 17 } 18 19 @Override 20 public int hashCode() { 21 return Objects.hash(age, name); 22 } 23 24 @Override 25 public String toString() { 26 return "IsPerson{" + 27 "age=" + age + 28 ", name=‘" + name + ‘\‘‘ + 29 ‘}‘; 30 } 31 32 public IsPerson() { 33 } 34 35 public IsPerson(int age, String name) { 36 this.age = age; 37 this.name = name; 38 } 39 40 public int getAge() { 41 return age; 42 } 43 44 public void setAge(int age) { 45 this.age = age; 46 } 47 48 public String getName() { 49 return name; 50 } 51 52 public void setName(String name) { 53 this.name = name; 54 } 55 }
1 package cn.learn.collection.Set; 2 3 import java.util.HashSet; 4 5 /* 6 HashSet集合存储数据的结构(哈希表) -泛型类 7 jdk1.8版本之前:哈希表=数组+链表 8 jdk1.8版本之后: 9 哈希表=数组+链表;(链表超过八位转红黑树,提高查询效率) 10 哈希表=数组+红黑树(提高查询速度) 11 哈希表:速度快 12 13 Set集合不允许重复元素的原理 14 Set集合在调用add方法的时候,add会调用hashCode是否哈希冲突 15 冲突再调用equals方法,判断元素重复,重复就不存储到集合中 16 注:前提必须重写HashCode方法(比较,不一致添加到集合)和(相同哈希值)equals 17 18 1,为什么哈希码相同了还有可能是不同对象?2,为什么经过比较哈希码还需要借助equals方法判断? 19 20 答:首先:按照Object类的hashCode方法,是不可能返回两个相同的哈希码的。(哈希码唯一标志了对象) 21 然后:Object类的hashCode方法返回的哈希码具有唯一性(地址唯一性),但是这样不能让程序的运行逻辑 22 符合现实生活。(这个逻辑就是:属性相同的对象被看作同一个对象。)为了让程序的运行逻辑符合现实生活, 23 Object的子类重写了hashCode的方法(基本数据类型的实现类都已经重写了两个方法,自定义的类要软件工程 24 师自己重写。) 25 26 那么:重写的宗旨是什么?重写就是为了实现这样的目的:属性相同的不同对象在调用其hashCode方法后,返回的 27 是同样的哈希码。但是我们在重写的时候,发现几乎所有的写法都无法避免一个bug:有一些属性不同的对象(当然 28 是不同的对象),会返回相同的哈希码。(即 重码) 29 30 最后:为了解决这个问题:在哈希码相同的时候,再用equals方法比较两个对象的对应属性 31 是否相同,这样,确保了万无一失。这样:上面两个问题得到解决。 32 33 34 */ 35 public class HashSet_Set { 36 public static void main(String[] args) { 37 HashSet<String> set=new HashSet(); 38 set.add("sad"); 39 set.add("sad"); 40 System.out.println(set); // 41 42 43 //重写HashCode与equals方法,以用来存储自定义元素 44 HashSet<IsPerson> set1=new HashSet<>(); 45 IsPerson p1=new IsPerson(12,"sad"); 46 IsPerson p2=new IsPerson(10,"ddd"); 47 IsPerson p3=new IsPerson(10,"ddd"); 48 set1.add(p1); 49 set1.add(p2); 50 set1.add(p3); 51 /* 52 System.out.println(set1); 53 //[IsPerson{age=10, name=‘ddd‘}, IsPerson{age=12, name=‘sad‘}, IsPerson{age=10, name=‘ddd‘}] 54 */ 55 //由上可知,需要在IsPerson重写Hashcode和equals方法,ide自动生成 56 System.out.println(set1); //[IsPerson{age=12, name=‘sad‘}, IsPerson{age=10, name=‘ddd‘}] 57 58 59 60 } 61 }
标签:bug learn 对象 system 版本 自动 数据 一个 元素
原文地址:https://www.cnblogs.com/huxiaobai/p/11494186.html