----------------|Collection(为什么要画这个图?学多了之后该忘了)
--------------------------|List
----------------------------------------|ArrayList
----------------------------------------|LinkedList
----------------------------------------|Vector
---------------------------|Set
----------------------------------------|HashSet
----------------------------------------|TreeSet
Set:
特有的方法在前面有接触。所以没有太特别的方法(查看API)
哈希表:有行有列的才能称为表,可以把哈希表想成那种普通的表格,
而哈希码可以简单的理解为地址,每当new 出一个对象调用
其hashCode方法时,会算出该对象所对应的哈希值,然后
对照着哈希值填入哈希表(就是在内存中找到自己的位置),
也就是通过元素的哈希值通过等位移运算,算出该元素在哈希表中
的储存位置。
哈希表的一个特点是“桶式结构”(一个坑里可以填多个萝卜),
这里所说的坑就好比与哈希表的一个个小格,萝卜就好比于你创建的对象。
就是在集合里的元素啦。问题来了,如果这时没有重写hashCode方法,两个一样的对象
就会被填入一个格中,这就与Set集合的特点(有序,不重)相违背,
相当于有重复的元素,所以要重写hashCode方法。
hashSet的实现原理:
向HashSet 添加元素时,HashSet先调用hashCode方法,算出哈希值
找到该元素在哈希表的储存位置。
情况1:算出元素的存储位置同时没有任何元素存储在这,则该元素可以存储在该位置上。
情况2:如果位置上有了元素,这是会调用equals方法,与该位置的元素再比较一次,
如果返回true,该元素就是重复的,不能添加。返回false可以。
import java.util.*;
import java.util.ListIterator;
public class ex12 {
public static void main(String[] args) { HashSet set = new HashSet();
set.add(new Person(100, "Tom"));
set.add(new Person(101, "Jack"));
set.add(new Person(102, "LiLi"));
System.out.println(set);//此时运行输出的不是你想的,要重写toString()
System.out.println();//打印空行,为了好看
set.add(new Person(101, "Tom"));
System.out.println(set);//明明是一样的为什么还可以填进去呢? 去重写hashCode()
//还是没用 去重写equals()
}
} class Person {
int id;
String name; public Person(int id, String name){
this.name = name;
this.id = id;
} @Override
public String toString() {
return "{ id = " + this.id + " name = " + this.name + " }";
} @Override
public int hashCode() {
System.out.println("----------hashCode-----------");//方便看出分别调用了词hashCode 和 equals()
return this.id;
} @Override
public boolean equals(Object obj) {
System.out.println("----------equals-----------");
Person p = (Person)obj;
return this.id == p.id;
}
}
----------hashCode-----------
----------hashCode-----------
----------hashCode-----------
[{ id = 100 name = Tom }, { id = 101 name = Jack }, { id = 102 name = LiLi }] ----------hashCode-----------
----------equals-----------
[{ id = 100 name = Tom }, { id = 101 name = Jack }, { id = 102 name = LiLi }] Process finished with exit code 0