Java面试题 P11:ArrayList和LinkedList区别

ArrayList:基于动态数组,连续内存存储,适合下标访问(随机访问),扩容机制:因为数组长度固定,超出长度存数据时需要新建数组,然后将老数组的数据拷贝到新数组,如果不是尾部插入数据还会涉及到元素的移动(往后复制一份,插入新元素),使用尾插法并指定初始容量可以极大提升性能,甚至超过linkedList

LinedList:基于链表,可以存储在分散的内存中,适合做数据插入及删除操作,不适合查询:需要逐一遍历。遍历LinkedList需要使用iterator不能使用for循环,因为每次for循环体内通过get(i)取得某一元素时都需要对list重新进行遍历,性能消耗极大。

另外不要试图使用indexOf等返回元素索引,并利用其进行遍历,使用indexOf对list进行了遍历,当结果为空时会遍历整个列表。

ArrayList常用方法

 1         //泛型,T可以表示不同类型的集合,String int Object
 2         //ArrayList<T> listT=new ArrayList<T>();
 3         //创建String类型的集合对象:
 4         ArrayList<String> list=new ArrayList<>();
 5         //添加元素:
 6         list.add("大小姐");
 7         //设定指定索引上的元素,必须是已存在的索引
 8         list.set(0,"大小姐==");
 9         //获取list元素的个数
10         System.out.println(list.size());
11         //获取指定索引的值
12         System.out.println(list.get(0));
13 
14         //添加元素,index索引必须目前索引值+1,否则会报数组越界
15         list.add((list.size()-1)+1,"二小姐");
16 
17         ArrayList<String> newList1=new ArrayList<>();
18         //利用Collections(集合工具类)做批量添加,索引必须是已存在的,或者当前索引+1,如果是已存在的索引,addAll后会将占用的索引整体下移
19         Collections.addAll(newList1, "aaa", "bbb", "ccc", "ddd");
20         //list.addAll((list.size()-1)+1,newList1);
21         list.addAll(0,newList1);
22 
23         //for循环 遍历集合
24         for(int i=0;i<list.size();i++){
25             System.out.println("索引 "+i+" 的值:"+list.get(i));
26         }
27 
28         //判断结合是否包含元素x,x的值必须是完整内容,不可模糊
29         System.out.println(list.contains("大小姐=="));
30         //获取集合中第一次出现x元素的下标
31         System.out.println(list.indexOf("ccc"));
32         //如果是有重复值,获取集合中最后一次出现ccc元素的下标
33         System.out.println(list.lastIndexOf("ccc"));
34 
35         //根据下标删除元素
36         list.remove(1);
37         //根据元素删除元素
38         list.remove("ccc");
39         System.out.println("foreach遍历");
40         //foreach遍历集合
41         for (String item:list){
42             System.out.println(item);
43         }
44         System.out.println("迭代器遍历");
45         //迭代器遍历
46         Iterator<String> it=list.iterator();
47         while(it.hasNext()){
48             System.out.println(it.next());
49         }
50         System.out.println("遍历 ListIterator");
51         //遍历 ListIterator
52         ListIterator<String> listIterator=list.listIterator();
53         while (listIterator.hasNext()){
54             System.out.println(listIterator.next());
55         }

 

 

LinkedList常用方法与ArrayList常用方法相同

1         //linkedList独有方法
2         LinkedList<String> linkedList=new LinkedList<>();
3         //将元素添加到集合第一个位置
4         linkedList.addFirst("x");
5         linkedList.addLast("y");

 

posted on 2023-07-28 13:16  wuzx-blog  阅读(13)  评论(0编辑  收藏  举报