List

Java中List包括List接口和List接口的所有实现类。
List接口
List接口的常用实现类有ArrayList和LinkedList,在使用List集合时,通常情况下声明为List类型,实例化时根据实际情况的需要,实例化为ArrayList或LinkedList。
特点

  1. 有序(存储有序)

  2. 可重复

  3. 可以存储 null值

  4. 部分子集合线程安全,部分不安全 例如 ArrayList 和 Vector

  5. 有索引,针对每个元素能够方便地查询和修改

  6. 判断元素是否重复依赖于equals方法

    ​ 1). 如果元素是系统类,不需要重写equals方法

    ​ 2). 如果是自定义类,就需要我们按需求重写 equals方法

// 利用ArrayList类实例化List集合
List<String> list = new ArrayList<String>();

// 利用LinkedList类实例化List集合
List<String> list2 = new LinkedList<String>();

List接口的常用方法

//增加
//void add(int index, E element) 在指定 index 索引处理插入元素 element
//boolean addAll(int index, Collection<? extends E> c) 在指定 index 索引处理插入集合元素 c

List<String> list = new ArrayList<String>();
list.add("张三");
list.add("李四");
list.add("王五");
System.out.println(list);//[张三, 李四, 王五]


//删除
//E remove(int index) 删除指定索引 index 处的元素
list.remove(1);//删除索引为1的元素
System.out.println(list);//[张三, 王五]

//修改
//E set(int index, E element) 修改指定索引 index 处的元素为 element
list.set(1, "赵四");
System.out.println(list);//[张三, 赵四, 王五]

//遍历
//E get(int index) + int size() for循环遍历集合中的每一个元素
//ListIterator<E> listIterator() 通过列表迭代器遍历集合中的每一个元素
//ListIterator<E> listIterator(int index) 通过列表迭代器从指定索引处开始正向或者逆向遍历集合中的元素
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}

//获取
//E get(int index) 获取指定索引处的元素
//int indexOf(Object o) 从左往右查找,获取指定元素在集合中的索引,如果元素不存在返回 -1
//int lastIndexOf(Object o) 从右往左查找,获取指定元素在集合中的索引,如果元素不存在返回 -1
//List<E> subList(int fromIndex, int toIndex) 截取从 fromIndex 开始到 toIndex-1 处的元素

System.out.println(list.get(1));//赵四

System.out.println(list.indexOf("赵四"));//1

System.out.println(list.lastIndexOf("孙七"));//-1
	

List接口的遍历方式

  1. toArray
  2. Iterator
  3. foreach
  4. 普通for
  5. ListIterator

List接口去除重复元素

​ 方式一:创建一个新的集合去除重复元素再使用地址传递

​ 方式二:在原集合的基础上使用选择排序思想去除重复元素

List<String> list = new ArrayList<String>();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("赵四");
list.add("王五");
System.out.println(list);//[张三, 赵四, 王五, 赵四, 王五]
for (int i = 0; i < list.size(); i++) {
	for (int j = i + 1; j < list.size(); j++) {
		  if (list.get(i).equals(list.get(j))) {
		      list.remove(j);
		      j--;
		 }
	}
}
System.out.println(list);//[张三, 赵四, 王五]

并发修改异常的处理

异常名称:并发修改异常 java.util.ConcurrentModificationException

产生原因:在使用迭代器迭代的同时使用原集合对元素做了修改

解决办法:

  1. 使用 toArray 方法
  2. 使用 普通 for 遍历
  3. 使用 ListIterator 遍历集合并且使用 列表迭代器修改元素

ArrayList
概述
List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括null在内的所有元素。除了实现 List接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于 Vector类,除了此类是不同步的。)
特点

  1. 底层数据结构是数组
  2. 增加和删除的效率低,查询和修改的效率高
  3. 能够存储 null 值
  4. 线程不安全,效率高 可以通过 Collections.synchronizedList();变安全
  5. 有索引,能够方便检索
  6. 元素可重复,我们自己可以通过 选择排序去重复
  7. 不可以排序,但是可以通过 Collections.sort();方法排序

注:ArrayList中常用的方法全部来自于 父类 Collection,List,Object.

LinkedList
概述
List接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。
特点

  1. LinkedList 底层数据结构是一个双向链表,元素有序,可重复。
  2. LinkedList在实现数据的增加和删除效率高,查询和修改效率低,顺序访问会非常高效,而随机访问效率比较低。
  3. LinkedList 实现 List 接口,支持使用索引访问元素。
  4. LinkedList 实现 Deque接口,即能将LinkedList当作双端队列使用。
  5. LinkedList 是线程不安全的,效率高
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值