美文网首页
Java容器:List

Java容器:List

作者: CieloSun | 来源:发表于2017-07-02 14:50 被阅读0次

    今天开始更新Java集合类相关博客,暂时打算分为List,Set,Map三个部分讲解,先出一个原型博客然后迭代更新(PS:依稀记得某些算法博客我也是这么说的然后原型写完就没后续了.......)。在讲最简单的List之前,先介绍下Collection接口的所有相关类的层次结构。

    1. 集合类的层次关系

    Java类的集合关系如图:

    具体而言,Collection相关的类关系如下:

    • Collection<--List<--Vector
    • Collection<--List<--ArrayList
    • Collection<--List<--LinkedList
    • Collection<--Set<--HashSet
    • Collection<--Set<--HashSet<--LinkedHashSet
    • Collection<--Set<--SortedSet<--TreeSet
    • Collection<--Queue
    • Map<--SortedMap<--TreeMap
    • Map<--HashMap

    2. List接口简介

    List是有序的Collection,有以下几个特性:

    • 元素可以使用索引去访问,类似于Java的数组。
    • 具有列表的功能,元素的顺序是按照添加的先后排序的。
    • 允许重复元素和null元素。

    3. List的常用方法

    // C增:初始化,以ArrayList()为例
    List list = new ArrayList();
    // C增:向列表的尾部追加指定的元素  
    list.add("lwc");  
    // C增:在列表的指定位置插入指定元素  
    list.add(1, "nxj");  
    // C增:追加指定 collection 中的所有元素到此列表的结尾  
    list.addAll(new ArrayList());  
    // U更:用指定元素替换列表中指定位置的元素  
    list.set(0, "lp");  
    // R查:如果列表包含指定的元素,则返回true  
    list.contains("nxj");  
    // R查:如果列表包含指定 collection 的所有元素,则返回 true  
    list.containsAll(new ArrayList());  
    // R查:比较指定的对象与列表是否相等  
    list.equals(new ArrayList());  
    // R查:返回列表中指定位置的元素  
    list.get(0);  
    // R查:返回列表的哈希码值
    list.hashCode();  
    // R查:返回列表中首次出现指定元素的索引,如果列表不包含此元素,则返回 -1  
    list.indexOf("lwc");  
    // R查:返回列表中最后出现指定元素的索引,如果列表不包含此元素,则返回 -1  
    list.lastIndexOf("lwc");  
    // R查:如果列表不包含元素,则返回 true  
    list.isEmpty();  
    // R查:返回包含列表中的所有元素的Object[]数组  
    list.toArray();  
    // R查:返回包含列表中所有元素的数组,可以用参数指定对象类型  
    list.toArray(new String[] { "a", "b" });  
    // R查:返回列表中的元素数  
    list.size();  
    // R查:返回列表中指定的fromIndex(包括)和toIndex(不包括)之间的视图,即其中内容仍为原List对象中内容,若更改会影响原List对象。  
    list.subList(1, 2);  
    // D删:移除列表中指定位置的元素  
    list.remove(0);  
    // D删:移除列表中出现的首个指定元素  
    list.remove("lwc");  
    // D删:从列表中移除指定 collection 中包含的所有元素  
    list.removeAll(new ArrayList());  
    // D删:从列表中移除所有元素  
    list.clear();  
    

    4. List实例

    4.1. Vector

    Vector是基于数组的List,相当于给数组添加了一些方便调用的功能。因此,它难以避免一些数组的限制,且性能也不会超过数组。Vector和ArrayList的区别是Vector中各方法是synchronized修饰的方法。而ArrayList中各方法没有synchronized修饰。因而,Vector是线程安全的而ArrayList不是,这也是它们最大的区别。

    4.2. ArrayList

    和Vector一样是基于数组的一种List结构,和Vector相比,由于其方法没有被synchronized修饰,因此有着更好的性能,但是在多线程环境下需要十分小心。

    4.3. Vector和ArrayList的扩容

    由于Vector和ArrayList是基于数组的,当数组的容量不够时(默认的初始容量是10,可以通过构造器自己设置),将会发生1.5倍扩容。易知如果扩容长度为2倍,那么新的数组无法利用扩容时释放的旧数组内存。当然,选择2倍在时间上要优于1.5倍。

    4.4. LinkedList

    不同于ArrayList和Vector,LinkedList如其名是不基于数组而是基于链接表的。因此,LinkedList的性能是不受数组限制的。LinkedList的节点构成如下:

        private static class Node<E> {
            E item;
            Node<E> next;
            Node<E> prev;
    
            Node(Node<E> prev, E element, Node<E> next) {
                this.item = element;
                this.next = next;
                this.prev = prev;
            }
        }
    

    我们可以看到,LinkedList基于一个双向链接表,因此,当进行List中间位置的删除/添加工作时,LinkedList不会像ArrayList一样需要改动整个数组,仅仅对相关节点进行改动即可。但同时,在进行查询任务时,LinkedList的性能将劣于ArrayList。

    5. 参考文章

    JAVA集合类汇总

    Java Collection

    相关文章

      网友评论

          本文标题:Java容器:List

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