美文网首页
Java 面试系列:集合详解之 Collection + 面试题

Java 面试系列:集合详解之 Collection + 面试题

作者: you的日常 | 来源:发表于2021-01-29 01:05 被阅读0次

    先来看看集合的继承关系图,如下图所示:

    enter image description here

    其中:

    • 外框为虚线的表示接口,边框为实线的表示类;
    • 箭头为虚线的表示实现了接口,箭头为实线的表示继承了类。

    为了方便理解,我隐藏了一些与本文内容无关的信息,隐藏的这些内容会在后面的章节中进行详细地介绍。

    从图中可以看出,集合的根节点是 Collection,而 Collection 下又提供了两大常用集合,分别是:

    • List:使用最多的有序集合,提供方便的新增、修改、删除的操作;
    • Set:集合不允许有重复的元素,在许多需要保证元素唯一性的场景中使用。

    下面我们分别对集合类进行详细地介绍。

    集合使用

    1)Vector

    Vector 是 Java 早期提供的线程安全的有序集合,如果不需要线程安全,不建议使用此集合,毕竟同步是有线程开销的。

    使用示例代码:

    Vector vector = new Vector();
    vector.add("dog");
    vector.add("cat");
    vector.remove("cat");
    System.out.println(vector);
    
    

    程序执行结果:[dog]

    2)ArrayList

    ArrayList 是最常见的非线程安全的有序集合,因为内部是数组存储的,所以随机访问效率很高,但非尾部的插入和删除性能较低,如果在中间插入元素,之后的所有元素都要后移。ArrayList 的使用与 Vector 类似。

    3)LinkedList

    LinkedList 是使用双向链表数据结构实现的,因此增加和删除效率比较高,而随机访问效率较差。

    LinkedList 除了包含以上两个类的操作方法之外,还新增了几个操作方法,如 offer() 、peek() 等,具体详情,请参考以下代码:

    LinkedList linkedList = new LinkedList();
    // 添加元素
    linkedList.offer("bird");
    linkedList.push("cat");
    linkedList.push("dog");
    // 获取第一个元素
    System.out.println(linkedList.peek());
    // 获取第一个元素,并删除此元素
    System.out.println(linkedList.poll());
    System.out.println(linkedList);
    
    

    程序的执行结果:

    dog
    dog
    [cat, bird]
    
    

    4)HashSet

    HashSet 是一个没有重复元素的集合。虽然它是 Set 集合的子类,实际却为 HashMap 的实例,相关源码如下:

    public HashSet() {
        map = new HashMap<>();
    }
    
    

    因此 HashSet 是无序集合,没有办法保证元素的顺序性。

    HashSet 默认容量为 16,每次扩充 0.75 倍,相关源码如下:

    public HashSet(Collection<? extends E> c) {
        map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
        addAll(c);
    }
    
    

    HashSet 的使用与 Vector 类似。

    相关文章

      网友评论

          本文标题:Java 面试系列:集合详解之 Collection + 面试题

          本文链接:https://www.haomeiwen.com/subject/rbmebktx.html