List 接口
常见的实现类:ArrayList、LinkedList、vector
List 排序:
- 使用 List 自带的 sort() 方法
- 使用 Collection.sort() 方法
Arrays.aslist((T... a):可以将多个相同类型的数据转化为长度固定的列表
注意:该方法强调了列表的长度是固定的,因此不能使用 List 中的 add 和 remove 方法修改 List 长度,否则会报
UnsupportedOperationException 异常
List和Array的相互转换:
- List ---> Array
List<String> list = new ArrayList();
list.add("hello");
list.add("world");
//不传参数,只能转为Object类型的数组
Object[] objects = list.toArray();
//传了参数,就可以转化成对应的类型
String[] arr ={};
String[] array = list.toArray(arr);
- Array --->List
String[] array = {"hello","world"};
List<String> list = Arrays.asList(array);
ArrayList
基于数组的实现,在内存中分配连续空间,读取快,修改慢,非线程安全,效率高
-
底层结构是数组,且数组默认长度为10(必须使用 add 方法之后才为10,不然为 0)
-
可以通过有参构造函数指定数组长度
List list1 = new ArrayList() //数组长度默认为0 list1.add("hello"); //执行完add方法之后默认长度才变为10 List list2 = new ArrayList(15) //数组长度直接为15,不用执行add方法
注意: 底层数组长度默认为0,但执行了add方法后默认就变为10了
-
扩容机制
执行 add 方法的时候,在添加元素之前会先比较元素的个数与底层数组的大小,如果相等,则会进行扩容,扩容之后再添加,如果不相等则直接添加
扩容的本质:创建一个长度为原来1.5倍的新数组,并且将旧数组的数据复制到新数组
elementData = Arrays.copyOf(elementData,newCapacity(minCapacity));
newCapacity = oldCapacity + ( oldCapacity >> 1 ) //jdk1.8
newCapacity = ( oldCapacity * 3 ) / 2 +1 //jdk1.6
LinkedList
底层采用了链表的形式存储,用双指针实现了队列的数据结构(先进先出),读取慢,修改快,线程不安全
vector
Vector的底层也是通过数组实现的,查询快,增删慢 , 线程安全,但是效率低
- 底层数组默认大小也为10,但是不用执行add方法,而是在创建时长度就为10
- 扩容机制与 ArrayList 相似,有一点不同,它可以设置扩容时的容量增长大小(默认新数组长度为原来的2倍)
//默认情况,capacityIncrement = 0,即新长度变为原来的2倍
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);