集合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 
View Code

 

有一点需要注意的是,在遍历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         
View Code

否则就会报这样的异常

技术图片

 

 

 如果要在遍历的过程中删除元素,可以使用迭代器方式:

技术图片

 

 

 

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 
View Code

技术图片

 

 

 

除了上述两种接口以外,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);
View Code

技术图片

 

3)Vector

List list2 = new Vector();

底层数据结构是数组,查询快,增删慢;线程安全,效率低,几乎已经淘汰了这个集合

 

 4) ArrayList和LinkedList的区别

(以十万条数据测试)

查找元素:ArrayList根据下标查找,速度较快,LinkedList需要逐个遍历,速度较慢。

增删元素时:由于所在位置之后的元素都需要改变下标,如果在集合开头的位置增删元素,速度较慢,如果在集合最后的位置插入元素性能和LinkedList接近。

如果考虑在中间位置定位元素,ArrayList性能远高于LinkedList。

 

以上是关于集合2——List集合的主要内容,如果未能解决你的问题,请参考以下文章

《集合》第2节:List集合

Kotlin集合操作总结 ( List 集合 | MutableList 集合 | List 集合遍历 | Set 集合 | MutableSet 集合 | Map 集合 | 可变 Map集合 )

Kotlin集合操作总结 ( List 集合 | MutableList 集合 | List 集合遍历 | Set 集合 | MutableSet 集合 | Map 集合 | 可变 Map集合 )

Python——集合

一个list集合数据拷贝到另一个集合中

list集合