文章目录
List接口及常用方法
List接口实现的常用方法测试
package com.senior.collectionuse;
import org.junit.Test;
import java.util.*;
/**
* @author eden
* @Description
* @create projectTest-com.senior.collectionuse:2021-05-12-15:09
* @since
*/
public class ListInterface {
@Test
public void arrayListTest() {
ArrayList arrayList = new ArrayList();
arrayList.add(123);
arrayList.add(452);
arrayList.add("hello");
arrayList.add(567);
arrayList.add(567);
System.out.println(arrayList);
//添加元素到指定位置
arrayList.add(1, "world");
System.out.println(arrayList);
Collection coll = new ArrayList();
coll.add("eden");
coll.add("jjjj");
//添加一个collection实现类的所有元素到指定位置
System.out.println(arrayList.addAll(arrayList.size() - 2, coll));
System.out.println(arrayList);
//Arrays.asList()生成一个list对象
List<Integer> integers = Arrays.asList(1, 2, 3);
arrayList.addAll(arrayList.size(), integers);
System.out.println(arrayList);
//获取指定索引位置的元素,返回的是Object类
System.out.println(arrayList.get(3));
//obj首次出现的索引位置
System.out.println(arrayList.indexOf(567));
//obj最后一次出现的索引位置
System.out.println(arrayList.lastIndexOf(567));
System.out.println(arrayList.set(1, "AAA"));//world,注:返回被替换的元素
System.out.println(arrayList);
//subList返回一个新的提取出来的list,并不会覆盖原有的
System.out.println(arrayList.subList(2, 4));//[452, hello]
System.out.println(arrayList);//[123, AAA, 452, hello, eden, jjjj, 567, 567, 1, 2, 3]
//遍历
//方式一
Iterator iterator = arrayList.iterator();
while(iterator.hasNext())
{
System.out.println(iterator.next());
}
//方式二:
for (Object arr: arrayList) {
System.out.println(arr);
}
}
}
ArrayList源码分析
jdk7和jdk8略有不同(jdk11另说)
JDK7的版本下:
- ArrayList arrayList = new ArrayList();底层创建了长度为10的数组
- 默认情况下会扩容为原来容量的1.5倍
JDK8版本下:
- ArrayList arrayList = new ArrayList();底层初始化为{},并未创建长度为10的数组
- JDK7数组的创建类似于单例设计模式的饿汉模式,而JDK8则类似于懒汉模式,JDK11亦如此
LinkedList源码分析(JDK8):
- LinkedList linkedList = new LinkedList();//LinkedList内部定义了Node类,
- 用来表示节点,Node定义为:
-
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; } }
Vector源码分析(JDK11):
- 初始化默认创建长度为10的数组
- 扩容方式与ArrayList不同,需要扩容是如果手动给出了扩容增量capacityIncrement,那么每次就按照这个增量capacityIncrement扩容,否则就扩容为原来的2倍
ArrayList\LinkedList\Vector三者的异同点?
- 同:三个类都是List接口的实现类,存放的数据都是有序且可以重复的,并且可以动态扩容
- 不同:ArrayList线程不安全,效率高;Vector线程安全,效率低。LinkedList底层使用双向链表存储,对于频繁的插入删除操作使用这类容器,效率较高。ArrayList和Vector底层使用数组存储。
该博客图片来源于尚硅谷宋老师教学课件