1,HashSet集合的 特点:

  1. 无索引
  2. 不重复 ,自定义类型的去重要去重写 equals和 hashcode !!!
  3. 存储和取出没有顺序
  4. 底层数据结构是哈希表(后面再深入了解)
    1. 哈希表的底层是 :数组加链表;

      2,HashSet集合的 使用(举例):

      存储学生数据: ```java //主类: package Set;

import java.util.HashSet;

/**

  • @author Jztice5
  • @date 2022年02月12日 14:56 */

public class S2 { public static void main(String[] args) {

  1. //新建HashSet集合:
  2. HashSet<Student> set = new HashSet<>();
  3. //创建stuednt对象
  4. Student s1 = new Student("L", 18, 100);
  5. Student s2 = new Student("M", 21, 100);
  6. Student s3= new Student("H", 18, 100);
  7. //往set集合中添加对象属性;
  8. set.add(s1);
  9. set.add(s2);
  10. set.add(s3);
  11. //增强for循环遍历set集合(这里的底层是迭代器的循环遍历)
  12. for (Student student : set) {

// System.out.println(student.getName()+”\t”+student.getAge()+”\t”+student.getFen());

  1. //如果要这样写的话,记得在对象类中重写toString方法输出集合数据;
  2. System.out.println(student);
  3. }
  4. }

}

//Student类; package Set;

import com.sun.xml.internal.ws.api.ha.StickyFeature;

/**

  • @author Jztice5
  • @date 2022年02月12日 14:56 */

public class Student { private String name; private int age; private int fen;

  1. public Student() {
  2. }
  3. public Student(String name, int age, int fen) {
  4. this.name = name;
  5. this.age = age;
  6. this.fen = fen;
  7. }
  8. public String getName() {
  9. return name;
  10. }
  11. public void setName(String name) {
  12. this.name = name;
  13. }
  14. public int getAge() {
  15. return age;
  16. }
  17. public void setAge(int age) {
  18. this.age = age;
  19. }
  20. public int getFen() {
  21. return fen;
  22. }
  23. public void setFen(int fen) {
  24. this.fen = fen;
  25. }
  26. //*************************************
  27. //重写toString,以便能够直接用对象变量直接输出集合;
  28. @Override
  29. public String toString() {
  30. return "Student{" +
  31. "name='" + name + '\'' +
  32. ", age=" + age +
  33. ", fen=" + fen +
  34. '}';
  35. }

}

  1. <a name="f071i"></a>
  2. ## 3,(重点*)HashSet集合常用的 方法(存放元素的过程):
  3. <a name="h5WsV"></a>
  4. ### 1,hashCode():哈希算法
  5. 1. 在此方法中返回的值称为:**哈希码值**;
  6. 1. 其中,在此方法内,计算元素存放位置的算法被称为**哈希算法**
  7. 1. **计算公式为: 存入位置=哈希值%数组长度;**
  8. 4. **其中存放元素的过程为:(链表法)**
  9. 1. **根据hashcode返回的值计算存放的位置;**
  10. 1. **如果这个位置没有元素,直接存储;**
  11. 1. **如果有元素,跳转到equals方法中进行判断;**
  12. 1. **如果元素内容不同,则存进当前位置,以挂靠的方式进行存储;**
  13. ![image.png](https://cdn.nlark.com/yuque/0/2022/png/25975946/1644651002558-95b2de93-bfb7-4ff2-8556-aeb32373ea24.png#clientId=u1c675782-a98d-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=204&id=u33ee64ed&margin=%5Bobject%20Object%5D&name=image.png&originHeight=204&originWidth=479&originalType=binary&ratio=1&rotation=0&showTitle=false&size=15935&status=done&style=none&taskId=u01a80255-51fd-445f-96b3-3dc898e9bc8&title=&width=479) <br />横向的是数组,挂靠的是链表;数组内存的是链表的头节点key;
  14. 5. **如果元素内容相同,则不会存进去;**
  15. 5. **总结:因此,哪怕是哈希值为1 时,只要内容不同,就能一直存放下去;(但是这种方法不推荐,因为效率低下)**
  16. <a name="AUbbC"></a>
  17. ### 2,equals():判断内容是否相同
  18. <a name="aqGMx"></a>
  19. ### 3,代码示例:
  20. ```java
  21. @Override
  22. public boolean equals(Object o) {
  23. if (this == o) return true;
  24. if (o == null || getClass() != o.getClass()) return false;
  25. Student student = (Student) o;
  26. if (age != student.age) return false;
  27. if (fen != student.fen) return false;
  28. return name != null ? name.equals(student.name) : student.name == null;
  29. }
  30. @Override
  31. public int hashCode() {
  32. int result = name != null ? name.hashCode() : 0;
  33. result = 31 * result + age;
  34. result = 31 * result + fen;
  35. return result;
  36. }