Java基础:Collection的分支——Set集合及其子类

    技术2022-07-10  78

    Collection接口: 单列集合最顶层的接口,单列集合中的共性内容,所有单列集合都可以使用。 List接口 / 集合: 有存储顺序,允许存储重复元素。 ArrayList类(重点): 底层是数组实现的, 查找快, 增删慢。由于是数组实现,在增和删的时候会牵扯到数组增容,以及拷贝元素,所以慢。而数组是可以直接按索引查找, 所以查找时较快,一个普通的for循环可以遍历。LinkedList类: 底层是链表实现的, 增删快, 查找慢。由于链表实现, 增加时只要让前一个元素记住自己就可以, 删除时让前一个元素记住后一个元素, 后一个元素记住前一个元素. 这样的增删效率较高但由于没有索引,查询时需要一个一个的遍历, 所以查询效率较低。Vector类(了解): 和ArrayList原理相同,但线程安全, 效率略低,和ArrayList实现方式相同, 但考虑了线程安全问题, 所以效率略低 。 Set接口 / 集合: 无存储顺序, 不允许存储重复元素,无索引。 HashSet类 (重点):底层是哈希表(+红黑树)实现的,查询快。TreeSet类(了解):底层是二叉树实现,一般用于排序。LinkedHashSet类:可以保证存取顺序,底层是哈希表+链表实现的。注意它是HashSet类的子类。

    Set集合及其子类

    Set集合HashSet集合LinkedHashSet集合

    Set集合

    HashSet集合

    具有Set类公共特点(无存储顺序, 不允许存储重复元素,无索引),HashSet类底层是哈希表结构,查询速度非常快。

    哈希表=数组+链表/红黑树

    import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class Demo { public static void main(String[] args) { Set<Integer> set = new HashSet<>(); set.add(1); set.add(5); set.add(5); set.add(9); //集合不允许重复元素,所以只会有3个 //推荐用增强for循环遍历 for (Integer i : set) { System.out.println(i); } Iterator<Integer> iter = set.iterator(); while (iter.hasNext()) { Integer n = iter.next(); System.out.println(n); } } }

    LinkedHashSet集合

    LinkedHashSet类底层是哈希表结构基础上再加一条链表用于记录存储顺序。 即底层是:哈希表(数组+链表/红黑树)+链表

    public class Demo { public static void main(String[] args) { Set<String> set = new HashSet<>(); set.add("b"); set.add("a"); set.add("b"); set.add("c"); //集合不允许重复元素,所以只会有3个 //System.out.println(set);没记录存储顺序,所以[a, b, c] Set<String> set2 = new LinkedHashSet<>(); set2.add("b"); set2.add("a"); set2.add("b"); set2.add("c"); //集合不允许重复元素,所以只会有3个 //System.out.println(set2);记录存储顺序,所以[b, a, c] } }
    Processed: 0.014, SQL: 8