在List集合中
- 允许存在重复元素
- 允许null元素的存在 并且可以存储多个null
- list 是有序集合 (有序:存入顺序和遍历顺序一致)
- 可以通过索引来精确控制集合中的元素 并且索引是从0开始
- 通过get(int index) 获取元素的时候 如果超出了列表的长度 则会出现异常 IndexOutOfBoundsException
- JDK API 中 List 接口的实现类常用的有: ArrayList、 LinkedList 和 Vector。
List的常用方法:
void add(int index, Object ele): 在index位置插入ele元素
boolean addAll(int index, Collection eles): 从index位置开始将eles中的所有元素添加进来
Object get(int index): 获取指定index位置的元素
int indexOf(Object obj): 返回obj在集合中首次出现的位置
int lastIndexOf(Object obj): 返回obj在当前集合中末次出现的位置
Object remove(int index): 移除指定index位置的元素,并返回此元素
Object set(int index, Object ele): 设置指定index位置的元素为ele
List subList(int fromIndex, int toIndex): 返回从fromIndex到toIndex位置的子集合
List实现类之一:ArrayList
- ArrayList 是 List 接口的典型实现类、主要实现类
- ArrayList 本质是:Object类型的数组
- ArrayList 该实现不是线程安全的
- 当列表初始容量满的时候 则会自动扩容 按照初始容量的1.5倍进行扩充
- ArrayList的JDK1.8之前与之后的实现区别?
- JDK1.7: ArrayList像饿汉式,直接创建一个初始容量为10的数组
- JDK1.8: ArrayList像懒汉式,一开始创建一个长度为0的数组,当添加第一个元素时再创建一个始容量为10的数组
常见面试题:
public class ArrayListTest {
public static void main(String[] args) {
List list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
updateList(list);
System.out.println(list); //输出 [1, 2]
}
private static void updateList(List list) {
list.remove(2);
}
}
实现 List 的逆序遍历,前提是必先正序遍历
public class ArrayListTest {
public static void main(String[] args) {
List list = new ArrayList();
list.add("AAA");
list.add("BBB");
list.add("EEE");
list.add("DDD");
list.add("CCC");
//获取特有的迭代器
ListIterator iterator = list.listIterator();
//正序遍历
while (iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println("------------------");
//逆序
while (iterator.hasPrevious()){
System.out.println(iterator.previous());
}
}
}
List实现类之二:LinkedList
- 对于频繁的插入或删除元素的操作,建议使用LinkedList类,效率较高
- 新增方法:
- void addFirst(Object obj)
- void addLast(Object obj)
- Object getFirst()
- Object getLast()
- Object removeFirst()
- Object removeLast()
public static void main(String[] args) {
LinkedList list = new LinkedList();
list.add("AAA");
list.add("BBB");
list.add("EEE");
list.add("DDD");
list.add("CCC");
list.addFirst(1111); //将当前元素增加到链表头
list.addLast(2222); //将当前元素增加到链表尾
System.out.println(list.getFirst()); //获取头元素
System.out.println(list.getLast()); //获取尾元素
list.removeFirst();//移除头元素
list.removeLast();//移除尾元素
//获取迭代器
Iterator iterator = list.listIterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
List实现类之三:Vector
- Vector是线程安全的
- 在各种list中,最好把ArrayList作为缺省选择。当插入、删除频繁时,使用LinkedList; Vector总是比ArrayList慢,所以尽量避免使用。
- 新增方法:
- void addElement(Object obj)
- void insertElementAt(Object obj,int index)
- void setElementAt(Object obj,int index)
- void removeElement(Object obj)
- void removeAllElements()
常见面试题:ArrayList/LinkedList/Vector的异同?
- ArrayList 和 LinkedList 的异同:
- 二者都线程不安全,相对线程安全的 Vector,执行效率高。
- ArrayList 是实现了基于动态数组的数据结构, LinkedList 基于链表的数据结构。
- 对于随机访问get和set, ArrayList觉得优于LinkedList,因为LinkedList要移动指针。对于新增和删除操作add(特指插入)和remove, LinkedList比较占优势,因为ArrayList要移动数据。
- ArrayList 和 Vector 的区别:
- Vector 和 ArrayList 几乎是完全相同的,唯一的区别在于Vector是同步类(synchronized),属于强同步类。因此开销就比 ArrayList 要大,访问要慢。
- 正常情况下,大多数的Java程序员使用 ArrayList 而不是 Vector ,因为同步完全可以由程序员自己来控制。 Vector 每次扩容请求其大小的2倍空间,而ArrayList 是1.5倍。 Vector 还有一个子类 Stack。