常用的List集合
List的实现类
ArrayList 集合
特点:数组结构,查询快,增删慢,运行效率快,线程不安全
1、三个实现接口:Serializable、Cloneable、RandomAccess
Serializable:
类的序列化由实现java.io.Serializable接口的类启用。 不实现此接口的类将不会使任何状态序列化或反序列化。 可序列化类的所有子类型都是可序列化的。 序列化接口没有方法或字段,仅用于标识可串行化的语
义。
Cloneable:
一个类实现 Cloneable 接口来指示 Object.clone() 方法,该方法对于该类的实例进行字段的复制是合
法的。在不实现 Cloneable 接口的实例上调用对象的克隆方法会导致异常 CloneNotSupportedException 被抛
出。简言之:克隆就是依据已经有的数据,创造一份新的完全一样的数据拷贝
RandomAccess:
标记接口由 List 实现使用,以表明它们支持快速(通常为恒定时间)随机访问。此接口的主要目的是允许通用算法更改其行为,以便在应用于随机访问列表或顺序访问列表时提供良好的性
能。
2、构造方法:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ga0U2FDj-1594730356142)(C:\Users\Administrator\Desktop\我的随笔\List集合\images\QQ截图20200713205737.png)]
3、问题:
ArrayList的扩容:
第一次扩容10
以后每次都是原容量的1.5倍
ArrayList的频繁扩容导致性能降低如何改进
在可预知的范围内指定构造方法中传入指定的大小
ArrayList插入或删除元素一定比LinkedList慢么
- 数组删除元素确实要比链表慢,慢在需要创建新数组,还有比较麻烦的数据拷贝,但是在ArrayList
底层不是每次删除元素都需要扩容,因此在这个方面相对于链表来说数组的性能更好
- LinkedList删除元素之所以效率并不高,其原理在于底层先需要对整个集合进行折半的动作,然后
又需要对集合进行遍历一次,这些操作导致效率变低
ArrayList在使用迭代器遍历时,进行集合的增删操作则会抛出并发修改异常,如何避免这一问题?
public class ListDemo {
public static void main(String[] args) {
// 创建List集合对象
List list = new ArrayList();
// 添加元素
list.add("中国");
list.add("美国");
list.add("日本");
// 迭代器遍历 出现异常
// Iterator it = list.iterator();
// while (it.hasNext()) {
// String s = (String) it.next();
// if ("中国".equals(s)) {
// list.add("韩国");
// }
// }
// 方案1:迭代器迭代元素,迭代器修改元素
// 而Iterator迭代器却没有添加功能,所以我们使用其子接口ListIterator
// ListIterator lit = list.listIterator();
// while (lit.hasNext()) {
// String s = (String) lit.next();
// if ("中国".equals(s)) {
// lit.add("韩国"); //使用迭代器对象代替集合对象则避免了这一问题
// }
// }
// 方案2:集合遍历元素,集合修改元素(普通for)
for (int x = 0; x < list.size(); x++) {
String s = (String) list.get(x);
if ("中国".equals(s)) {
list.add("韩国");
}
}
System.out.println("list:" + list);
}
}
已知成员变量集合存储N多用户名称,在多线程的环境下,使用迭代器在读取集合数据的同时如何保证还可以正常的写入数据到集合?
使用CopyOnWriteArrayList集合(线程安全的)来取代ArrayList
ArrayList集合和LinkedList集合的区别?
ArrayList:
- 基于动态数组的数据结构
- 对于随机访问的get和set,ArrayList要优于LinkedList
- 对于随机操作的add和remove,ArrayList不一定比LinkedList慢 (ArrayList底层由于是动态数组,因此并不是每次add和remove的时候都需要创建新数组)
LinkedList:
- 基于链表的数据结构
- 对于顺序操作,LinkedList不一定比ArrayList慢
- 对于随机操作,LinkedList效率明显较低
Vector 集合
数组结构,查询快,增删慢,运行效率慢,线程安全
1、Vector继承于AbstractList,实现了List、RandomAccess、Cloneable、 Serializable等接口。
2、构造方法
构造方法 | 构造方法描述 |
---|---|
Vector(int initialCapacity, int capacityIncrement) | 指定Vector的初始容量和扩容时增长系数 |
Vector(int initialCapacity) | 指定初始容量 |
Vector() | 指定了Vector的初始容量为10 |
Vector(Collection<? extends E> c) | 传入一个集合 |
3、Vector查找元素时,是分为元素为null和不为null两种方式来判断的,这也说明Vector允许添加null元素;同时,如果这个元素在Vector中存在多个,则只会找出从index开始,最先出现的那个。
4、增删的方法被synchronized 关键字修饰,因此为线程相对安全安全
LinkedList 集合
双向链表结构,增删快,查询慢,线程不安全