标签:shc 成员变量 等于 重复元素 重复 基本 demo1 rgb 节点
底层数据结构是哈希表
不能保证存储和取出的顺序完全一致
不可以存储重复元素
没有索引,不能使用普通for循环遍历
存储字符串并遍历
package com.itheima.myhashset; import java.util.HashSet; import java.util.Iterator; public class HashSetDemo1 { public static void main(String[] args) { HashSet<String> hs=new HashSet<>(); hs.add("hello"); hs.add("world"); hs.add("java"); hs.add("java"); hs.add("java"); hs.add("java"); hs.add("java"); hs.add("java"); Iterator<String> it=hs.iterator(); while(it.hasNext()){ String next = it.next(); System.out.println(next); } System.out.println("============"); for (String h : hs) { System.out.println(h); } } }
哈希值简介
是JDK根据对象的地址或者字符串或者数字算出来的int类型的整数
如何获取哈希值
Object类中的public int hashCode():返回对象的哈希码值
哈希值的特点
同一个对象多次调用hashCode()方法返回的哈希值是相同的,
不同对象的哈希值时不一样的
如果不同的对象属性值时一样的,那么计算出来的哈希值也是一样的
package com.itheima.myhashset; public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.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; } //我们可以对Object类中的hashCode方法进行重写 //在重写时,就一般是根据对象的属性值来计算哈希值的 //此时跟对象的地址值就没有任何关系了 @Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + age; return result; } @Override public String toString() { return "Student{" + "name=‘" + name + ‘\‘‘ + ", age=" + age + ‘}‘; } }
测试类
package com.itheima.myhashset; /* * * 计算哈希值 * * */ public class HashSetDemo2 { public static void main(String[] args) { Student s1=new Student("xiaozhi",23); Student s2=new Student("xiaomei",22); //因为在Object类中,是根据对象的地址值计算出来的哈希值 System.out.println(s1.hashCode());//1060830840 System.out.println(s1.hashCode());//1060830840 System.out.println(s2.hashCode());//2137211482 } }
JDK1.8以前 不包括jdk8底层采用数组 + 链表
JDK1.8以后 底层进行了优化,由数组+链表+红黑树实现
数组 + 链表
节点个数多于8个
案例需求
创建一个存储学生对象的集合,存储多个学生对象,使用程序实现在控制台遍历该集合
要求:学生对象的成员变量值相同,我们就认为是同一个对象
代码实现
学生类
package com.itheima.hashsettest; public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.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; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; if (age != student.age) return false; return name != null ? name.equals(student.name) : student.name == null; } @Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + age; return result; } @Override public String toString() { return "Student{" + "name=‘" + name + ‘\‘‘ + ", age=" + age + ‘}‘; } }
测试类
没有重写hashCode方法,是根据对象的地址值计算的哈希值
哈希值不一样,那么计算出来应存入的索引就不一样
package com.itheima.hashsettest; import java.util.HashSet; /* * - 创建一个存储学生对象的集合,存储多个学生对象,使用程序实现在控制台遍历该集合 - 要求:学生对象的成员变量值相同,我们就认为是同一个对象 * *结论: * 如果HashSet集合要存储自定义对象,那么必须重写hashCode和equals方法 * */ public class HashSetTest1 { public static void main(String[] args) { HashSet<Student> hs=new HashSet<>(); Student s1=new Student("xiaohei",23); Student s2=new Student("xiaohei",23); Student s3=new Student("xiaomei",22); hs.add(s1); hs.add(s2); hs.add(s3); for (Student h : hs) { System.out.println(h); } } }
标签:shc 成员变量 等于 重复元素 重复 基本 demo1 rgb 节点
原文地址:https://www.cnblogs.com/faded8679/p/13993839.html