List集合代表代表一个元素有序、可重复的集合,集合中每个元素都有其对应的顺序索引。List集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。List集合默认按元素的添加顺序设置元素的索引,例如第一次添加的元素索引为0,第二次添加的元素索引为1…
list集合操作元素的方法
List集合作为Collection接口的子接口,当然可以使用Collection接口里面的全部方法。而且由于List集合是有序集合,因此List集合添加了一些根据索引来操作集合元素的方法。
ArrayList
例子:
import java.util.ArrayList;
import java.util.List;
public class ArrayListDemo {
public static void main(String[] args) {
List books=new ArrayList();
//添加三个元素
books.add("java从入门到放弃");
books.add("java讲义");
books.add("java零基础自学");
System.out.println(books);
//将新字符对象插入到第二个位置
books.add(1,new String("前端html"));
for (Object book : books) {
System.out.println(book);
}
//删除第三个元素
books.remove(2);
System.out.println(books);
//判定指定元素在list集合中的位置
System.out.println(books.indexOf(new String("前端html")));
//将第二个元素替换成新的字符串
books.set(1,"java讲义");
System.out.println(books);
//截取list集合
System.out.println(books.subList(1,2));
}
}
结果如下:
上面的例子两个字符串显然不是同一个对象,但是list集合的indexof()方法依然可以返回1。用indexOf()方法判断元素的索引,如何判断两个对象相等的标准是只要通过equals()方法返回true即可。
java8为list集合添加了sort()和replaceAll()两个常用的默认方法,其中sort()方法需要一个Comparator对象来控制元素排序,程序可使用Lambda表达式来作为参数;而replaceAll()方法侧需要一个UnaryOperator来替换所有元素集合,UnaryOperator也是一个函数式接口,因此程序可使用Lambda表达式作为参数。以下是例子:
import java.util.ArrayList;
import java.util.List;
public class ArrayListDemo2 {
public static void main(String[] args) {
List books=new ArrayList();
//添加四个元素
books.add("java从入门到放弃");
books.add("java讲义");
books.add("java零基础自学");
books.add("前端css入门");
//使用目标类型为Comparator的Lambda表达式对List集合排序
books.sort((o1, o2) -> ((String)o1).length()-((String)o2).length());
System.out.println(books);
//使用目标类型为UnaryOperator的Lambda表达式来替换集合中的所有元素
books.replaceAll(ele->((String)ele).length());
System.out.println(books);
}
}
结果如下:
LinkedList
LinkedList类是List接口的实现类,这意味着它是一个List集合,可以根据索引来随机访问集合中的元素。除此之外,LinkedList还实现了Deque接口,可以被当成双端队列来使用,因此既可以被当成栈来使用,也可以当做队列来使用。
以下是例子:
import java.util.LinkedList;
public class LinkedListDemo {
public static void main(String[] args) {
LinkedList books=new LinkedList();
//将字符串元素添加到队列的尾部
books.offer("乖,摸摸头");
//将字符串元素添加到栈的顶部
books.push("你好");
//将字符串元素添加到队列的头部(相当于栈的顶部)
books.offerFirst("云边有个小卖铺");
//遍历集合
for (int i = 0; i < books.size(); i++) {
System.out.println("遍历"+books.get(i));
}
//访问并不删除栈顶的元素
System.out.println(books.getFirst());
//访问并不删除队列中的最后一个元素
System.out.println(books.peekLast());
//将栈顶的元素弹出栈
System.out.println(books.pop());
System.out.println(books);
//访问并且删除队列中的最后一个元素
System.out.println(books.pollLast());
System.out.println(books);
}
}
以下是结果:
总结
ArrayList和LinkedList实现机制完全不同,ArrayList内部以数组的形式来保存集合中的元素,因此随机访问集合元素时有较好的性能;而LinkedList内部以链表的形式来保存集合中的元素,因此随机访问集合元素时性能较差,但在插入、删除时性能比较出色(只需改变指针所指的地址即可)
- 如果需要遍历List集合元素,对于ArrayList,应该使用随机访问方法(get)来遍历集合元素,这样性能更好;对于LinkedList集合,则应该使用迭代器来遍历集合元素。
- 如果需要经常插入、删除,则可以考虑Linkedlist集合
- 如果多个线程需要同时访问List集合中的元素,开发者可以考虑使用Collection将集合包装成线程安全的集合。