java笔记——set接口、HashSet与LinkedHashSet

set接口

set接口:无序的,不可重复的

  • HashSet:作为set接口的主要实现类;线程不安全,可以存储NUll值
  • LinkedHashSet:是HashSet的子类,遍历其内部数据时,按照添加顺序遍历
  • TreeSet:可以按照添加对象指定属性进行排序

Set接口中没有额外定义新的方法

HashSet

关于无序性与不可重复性

无序性:

不等于随机性。以HashSet为例,存储数据在底层数组中并非按照数组索引顺序添加,而是按照数据的哈希值决定

不可重复性:

保证添加的元素按照equals()判断时,不能返回true。即:相同的元素只能添加一个。结合添加元素的过程理解

添加元素的过程

向HashSet中添加元素a,首先调用hashCode()方法,计算a的哈希值此哈希值通过某种算法计算出在HashSet底层数组中的存放位置(索引值)判断这个位置是否已经有元素;

  • 如果没有,则添加成功
  • 如果有其他元素b(或以链表形式存在的多个元素),则比较a与b的哈希值
    • 如果哈希值不相同,则元素a添加成功
    • 如果哈希值相同,则调用a所在类的equals方法
      • 返回true,则a与b相同,添加失败
      • 返回false,添加成功
public class SetTest {
    public static void main(String[] args) {
        Set set = new HashSet();
        set.add(456);
        set.add(123);
        set.add("AA");
        set.add("CC");
        set.add(new Person("Tom", 12));
        set.add(129);

//        System.out.println(set);
        Iterator iterator = set.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}
复制代码

LinkedHashSet

  • LinkedHashSet作为HashSet的子类, 在添加数据的同时,还维护了两个引用,记录此数据前后两个数据对于频繁地遍历操作,效率更高
  • 继承Collection接口中的方法
public class LinkedHashSetTest {
    public static void main(String[] args) {
        //LinkedHashSet作为HashSet的子类,
        // 在添加数据的同时,还维护了两个引用,记录此数据前后两个数据
        //对于频繁地遍历操作,效率更高

        Set set = new LinkedHashSet();
        set.add(456);
        set.add(123);
        set.add("AA");
        set.add("CC");
        set.add(new Person("Tom", 12));
        set.add(129);

        Iterator iterator = set.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享