Java Set接口的主要实现类HashSet

时间:2022-02-28 16:15:52
Set:存储的元素是无序的,不可重复的!
1.无序性:无序性!= 随机性。真正的无序性,指的是元素在底层存储的位置是无序的。
 2.不可重复性:当向Set中添加进相同的元素的时候,后面的这个不能添加进去。
 
 说明:要求添加进Set中的元素所在的类,一定要重写equals()和hashCode()方法。 进而保证Set中元素的不可重复性!
 
Set中的元素时如何存储的呢?使用了哈希算法。
当向Set中添加对象时,首先调用此对象所在类的hashCode()方法,计算此对象的哈希值,此哈希值
 决定了此对象在Set中的存储位置。若此位置之前没有对象存储,则这个对象直接存储到此位置。若此位置
 已有对象存储,再通过equals()比较这两个对象是否相同。如果相同,后一个对象就不能再添加进来。 万一返回false呢,都存储。(不建议如此)

 >要求:hashCode()方法要与equals()方法一致。


实例代码:


  1. import java.util.HashSet;  
  2. import java.util.Set;  
  3.   
  4. import org.junit.Test;  
  5.   
  6. public class TestSet {  
  7.     @Test  
  8.     public void test1() {  
  9.         Set set = new HashSet();  
  10.         set.add(123);  
  11.         set.add(456);  
  12.         set.add("AAA");  
  13.         set.add("BB");  
  14.         set.add(null);  
  15.         TestSetObject o1 = new TestSetObject("GG"23);  
  16.         TestSetObject o2 = new TestSetObject("GG"23);  
  17.         System.out.println(o1.hashCode());  
  18.         System.out.println(o2.hashCode());  
  19.         set.add(o1);  
  20.         set.add(o2);  
  21.         System.out.println(set);  
  22.           
  23.         System.out.println(set.size());  
  24.     }  
  25. }  
  26.   
  27. class TestSetObject {  
  28.     private String name;  
  29.     private int age;  
  30.       
  31.     public TestSetObject(String name, int age) {  
  32.         super();  
  33.         this.name = name;  
  34.         this.age = age;  
  35.     }  
  36.   
  37.     @Override  
  38.     public int hashCode() {//必须要重写hashCode()方法和equals()方法  
  39.         final int prime = 31;  
  40.         int result = 1;  
  41.         result = prime * result + age;  
  42.         result = prime * result + ((name == null) ? 0 : name.hashCode());  
  43.         return result;  
  44.     }  
  45.   
  46.     @Override  
  47.     public boolean equals(Object obj) {  
  48.         if (this == obj)  
  49.             return true;  
  50.         if (obj == null)  
  51.             return false;  
  52.         if (getClass() != obj.getClass())  
  53.             return false;  
  54.         TestSetObject other = (TestSetObject) obj;  
  55.         if (age != other.age)  
  56.             return false;  
  57.         if (name == null) {  
  58.             if (other.name != null)  
  59.                 return false;  
  60.         } else if (!name.equals(other.name))  
  61.             return false;  
  62.         return true;  
  63.     }  
  64.   
  65.     @Override  
  66.     public String toString() {  
  67.         return "TestSetObject [name=" + name + ", age=" + age + "]";  
  68.     }  
  69. }  


以下是实现结果:
  1. 3946  
  2. 3946  
  3. [null, TestSetObject [name=GG, age=23], BB, AAA, 456, 123]  
  4. 6