List接口:存储有序、可重复数据。
- JDK API中List接口的实现类常用的有:ArrayList、LinkedList和Vector。
List接口特有常用方法:(由于继承了Collection接口,所以Collection接口下的方法他也可以使用)
*.get(index)
:根据下标获取元素值*.indexOf(*)
:XX值在某个集合中首次出现某元素的位置*.lastIndexOf(*)
:XX值从末尾开始往前遍历,首次出现的位置*.remove(int index)
移除指定index位置的元素,并返回此元素
示例:`Object remove = list.remove(1);`
*.set(int 下标, Object 替换值)
设置指定index位置的元素为指定替换值*. add(int index, Object *)
:在index位置插入指定的元素*.subList(int fromIndex, int toIndex)
返回从fromIndex到toIndex位置的左闭右开区间的子集合(前包含后不包含)
示例:`List zijihe = list.subList(1, 2);`
boolean addAll(int index, Collection eles)
:从index位置开始将eles中的所有元素添加进来,返回一个布尔值来表示是否操作成功
ArrayList:作为List主要实现类,底层是动态数组实现,线程不安全
ArrayList源码分析:
当:ArrayList list = new ArrayList();
时
第一步:底层创建Object[] elementData,默认{} ,没有指定长度。
第二步:当调用list.add("abc"); 创建长度为10的数组,并赋值
第三步:填入数据。。。。。。
第四步:当数据将此集合容量填满时,集合容量会扩大为原来的1.5倍
---
LinkedList:对于频繁的插入、删除操作,使用此类效率比ArrayList高;底层使用双向链表存储
LinkedList list = new LinkedList();
内部声明了Node类型的first和last属性,默认值为null
`list.add(123);`将123封装到Node中,创建了Node对象。其中,Node定义为:体现了LinkedList的双向链表的说法
- 和Arraylist不同的是,其底层实现并不是数组,而是双向链表,所以自然也没有扩容什么的相关操作
- 双向链表,内部没有声明数组,而是定义了Node类型的first和last,用于记录首末元素。同时,定义内部类Node,作为LinkedList中保存数据的基本结构。Node除了保存数据,还定义了两个变量: prev变量记录前一个元素的位置,next变量记录下一个元素的位置
Vector:(弃用)作为List接口的古老实现类;线程安全的,效率低;底层使用Object[] elementData存储
大多数操作与ArrayList相同,区别之处在于Vector是线程安全的。
Vector扩容是原数组的两倍
请问ArrayList/LinkedList/Vector的异同?ArrayList底层是什么?扩容机制?Vector和ArrayList的最大区别?
ArrayList和LinkedList的异同
- 二者都线程不安全,相对线程安全的Vector,执行效率高。
- ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。对于
随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。对于新增
和删除操作add(特指插入)和remove,LinkedList比较占优势,因为ArrayList要移动数据。
ArrayList和Vector的区别
- Vector和ArrayList几乎是完全相同的,唯一的区别在于Vector是同步类(synchronized),属于
强同步类。访问要慢。 - Vector每次扩容请求其大小的2倍空间,而ArrayList是1.5倍。Vector还有一个子类Stack
- Vector和ArrayList几乎是完全相同的,唯一的区别在于Vector是同步类(synchronized),属于