List接口、ArrayList集合、LinkedList集合、Vector集合

一、list接口的特点

list集合存储元素的特点:有序可重复

  • 有序:List集合中的元素有下标。从0开始,以1递增
  • 可重复:存储1,还可以再存储1

二、List接口的常用方法

1、在集合末尾添加元素:void add(Object element)

2、在指定下标添加元素:void add(int index , Object element)

这个方法使用不多,因为对于ArrayList集合来说效率较低。

3、根据下标获取元素:Object get(int index)

因为有下标,所以List集合有自己比较特殊的遍历方式。

通过下标遍历

for (int i = 0; i < List.size() ; i++){
    
    
	Object o = List.get(i);
	System.out.println(o); 
}

4、获取指定对象第一次出现处的索引(下标):int indexof(Object o)

5、获取指定对象最后一次出现处的索引(下标):int lastIndexOf(Object o)

6、删除指定下标位置的元素:Object remove(int index)

7、修改指定下标元素:Object set(int index,Object element)

三、ArrayList集合

  • ArrayList集合底层采用了数组这种数据结构,底层是Object类型的数组Object []

  • ArrayList集合是非线程安全的

  • 数组优点检索效率比较高

  • 数组的缺点随机增删元素的效率比较低。(向数组末尾添加、删除元素、效率还是很高的)、数组无法存储大数据量(无法找到一块非常巨大的连续的内存空间。)

  • 但是ArrayList集合是往数组末尾添加元素,效率不受影响。

List list1 = new ArrayList();//默认初始化容量为10
List list2 = new ArrayList(20);//指定初始化容量

1、ArrayList集合初始化容量

ArrayList集合默认初始化容量为:10(底层先创建了一个长度为0的数组,当添加第一个元素的时候,初始化容量为10)

2、ArrayList集合扩容

源代码的grow方法中使用了位运算:int newCapacity = oldCapacity + (oldCapacity >> 1);

10的二进制位:00001010
10的二进制右移1位是:00000101【5】

结论:一次扩容到原来的1.5倍

建议给定一个预估计的初始化容量,减少数组的扩容次数,这是ArrayList集合比较重要的优化策略。

3、ArrayList集合的构造方法

第一种方法:

List list1 = new ArrayList();
List list2 = new ArrayList(100);

第二种方法:

  • 1、先创建一个HashSet集合
  • 2、将HashSet集合转换为ArrayList集合:List list3 = new ArrayList(c);
Collection c = new HashSet();
c.add(100);
c.add(200);
c.add(300);
c.add(400);

List list3 = new ArrayList(c);

四、LinkedList集合

LinkedList集合没有初始化容量,且不需要扩容

ListedList底层是一个双向链表
在这里插入图片描述

1、链表的优点

由于链表上的元素在空间存储上内存地址不连续
所以随机增删元素的时候不会有大量元素位移,因此随机增删元素的效率较高。(因为增删元素不涉及到大量元素位移)

在以后的开发中,如果遇到随机增删集合中的元素的业务比较多时,建议使用LinkedList。

2、链表的缺点

不能通过数学表达式计算被查找元素的内存地址,每一次查找都是从头结点开始遍历,直到找到为止。所以LinkList集合检索/查找的效率较低

查阅效率较低,每一次查找某个元素的时候都需要从头结点开始往下遍历。

五、Vector集合

Vector集合底层调用了数组这种数据结构。

Vector集合是线程安全的。

Vector所有的方法都有synchronize关键字修饰所以线程安全,但是效率较低。现在保证线程安全有别的方案了,所以Vector用的较少

关于Vector集合的扩容

Vector集合的初始化容量为10

扩容之后是原容量的2倍。

将线程不安全的ArrayList集合转换为线程安全的

使用集合工具类: java.util.Collections

注意:

  • java.util.Collection是集合接口
  • java.util.Collections是集合工具类
List myList = new ArrayList();//非线程安全

//变成线程安全的
Collections.syncjronizedList(myList);

myLoxt.add("111");
myLoxt.add("222");
myLoxt.add("333");

猜你喜欢

转载自blog.csdn.net/qq2632246528/article/details/114337396