List 特性: 这里针对的是 Set 相比较
1. 有序的
2. 不唯一的,可重复的;
3 有索引的;
List 规定了 独有的规则(方法):
增加元素的方法:
void add(int index, E element) 在列表的指定位置插入指定元素(可选操作);
boolean addAll ( int index , Collection c) 将指定 collection 中的所有元素都插入到列表中的指定位置(可选操作);
获取元素的方法:
Object get(int index) 返回列表中指定位置的元素;
List<E> subList(int fromIndex, int toIndex) 返回列表中指定的 fromIndex(包括) 和toIndex(不包括)之间的部分视图;
从 fromIndex 开始,到 toIndex 结束,但不包括 toIndex 处的元素;注意索引,不要超出了size;
查询元素的方法:
int indexOf(Object o) 返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1 ;
int lastIndexOf(Object o) 返回此列表中最后出现的指定元素的索引;如果列表不包含次元素,则返回 -1 ;
删除元素的方法:
E remove(int index) 移除列表中指定位置的元素(可选操作);注意索引,不要超出size;
改变元素的方法:
E set(int index, E element) 用指定元素替换列表中指定位置的元素(可选操作);
List 遍历方式:
1. for 循环 list独有; 速度慢,但是可以更改每一个值;
2. foreach 速度快,调用 iterator,但是不能改变数值;
3. iterator 速度最快,可以有一些修改数值的操作;
推荐2,3 Collection 家族通用的遍历方式;
ArrayList 实现类
ArrayList 学习:
底层:
可变数组,数组可以扩容,减容;
transient Object[] elementData;
所有的构造器都在给 elementData 赋值;
elementData 就是 底层的数组;
扩容: 每次的新容量都是之前的 1.5 倍;
但不是所有类型都是扩容 1.5 倍;
int newCapacity = oldCapacity + (oldCapacity >> 1);
特性:
可以为null;
线程不安全;
ArrayList 特殊方法:
void ensureCapacity(int minCapacity) 如有必要,增加此 ArrayList 实例的内容,以确保它至少能够容纳最小容量参数所指定的元素数;
protected void removeRange(int fromIndex, int toIndex) 移除列表中索引在 fromIndex(包括) 和 toIndex (不包括) 之间的所有元素;
void trimToSize() 将此 ArrayList 实例的容量调整为列表的当前大小;
总结:
ArrayList 都是在操作数组;
数组是内存中一块连续的空间;
ArrayList 查询速度快;
ArrayList 增删元素慢;
每次 增加 或 删除 元素,都需要改变整个数组; 牵一发而动全身;
LinkedList 学习
链表结构:
单向链表;
双向链表;
循环链表;
LinkedList 底层使用链表,双向循环链表;
1.7之后 去掉了 head 成为 双向链表,底层变化很大
特性:
查询速度慢;
增删速度快;
总结:
前提 如果需要使用 List 的实现类;
当查询用的多时,使用 ArrayList;
当增删用的多时,使用 LinkedList;
??并且 LinkedList 没有自己特殊的方法 linkedlist 自己独特的方法 多得很
Vector 类 学习:
底层基于数组,基本操作都是在操作底层的数组;
和 ArrayList 的底层基本原理相同; 但是同步,也就是 带 synchronized 锁,安全性高!
特性:
相对 ArrayList 而言
效率低;
线程安全;
相对 LinkedList 而言
查询快;
增删慢;