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");