关于java.util.List接口(单个方式存储元素)
一、List集合接口中的常用方法
- List集合存储元素的特点:有序可重复
——有序:存进去的顺序和取出来的顺序相同,集合中的元素有下标,从0开始以1递增
——可重复:存储进去一个1,可以再存进去一个1- List集合继承了Collection接口,继承了Collection集合中的方法时,也具有自己“特有”的方法:
——以下只列出List接口特有的常用的方法:
void
add(int index, E element): 在集合的指定下标位置插入指定元素。E
get(int index):获得集合中指定下标位置的元素。E
set(int index, E element):把集合中指定下标位置的元素替换为指定元素。int
indexOf(Object o):返回此集合中第一次出现指定元素的索引;如果集合中不包含该元素,则返回 -1。int
lastIndexOf(Object o):返回此集合中最后出现指定元素的索引;如果集合中不包含此元素,则返回 -1。E
remove(int index):移除集合中指定下标位置的元素。
二、ArrayList集合
- ArrrayList集合是非线程安全的。
- ArrayList集合默认初始化容量为10(底层先创建了一个长度为0的数组,当添加第一个元素的时候,初始化容量为10)
- ArrayList集合的扩容:默认扩容到原容量的1.5倍。
- ArrayList集合底层是一个Object[ ]数组
- 数组的优点:检索效率高(每个元素占用的空间大小相同,内存地址是连续的,知道首元素内存地址,然后知道下标,通过数学表达式计算出元素的内存地址,所以检索效率最高)
- 数组的缺点:随机增删元素效率比较低,另外数组无法存储大数据量(很难找到一块非常巨大的连续的内存空间)
注:但在数组末尾添加元素效率还是很高的,是不受影响的。
- ArrayList的构造方法:
——new ArrayList(); //默认初始化容量
——new ArrayList(20); //自定义初始化容量- ArrayList集合底层是数组,怎么优化?
——尽可能的减少扩容次数。因为数组扩容效率比较低,建议在使用ArrayList集合的时候预估计元素的个数,给定一个初始化容量。- 将线程不安全的ArrayList集合转换为线程安全的
——java.util.Collections:集合工具类
——使用 Collections.synchronizedList() 方法- 所有集合中,ArrayList集合用的比较多
——因为往数组末尾添加元素时效率是不受影响的,另外在使用检索/查找某个元素的操作比较多。
三、LinkedList集合
- LinkedList集合没有初始化容量(最初这个双向链表中没有任何元素。first和last引用都是null的)
- LinkedList集合底层是一个双向链表
- 链表的优点:由于链表上的元素在空间存储上内存地址不连续,所以随机增删元素的时候不会有大量的元素位移,因此随机增删效率较高。
- 链表的缺点:不能通过数学表达式计算被查找元素的内存地址,每一次查找都是从头节点开始遍历,直到找到为止,所以LinkedList集合检索/查找效率较低。
- 链表数据结构示意图:
- 单向链表
- 双向链表(LinkedList集合)
- 案例
public class LinkedListTest01 { public static void main(String[] args) { List list = new LinkedList(); list.add("a"); list.add("b"); list.add("c"); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } } }
四、Vector集合
- Vector集合是线程安全的。
——Vector集合中所有方法都是线程同步的,都带有synchronized关键字,是线程安全的,效率较低,使用较少- Vector集合默认初始化容量是10。
- Vector集合的扩容:默认扩容到原容量的2倍。
- Vector集合底层是一个Object[ ]数组