Java基础学习之HashSet集合
哈希表
HashSet集合的底层数据结构是哈希表
哈希表= 数组+链表
哈希表= 数组+红黑树
哈希值
由系统给出的一个十进制整数值,是逻辑地址不是物理地址。
hashcode()方法的源码中的native关键字意思是调用操作系统提供的方法。
public native int hashCode();//native关键字意思是调用操作系统提供的方法。
HashSet的使用
使用HashSet存储自定义类型数据时,如果想实现同一年龄同一姓名的人是同一个人,需要重写hashcode()和equals()方法。(直接在IDEA的code—generate里重写这两个方法就行)
String已经重写了hashcode()和equals()方法。
注意:这里是为了使不同对象在成员变量代表的属性相同时,使它们在HashSet中不可以重复存储。而特别使用HashSet存储自定义数据类型时多半有此目的。
重复元素不是同一个元素。要特别注意理解这里的重复含义,如仅仅是指不能重复存储创建的同一个对象,则几乎没啥意义。
如何判断重复元素:只有在两个对象的哈希值相同,equals()方法返回true时才会认定两个元素相同。
hashcode()方法是可以重写的。
public class Demo1 {
public static void main(String[] args) {
HashSelf p1 = new HashSelf("网名",18);
HashSelf p2 = new HashSelf("网名",18);
HashSelf p3 = new HashSelf("黑暗",19);
HashSet<HashSelf> set = new HashSet<>();
set.add(p1);
set.add(p2);
set.add(p3);
System.out.println(set);//这里的p1和p2不会被认为重复元素,因为没有重写HashCode()方法和equals()方法。
}
}
如果多次向一个HashSet中添加统一个对象,它们不会被成功添加,它们必然会被认为重复元素。
public class Demo1 {
public static void main(String[] args) {
HashSelf p1 = new HashSelf("网名",18);
HashSelf p2 = new HashSelf("网名",18);
HashSelf p3 = new HashSelf("黑暗",19);
HashSet<HashSelf> set = new HashSet<>();
set.add(p1);
set.add(p2);
set.add(p3);
set.add(p3);
System.out.println(set);//集合中任然只有三个元素
}
}