java集合类(二)List学习
接上篇 java集合类(一)
- List接口继承了Collection接口和Iterable接口,即同样含有Collection和 Iterable的特性,还有方法,其基本方法有:
1)有关添加: boolean add(E e):添加元素 void add(int index,E element):在特定位置添加元素
boolean addAll(Collection<? extends E> c):添加集合中所有的元素 boolean addAll(int index,Collection<? extends E> c):在特定位置添加一组元素
2)有关清除:void clear(), E remove(int index),boolean remove(Object o),boolean remove(Collection<?> c)
3)有关检验:boolean contains(Object o),boolean containAll(Collection<?> c),boolean equals(Object o),boolean isEmpty()
4)有关获取:E get(int index),int hashCode(),int indexOf(Object o),int lastIndexOf(Object o),int size(),Lisy<E> subList(int fromindex,int toindex)
5)有关设定:E set(int index, E element),boolean retainAll(Collection<?> c)
6)有关打印:Object[] toArray(), <T>T[] toArray(T[] a)
7)有关迭代:Iterator<E> iterator(),ListIterator<E> listIterator(),ListIterator<E> listIterator(int index)
8)其他:int hashcode()
List接口的实现类有很多,如:AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList,
RoleUnresolvedList, Stack, Vector,下面介绍List的几个基本实现类的用法:
- About ArrayList:
All Implemented Interfaces: Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess extends AbstractList
- Direct Known Subclasses: AttributeList, RoleList, RoleUnresolvedList
实例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | class iphone{} public void arraylist(){ //1)Constructs an empty list with an initial capacity of ten ArrayList al = new ArrayList(); /* * 2)Constructs a list containing the elements of the specified * collection, in the order they are returned by the collection's iterator */ ArrayList<Integer> alist = new ArrayList(Arrays.asList( 1 , 2 , 3 )); //3)Constructs an empty list with the specified initial capacity ArrayList<Double> alist1 = new ArrayList( 10 ); al.add( new iphone()); al.add( 1 ); al.add( "a" ); al.add(alist); System.out.println(al.hashCode()); //int hashcode() /* * usage of methods that aren't mentioned within "List basic methods" */ //ensure that list can hold at least the number of elements specified by the minimum capacity argument alist1.ensureCapacity( 30 ); //Trims the capacity of this ArrayList instance to be the list's current size alist.trimToSize(); //Returns a shallow copy of this ArrayList instance(The elements themselves are not copied) Object o = al.clone(); } |
- About LinkedList:
All Implemented Interfaces:Serializable, Cloneable, Iterable<E>, Collection<E>, Deque<E>, List<E>, Queue<E> extends AbstractSequentialList<E>
从上面可以知道,由于LinkedList实现的接口涉及到队列,所以它也会新增一些有关队列独有操作方法,还有pop(),push()等,下面举例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | public void linkedlist(){ LinkedList linklist = new LinkedList(); ArrayList<Integer> a = new ArrayList(Arrays.asList( 1 , 2 , 3 )); LinkedList linklist2 = new LinkedList(a); Iterator i = linklist2.iterator(); while (i.hasNext()){ System.out.println(i.next()); //1 2 3 } Iterator ri = linklist2.descendingIterator(); while (ri.hasNext()){ System.out.println(ri.next()); //3 2 1 } linklist.addFirst( 1 ); linklist.addLast( "e" ); System.out.println(linklist); //[1,e] /*linklist.getFirst(); linklist.getLast();*/ //Retrieves, but does not remove, the head (first element) of this list System.out.println(linklist.element()); //1 linklist.offer( "x" ); System.out.println(linklist); //[1,e,x] linklist.offerFirst( 0 ); linklist.offerLast( "y" ); System.out.println(linklist); //[0,1,e,x,y] //peek..()--->[Retrieves, but does not remove] System.out.println(linklist.peek()); //0 System.out.println(linklist.peekFirst()); //0 ,list is empty,return "null" System.out.println(linklist.peekLast()); //y,list is empty, return "null" //poll..()--->[Retrieves and removes] System.out.println(linklist.poll()); //0 System.out.println(linklist.pollFirst()); //1 System.out.println(linklist.pollLast()); //y System.out.println(linklist); //[e,x] /*linklist.removeFirst(); //return first element linklist.removeFirstOccurrence(Object); //boolean linklist.removeLast(); //return last element linklist.removeLastOccurrence(Object); //boolean */ System.out.println(linklist2); //[1 2 3] //Pops an element from the stack represented by this list System.out.println(linklist2.pop()); //1 //Pushes an element onto the stack represented by this list linklist2.push( "m" ); System.out.println(linklist2); //[m,2,3] } |
- ArrayList 和LinkedList的比较:
1.ArrayList是基于动态数组,LinkedList基于链表
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据
验证:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public void comparearraylistwithlinklist(){ SimpleDateFormat f = new SimpleDateFormat( "yyyy-MM-dd hh:mm:ss" ); System.out.println(f.format( new Date())); ArrayList<Integer> a = new ArrayList<Integer>(); long starttime = new Date().getTime(); for ( int i = 0 ; i< 10000 ; i++){ a.add(i); } long finishtime = new Date().getTime(); System.out.println(finishtime-starttime); LinkedList<Integer> l = new LinkedList<Integer>(); long lstarttime = new Date().getTime(); for ( int i = 0 ; i< 10000 ; i++){ l.add(i); } long lfinishtime = new Date().getTime(); System.out.println(lfinishtime-lstarttime); } |
输出:
额外说明:以上验证代码是基于较大量数据的,输出也是不稳定的,即答案也不能确定,可能是我用错测试方法,也可能是因为数据量不够大,也可能是因为getTime()获得的是毫秒,程序可能需要更精确的时间单位,这样才有办法比较。另外,如果对于单个数据的插入或删除,是不是LinkedList还优于ArrayList呢?答案也很明显是不一定的,读者可以按照上面的实例验证一下
由于此博文可能有点长了,其他List的学习见“java集合类(三)List学习(续)”,尽请期待!!
### 学习从来都是一个过程,对对错错对对...若文中有错误,还望读者批评指出 ###
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述