List接口及其实现类支持索引 有序的collection , 允许重复
Collection中没有 get set add remove
add(int index,Object obj) 在指定索引处插入(与添加区分)list.add(0, "周芷若"); 无返回值 Collection中没有此方法
add(Object obj) 向列表的尾部添加指定的元素 add(3); 返回boolean类型
set(int index,Object obj) 在指定索引处修改 list.set(0, "小昭");
get(int index)获取 System.out.println(list.get(2));
remove(int index) 删除 list.remove(0); 无返回值
indexOf(Object obj) 返回第一次出现索引 没有则返回-1
lastIndexOf(Object obj) 返回最后一次出现的索引 没有则返回-1
list集合遍历方法
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Object object = iterator.next();
System.out.println(object);
}
for (Object object : list) {
System.out.println(object);
}
for(int i=0;i<list.size();i++){
Object object = list.get(i);
System.out.println(object);
}
List接口的实现类——ArrayList
特点:
有序 有索引 允许重复 底层是 数组结构,可以理解成是一个Object类型的数组 底层也是通过新建数组来扩容的
构造器:
new ArrayList(); 构造一个初始容量为10的集合,当添加第11个元素时,会扩容一半 (Vector每次扩容一倍)
new ArrayList(int capcity) ;构造一个初始容量为capcity的集合
方法: 基本都是List里的方法。
List接口的实现类——LinkedList
特点:
底层 是 双向链表结构(prev , next)
有序 有索引 允许重复
构造器:
new LinkedList();//构造一个空链表
常见方法:
addFirst 添加到首位,addLast 添加到末尾,removeFirst 删除首位,removeLast 删除末尾,getFirst 获取首位,getLast 获取末尾,add(int index, E element),set(int index, E element) 修改,toArray() 转换成数组
toArray() 方法说明:
【强制】使用集合转数组的方法,必须使用集合的toArray(T[] array),传入的是类型完全一样的数组,大小就是list.size()。
说明:使用toArray带参方法,入参分配的数组空间不够大时,toArray方法内部将重新分配内存空间,并返回新数组地址;如果数组元素大于实际所需,下标为[ list.size() ]的数组元素将被置为null,其它数组元素保持原值,因此最好将方法入参数组大小定义与集合元素个数一致。 正例:
List<String> list = new ArrayList<String>(2);
list.add("guan");
list.add("bao");
String[] array = new String[list.size()];
array = list.toArray(array);
反例:直接使用toArray无参方法存在问题,此方法返回值只能是Object[]类,若强转其它类型数组将出现ClassCastException错误
LinkedList和ArrayList的对比
底层结构 增删 改,查
ArrayList 数组 效率较低 效率较高
LinkedList 链表 效率较高 效率较低
注意:更专业的说法是: ArrayList在通过索引查找的时候效率更快,如果不加索引和LinkedList一样,都是一个一个的查要修改要先查找,所以同理
当ArrayList容量够不涉及扩容并且是给最后增加元素比LinkedList还快,往中间加或者扩容时就不行了,这种情况就是LinkedList快删除同理
Vector和ArrayList的对比 (vector使用同ArrayList)
底层结构 线程同步 安全性 效率 版本
ArrayList 数组 不同步 不安全 高 新
Vector 数组 同步 安全 低 老
Vector 每次扩容扩一倍,ArrayList扩一半