集合2——List集合
Posted blogforvi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了集合2——List集合相关的知识,希望对你有一定的参考价值。
一、概念
List接口是Collection接口的子接口,是一种有序、可重复的集合
二、常见方法
其他详细的部分可以查阅API
三、常用的实现类
1)ArrayList
List list1 = new ArrayList();
底层数据结构是数组,查询快,增删慢;线程不安全,效率高。
ArrayList和Vector中数组的初始化容量都是10。
如果要考虑多线程安全问题,建议使用Collections.synchronizedList()方法将ArrayList转成线程安全的集合,而不使用Vector集合。
1 public class ArrayListDemo 2 public static void main(String[] args) 3 List<Hero> heros = new ArrayList<>(); 4 //集合的添加 5 heros.add(new Hero("爆破")); 6 heros.add(new Hero("龙卷")); 7 heros.add(new Hero("银色獠牙")); 8 heros.add(new Hero("King")); 9 //集合的遍历:iterator方式 10 Iterator<Hero> it = heros.iterator(); 11 while(it.hasNext()) 12 Hero hero = it.next(); 13 System.out.println(hero.name); 14 15 //修改,因为底层封装了一个数组,所以索引从0开始 16 heros.set(0, new Hero("秃头披风侠")); 17 //获取 18 System.out.println(heros.get(0).name); 19 //批量删除,单个删除用remove 20 heros.removeAll(heros); 21 System.out.println(heros.size()); 22 23 24 25 class Hero 26 String name; 27 28 public Hero(String name) 29 this.name = name; 30 31
有一点需要注意的是,在遍历List的过程中不可以使用remove的方式删除元素
1 public class ArrayListDemo 2 public static void main(String[] args) 3 List<Hero> heros = new ArrayList<>(); 4 //集合的添加 5 heros.add(new Hero("爆破")); 6 heros.add(new Hero("龙卷")); 7 heros.add(new Hero("银色獠牙")); 8 heros.add(new Hero("King")); 9 //在遍历的过程中使用remove删除 10 for (Hero hero : heros) 11 if(hero.name.equals("King")) 12 heros.remove(hero); 13 14
否则就会报这样的异常
如果要在遍历的过程中删除元素,可以使用迭代器方式:
2)LinkedList
LinkedList和ArrayList一样,也实现了List接口。那些常用方法不再赘述,同时还实现了双向链表结构Deque接口,可以很方便的在头尾插入数据。
它的底层数据结构是链表,查询慢,增删快;线程不安全,效率高。
什么是链表结构?
引用how2java的概念:与数组结构相比,数组结构就好像是电影院中规律摆放的座位,元素间距相当,对号入座。而链表就像是一串佛珠,每个元素彼此只连接前一个和后一个,不用关心其他的元素在哪里.....
1 public class LinkedListDemo 2 public static void main(String[] args) 3 LinkedList<Hero> heros = new LinkedList<>(); 4 heros.addFirst(new Hero("兔头披风侠")); 5 heros.addFirst(new Hero("魔鬼改造人")); 6 heros.addLast(new Hero("King")); 7 System.out.println(heros); 8 //查看头元素 9 System.out.println(heros.getFirst()); 10 //查看尾元素 11 System.out.println(heros.getLast()); 12 13
除了上述两种接口以外,LinkedList还实现了Queue接口,是一种先进先出的数据结构。
常用方法:
peek():查看第一个元素
poll():取出第一个元素,该元素会在队列中被删除
offer():在队列最后添加元素
1 Queue<Hero> que = new LinkedList<>(); 2 que.offer(new Hero("秃头披风侠")); 3 que.offer(new Hero("魔鬼改造人")); 4 que.offer(new Hero("King")); 5 System.out.println(que); 6 System.out.println("查看第一个元素"); 7 System.out.println(que.peek()); 8 System.out.println("取出所有元素"); 9 while(que.size()>0) 10 System.out.println(que.poll()); 11 System.out.println(que);
3)Vector
List list2 = new Vector();
底层数据结构是数组,查询快,增删慢;线程安全,效率低,几乎已经淘汰了这个集合
4) ArrayList和LinkedList的区别
(以十万条数据测试)
查找元素:ArrayList根据下标查找,速度较快,LinkedList需要逐个遍历,速度较慢。
增删元素时:由于所在位置之后的元素都需要改变下标,如果在集合开头的位置增删元素,速度较慢,如果在集合最后的位置插入元素性能和LinkedList接近。
如果考虑在中间位置定位元素,ArrayList性能远高于LinkedList。
以上是关于集合2——List集合的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin集合操作总结 ( List 集合 | MutableList 集合 | List 集合遍历 | Set 集合 | MutableSet 集合 | Map 集合 | 可变 Map集合 )
Kotlin集合操作总结 ( List 集合 | MutableList 集合 | List 集合遍历 | Set 集合 | MutableSet 集合 | Map 集合 | 可变 Map集合 )