我们知道,List是Java编程中经常使用的集合之一,但List到底有哪些不为人知的地方,List为什么被使用的这么多?今天千锋就为大家分析一下关于List的那点事儿。
List本身其实是一个接口,继承自Collection接口,所以List存储元素的特点是单元素,区别于Map(双元素集合),JDK8为List接口提供了10个实现类,供开发人员使用。为什么提供那么多的实现类呢?因为在实际开发场景下需要根据业务的不同选择不同的实现类来使用,这就要求大家对实现类的特点都要加以掌握,才能再实际的开发中运用自如。有些菜鸟一个ArrayList走天下^!^。大家可以先看看下面我总结的List子类图:
接下来我会给大家对以上几个类进行简要介绍。
从源码中可以看到,这个类是抽象类无法进行实例化。该类实现了迭代器和列表迭代器,同时也实现了get(int),set(int, E),add(int, E),remove(int)方法,如果子类有更好的处理方式可以覆盖这些方法。
此抽象类实现由连续访问数据存储所需的工作(如链表),它实现了对列表的列表迭代器顶部的随机访问方法get(int),set(int index,E element),add(int index,E element)和remove(int index)
此类为主要实现类之一,实际开发过程中经常使用。主要完成可调整大小的集合(基于数组实现),每个ArrayList实例都有一个容量。容量是用于存储列表中的元素的数组大小。请注意此实现线程不安全。
此类是ArryList的子类,是对ArrayList的扩展。表示MBean属性值的列表(MBean参见jdk官方文档)
此类是一个线程安全的变体ArrayList,其中所有可变操作(add,set,remove等等)通过对底层数组的最新副本实现。在多线程情况下使用较频繁
此类基于双向链表实现List接口。实现所有可选列表操作,并允许所有元素(包括null)。请注意,此实现不同步。
RoleList表示角色列表(Role对象)。在创建关系时用作参数,并且尝试在关系中设置多个角色。
RoleUnresolvedList表示RoleUnresolved对象的列表,表示由于在尝试访问(读取或写入)角色时遇到问题,不会从关系中检索到角色。
Stack类代表最先进先出(LIFO)堆栈的对象。 它扩展了类别Vector与五个操作,允许一个向量被视为堆栈。 设置在通常的push和pop操作,以及作为一种方法来peek在堆栈,以测试堆栈是否为empty的方法,以及向search在栈中的项目的方法在顶部项目和发现多远它是从顶部。
当首次创建堆栈时,它不包含任何项目
此类实现了可扩展的对象数组。 像数组一样,它包含可以使用整数索引访问的组件。 但是, Vector的大小可以根据需要增长或缩小,以适应在创建之后添加和删除项目。因操作速度较慢,故基本不适用,但却是线程安全,建议使用ArrayList代替Vector。
好了,以上就是千锋给大家分析的List基本内容,现在你对List的认识是不是更深刻了呢?