Java集合之List
2020-07-19 本文已影响0人
AbstractCulture
List的特点
-
有序。我们经常使用的List如:
ArrayList
、LinkedList
都是属于List接口下的数据结构。 - 其中,
ArrayList
是动态数组,LinkedList
是基于双向链表实现的有序序列。
- 数组的特点是可以随机访问,即通过数组下标对元素进行访问,对于插入与删除来说,在数组尾部进行插入与删除仍然是效率较高的,但是如果插入的数据是处于数组中间的索引位置,那么就要进行数组的移动,这个效率是非常低的。
-
链表中插入与删除是非常高效的,只需要把指针地址进行重新指向即可。而对于链表来说,想要直接访问链表中的某个索引位置,则需要从链表的头尾指针进行迭代。
值得注意的是,ArrayList
和LinkedList
都不是线程安全的数据结构.
listIterator
List接口提供了一个列表的专用迭代器,它支持双向移动。
List<String> strings = Arrays.asList("a", "b", "c");
ListIterator<String> stringListIterator = strings.listIterator();
while (stringListIterator.hasNext()) {
System.out.println("正序,当前元素:" + stringListIterator.next());
}
while (stringListIterator.hasPrevious()){
System.out.println("倒叙,当前元素:"+stringListIterator.previous());
}
listIterator
get和set
在ArrayList
中,你可以使用get
和set
随机访问每个元素。但是对于链表结构的LinkedList
来说,避免使用get
和set
,因为它产生遍历的行为,应该使用迭代器。
拼接list-----addAll
List<String> s1 = new ArrayList<>();
s1.add("a");
s1.add("b");
s1.add("c");
List<String> s2 = new LinkedList<>();
s2.add("d");
s2.add("e");
s2.add("f");
s1.addAll(s2);
s1.forEach(s-> System.out.println(s));
注意:Arrays.asList()生产出来的list是不可以使用add,remove这种操作的.会抛出java.lang.UnsupportedOperationException异常.这是因为Arrays类返回的对象不是
ArrayList
,它是一个视图对象。任何试图改变数组大小的方法,都会抛出异常。
子范围-----subList
如果你需要访问list中的某个范围的数据。你可以使用subList方法。注意其中的索引值与真正获取到的List。可以看到,它是不包含s1.get(2)
这个索引的元素的。
List<String> s1 = new ArrayList<>();
s1.add("a");
s1.add("b");
s1.add("c");
List<String> strings = s1.subList(0, 2);
strings.forEach(s-> System.out.println(s));
subList
清空子范围的值-----clear
List<String> s1 = new ArrayList<>();
s1.add("a");
s1.add("b");
s1.add("c");
List<String> strings = s1.subList(0, 2);
strings.clear();
s1.forEach(s-> System.out.println(s));
clear
集合操作:交集,差集
-
交集,
retainAll
,如果s1和s2是有交集的,那么s1中不在交集部分的数据就会被删除掉.
List<String> s1 = new ArrayList<>();
s1.add("a");
s1.add("b");
s1.add("c");
List<String> s2 = new LinkedList<>();
s2.add("a");
s2.add("b");
s1.forEach(s-> System.out.println(s));
//交集,影响数据源
if(s1.retainAll(s2)){
System.out.println("s1与s2是有交集的");
}
s1.forEach(s-> System.out.println(s));
交集
-
差集,
removeAll
,删除s1中在s2不存在的数据。
List<String> s1 = new ArrayList<>();
s1.add("a");
s1.add("b");
s1.add("c");
List<String> s2 = new LinkedList<>();
s2.add("a");
s2.add("b");
System.out.print("-----差集操作前: ");
System.out.print("s1:");
s1.forEach(s-> System.out.print(s+" "));
System.out.print("s2:");
s2.forEach(s-> System.out.print(s+" "));
//交集,影响数据源
s1.removeAll(s2);
System.out.println();
System.out.print("-----差集操作后: ");
System.out.print("s1:");
s1.forEach(s-> System.out.print(s+" "));
System.out.print("s2:");
s2.forEach(s-> System.out.print(s+" "));
差集
Vector
不推荐使用,可以理解为线程安全的列表.