java 集合(Set1)

----------------|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

    

    

原文地址:https://www.cnblogs.com/lifehrx/p/5797615.html