HashSet——>底层是HashMap 数组+链表 即散列表 或 邻接链表
    无序 无重复
    无序:我们使用过集合存放元素的顺序 集合内取出来的顺序不一致
    集合本身有自己的算法排布顺序 hash算法

    1.java.util包
    2.创建对象
    无参数构造方法
    带(Collection<? extends E> c)参数构造方法
    3.常用方法
    增删查改
    boolean = add(value);·
    addAll(Collection c); retainAll(); removeAll(); size();
    boolean = remove(Object obj);
    没有修改方法(因为不清楚位置)
    可以使用增强for进行集合遍历轮询或者迭代器

    iterator();

    HashSet set = new HashSet();
    set.add(“a”);
    set.add(“A”);
    set.add(“c”);
    set.add(“C”);
    set.add(“B”);
    set.add(“b”);
    //Iterator是一个接口 在java.util包下
    //获取迭代器对象
    //通过set集合获取 不能new出来 因为new出来的对象是空的 不知道要找谁
    Iterator it = set.iterator();//获取对象之后接收 多态的效果
    while(it.hasNext()){//判断下一个位置是否有元素
    //注意迭代器头的下一个位置 相当于集合的头
    String value = it.next();//如果有元素就取出来
    System.out.println(value);
    }
    //注意若用迭代器循环执行删除操作 可能会出现CurrentModifyException异常
    //这个异常是因为删除不干净引起的 可以参考list集合的remove方法 i++ size—
    4.无重复的原则
    是由 equals方法 和 hashCode方法 来判断元素是否重复
    如果想要让Person对象的name一致 认为是一个对象
    则需要重写 equals方法
    仅仅重写了equals方法 发现还没达到无重复的效果
    证明可能需要满足的原则不止equals方法一个这么简单
    由hashSet联想到 hashCode方法
    hashCode方法 是将对象的地址进过计算得到一串hashCode码 如果hashCode码不一样 说明还不是一个人
    要想达到无重复的效果 还需重写 hashCode方法
    equals方法 和 hashCode方法是属于Object类下的方法 所以不重写也能存入 只是达不到无重复的要求

    对象只有一个name属性时:

    1. public class Person {
    2. private String name;
    3. private int num;//编号 记录是第几个进来的
    4. public Person(String name,int age,int num){
    5. this.name = name;
    6. this.num = num;
    7. }
    8. public int getNum(){
    9. return this.num;
    10. }
    11. public boolean equals(Object obj){
    12. if(this==obj){
    13. return true;//先对比对象的地址 如果地址一样说明肯定存的是同一个人
    14. }
    15. if(obj instanceof Person){//如果地址不一样 在看看obj是否属于Person类型
    16. Person anotherPerson = (Person) obj;//如果属于 造型
    17. return anotherPerson.name.equals(this.name);//对比两个人的名字是否一致
    18. //(注意这里面的equals方法是String类下的(name是String类型的) 而不是我们现在重写的equals方法
    19. }
    20. return false;//对象不一样 类型也不一样 那么一定不是同一个
    21. }
    22. //重写hashCode方法
    23. public int hashCode(){
    24. //如果person对象name属性一致 我们需要让hashCode返回值一致
    25. return this.name.hashCode();
    26. }
    27. //重写toString方法 让对象打印输出时输出的是对象的属性 而不是一串hashCode码
    28. public String toString(){
    29. StringBuilder stringBuilder = new StringBuilder();
    30. stringBuilder.append("{");
    31. stringBuilder.append(this.name);
    32. stringBuilder.append(",");
    33. stringBuilder.append(this.num);
    34. stringBuilder.append("}");
    35. return new String(stringBuilder);
    36. //StringBuilder 变为 String的方法有两个
    37. //另一个是 stringBuilder.toString();
    38. }
    39. }

    主方法:

    1. public static void main(String[] args) {
    2. HashSet<String> stringSet = new HashSet<String>();
    3. stringSet.add("小明");
    4. stringSet.add("小明");
    5. stringSet.add("小明");
    6. stringSet.add("小明");
    7. stringSet.add("小明");
    8. System.out.println(stringSet.size());//长度为 1
    9. HashSet<Person> personSet = new HashSet<Person>();
    10. personSet.add(new Person("小明",5));
    11. personSet.add(new Person("小明",1));
    12. personSet.add(new Person("小明",2));
    13. personSet.add(new Person("小明",3));
    14. personSet.add(new Person("小明",4));
    15. System.out.println(personSet);//没重写时 长度为 5
    16. //重写了equals方法和hashCode方法后 此时的长度就是1
    17. //重写了toString方法后 可以直接输出对象的属性 而不是输出一串hashCode码
    18. //上述结果输出的是第一个进来的对象 [{小明,5}]
    19. }

    对象有两个属性时:

    1. public class Person {
    2. private String name;
    3. private int age;
    4. private int num;//编号 记录是第几个进来的
    5. public Person(String name,int age,int num){
    6. this.name = name;
    7. this.age = age;
    8. this.num = num;
    9. }
    10. public int getNum(){
    11. return this.num;
    12. }
    13. public boolean equals(Object obj){
    14. if(this==obj){
    15. return true;//先对比对象的地址 如果地址一样说明肯定存的是同一个人
    16. }
    17. if(obj instanceof Person){//如果地址不一样 在看看obj是否属于Person类型
    18. Person anotherPerson = (Person) obj;//如果属于 造型
    19. if(anotherPerson.name.equals(this.name)) {
    20. return anotherPerson.age == ((Person) obj).age;//如果名字一样 比较年龄
    21. }
    22. }
    23. return false;//对象不一样 类型也不一样 那么一定不是同一个
    24. }
    25. //重写hashCode方法
    26. public int hashCode(){
    27. //如果person对象name属性与age属性一致 我们需要让hashCode返回值也一致
    28. return this.name.hashCode()+this.age;
    29. }
    30. //重写toString方法 让对象打印输出时输出的是对象的属性 而不是一串hashCode码
    31. public String toString(){
    32. StringBuilder stringBuilder = new StringBuilder();
    33. stringBuilder.append("{");
    34. stringBuilder.append(this.name);
    35. stringBuilder.append(",");
    36. stringBuilder.append(this.age);
    37. stringBuilder.append(",");
    38. stringBuilder.append(this.num);
    39. stringBuilder.append("}");
    40. return new String(stringBuilder);
    41. }
    42. }

    主方法:

    1. public static void main(String[] args) {
    2. HashSet<String> stringSet = new HashSet<String>();
    3. stringSet.add("小明");
    4. stringSet.add("小明");
    5. stringSet.add("小明");
    6. stringSet.add("小明");
    7. stringSet.add("小明");
    8. System.out.println(stringSet.size());//长度为 1
    9. HashSet<Person> personSet = new HashSet<Person>();
    10. personSet.add(new Person("小明",25,5));
    11. personSet.add(new Person("小明",16,1));
    12. personSet.add(new Person("小明",16,2));
    13. personSet.add(new Person("小明",20,3));
    14. personSet.add(new Person("小明",22,4));
    15. System.out.println(personSet);
    16. //上述结果输出 [{小明,25,5}, {小明,16,1}, {小明,20,3}, {小明,22,4}]
    17. }