Java类集合之List详解.docx
- 文档编号:29370472
- 上传时间:2023-07-22
- 格式:DOCX
- 页数:15
- 大小:19.69KB
Java类集合之List详解.docx
《Java类集合之List详解.docx》由会员分享,可在线阅读,更多相关《Java类集合之List详解.docx(15页珍藏版)》请在冰豆网上搜索。
Java类集合之List详解
Java集合框架之List详解
ArrayList
首先我们熟悉下ArrayList类中常用方法的使用。
1)添加:
publicbooleanadd(Objecte):
将指定的元素(对象)添加到此列表的尾部
2)获取:
publicObjectget(intindex):
返回此列表中指定位置(索引)上的元素。
3)元素的个数:
publicintsize():
返回此列表中的元素数。
4)清空:
publicvoidclear():
移除此列表中的所有元素。
此调用返回后,列表将为空。
5)是否为空:
publicbooleanisEmpty():
如果此列表中没有元素,则返回true
6)移除(删除):
publicEremove(intindex):
移除此列表中指定位置上的元素。
向左移动所有后续元素(将其索引减1)。
7)移除(重载):
publicbooleanremove(Objecto):
移除此列表中首次出现的指定元素(如果存在)。
如果列表不包含此元素,则列表不做改动。
更确切地讲,移除满足(o==null?
get(i)==null:
o.equals(get(i)))的最低索引的元素(如果存在此类元素)。
如果列表中包含指定的元素,则返回true(或者等同于这种情况:
如果列表由于调用而发生更改,则返回true)。
8)获得索引:
publicintindexOf(Objecto):
返回此列表中首次出现的指定元素的索引,或如果此列表不包含元素,则返回-1。
更确切地讲,返回满足(o==null?
get(i)==null:
o.equals(get(i)))的最低索引i,如果不存在此类索引,则返回-1。
如何使用这些方法,代码如下:
importjava.util.ArrayList;
publicclassArrayListTest{
publicstaticvoidmain(String[]args){
ArrayListlist=newArrayList();
/*
*添加
*/
list.add("hello");
list.add("world");
list.add("welcome");
/*
*获得
*/
Strings1=(String)list.get(0);
Strings2=(String)list.get
(1);
Strings3=(String)list.get
(2);
System.out.println(s1+s2+s3);
/*
*元素的个数
*/
System.out.println(list.size());
/*
*清空
*/
list.clear();
/*
*是否为空
*刚清空了,所以打印true
*/
System.out.println(list.isEmpty());
System.out.println("-----------------");
list.add("aaa");
list.add("bbb");
list.add("ccc");
/*
*获得索引
*/
System.out.println(list.indexOf("bbb"));
/*
*移除
*/
list.remove
(1);
for(inti=0;i System.out.print(list.get(i));//打印Arraylist中的元素 } System.out.println();//换行 /* *移除重载 */ //list.add("ddd"); list.remove("aaa"); for(inti=0;i System.out.print(list.get(i));//打印Arraylist中的元素 } } } 下面我们来看看,把ArrayList其他方法 1.转换数组: publicObject[]toArray(): 按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组。 由于此列表不维护对返回数组的任何引用,,因而它将是“安全的”。 (换句话说,此方法必须分配一个新的数组)。 因此,调用者可以自由地修改返回的数组。 此方法担当基于数组的API和基于collection的API之间的桥梁。 下面的代码,来看看toArray()方法的使用: importjava.util.ArrayList; publicclassArrayListTest4{ publicstaticvoidmain(String[]args){ ArrayListlist=newArrayList(); list.add (1); list.add (2); list.add(3); list.add(4); /* *我们不能把Object[]转换为Interger[] */ Object[]o=list.toArray(); for(inti=0;i System.out.println((Integer)o[i]); } } } 我们再看如下代码,来看看集合中存放的是什么? importjava.util.ArrayList; publicclassArrayListTest3{ publicstaticvoidmain(String[]args){ ArrayListlist=newArrayList(); list.add(newPoint(1,2)); list.add(newPoint(3,4)); list.add(newPoint(5,6)); for(inti=0;i System.out.println(((Point)list.get(i))); } System.out.println(list); } } classPoint{ intx; inty; publicPoint(intx,inty){ this.x=x; this.y=y; } publicStringtoString(){ returnthis.x+","+this.y; } } 总结: 集合中存放的依然是对象的引用而不是对象本身。 ArrayList的底层实现是什么原理? ArrayListList底层采用数组实现,当使用不带参数的构造方法生成ArrayList对象时,实际上会在底层生成一个长度为10的Object类型数组。 如果增加的元素个数超过了10个,那么ArrayList底层会新生成一个数组,长度为原数组的1.5倍+1,然后将原数组的内容复制到新数组当中,并且后续增加的内容都会放到新数组当中。 当新数组无法容纳增加的元素时,复该过程。 对于ArrayList元素的删除操作,需要将被删除元素的后续元素向前移动,代价比较高。 基本上说ArrayList是一个数组。 注意: 在jdk1.5之前,没有包装类自动装箱拆箱,集合类当中只能放置对象的引用,无法放置原生数据类型,我们需要使用原生数据类型的包装类才能加入到集合当中。 还有在集合当中放置的都是Object类型,因此取出来的也是Object类型,那么必须要使用强制类型转换将其转换为真正的类型(放置进去的类型)。 LinkedList LinkedList的很多方法使用和ArrayList的方法一样,因为实现了接口List。 还有一些其他常用的方法。 1)添加的几种常用方法: i.publicbooleanadd(Ee): 将指定元素添加到此列表的结尾。 此方法等效于addLast(E)。 ii.publicvoidadd(intindex,Eelement): 在此列表中指定的位置插入指定的元素。 移动当前在该位置处的元素(如果有),所有后续元素都向右移(在其索引中添加. iii.publicvoidaddLast(Ee): 将指定元素添加到此列表的结尾,此方法等效于add(E)。 iv.publicvoidaddFirst(Ee): 将指定元素插入此列表的开头 2)移除的几种常用方法: i.publicEremove(intindex): 移除此列表中指定位置处的元素。 将任何后续元素向左移(从索引中减1)。 返回从列表中删除的元素。 ii.publicbooleanremove(Objecto)从此列表中移除首次出现的指定元素(如果存在)。 如果列表不包含该元素,则不作更改。 更确切地讲,移除具有满足(o==null? get(i)==null: o.equals(get(i)))的最低索引i的元素(如果存在这样的元素)。 如果此列表已包含指定元素(或者此列表由于调用而发生更改),则返回true。 3)替换方法: publicEset(intindex,Eelement): 将此列表中指定位置的元素替换为指定的元素. 4)查找: publicEget(intindex): 返回此列表中指定位置处的元素。 我们对于上面的几个方法,用代码来看看如何使用: importjava.util.LinkedList; publicclassLinkedListTest{ publicstaticvoidmain(String[]args){ LinkedListlist=newLinkedList(); /** *添加的几种方法 */ list.add("hello"); list.add("world"); list.add("welcome"); list.addFirst("hello0"); list.addLast("welcome1"); list.add(1,"haha"); System.out.println("最初的集合"+list); /** *移除的几种方法 */ list.remove (1); list.remove("welcome"); System.out.println("变化后的集合"+list); /** *替换set() *获取get() */ Stringvalue=(String)list.get (2); list.set(3,value+"changed"); System.out.println("最后的集合"+list); } } 其实LinkedList的底层是一种链表形式,链表形式有单向链表和双向链表,我们看看单向链表的实现方式,我们看看如下代码: publicclassNode{ Stringdata; Nodenext; publicNode(Stringdata){ this.data=data; } } publicclassNodeTest{ publicstaticvoidmain(String[]args){ Nodenode1=newNode("node1"); Nodenode2=newNode("node2"); Nodenode3=newNode("node3"); node1.next=node2; node2.next=node3; System.out.println("单向链表: "+node1.data+","+node1.next.data+"," +node1.next.next.data); System.out.println("------插入--------"); Nodenode4=newNode("node4"); node1.next=node4; node4.next=node2; System.out.println("插入后结果: "+node1.data+","+node1.next.data+"," +node1.next.next.data+","+node1.next.next.next.data); System.out.println("----------删除------------"); node1.next=node2; node4.next=null; System.out.println("删除后结果: "+node1.data+","+node1.next.data+"," +node1.next.next.data+","); } } 现在我们再看看双向链表的实现方式: publicclassDoubleNode{ DoubleNodeprevious;//前一个对象 Stringdata;//当前数据 DoubleNodenext;//后一个对象 publicDoubleNode(Stringdata){ this.data=data; } } publicclassDoubleNodeTest{ publicstaticvoidmain(String[]args){ DoubleNodenode1=newDoubleNode("node1"); DoubleNodenode2=newDoubleNode("node2"); DoubleNodenode3=newDoubleNode("node3"); node1.previous=node3; node1.next=node2; node2.previous=node1; node2.next=node3; node3.previous=node2; node3.next=node1; System.out.println(node1.data+","+node1.previous.data+","+node1.previous.previous.data+","+node1.previous.previous.previous.data); System.out.println(node1.data+","+node1.next.data+","+node1.next.next.data+","+node1.next.next.next.data); System.out.println("-----------插入---------"); DoubleNodenode4=newDoubleNode("node4"); node1.next=node4; node4.previous=node1; node4.next=node2; node2.previous=node4; System.out.println(node1.data+","+node1.previous.data+","+node1.previous.previous.data+","+node1.previous.previous.previous.data+node1.previous.previous.previous.previous.data); System.out.println(node1.data+","+node1.next.data+","+node1.next.next.data+","+node1.next.next.next.data+","+node1.next.next.next.next.data); System.out.println("--------------删除--------------"); node1.next=node2; node2.previous=node1; node4.next=null; node4.previous=null; System.out.println(node1.data+","+node1.previous.data+","+node1.previous.previous.data+","+node1.previous.previous.previous.data); System.out.println(node1.data+","+node1.next.data+","+node1.next.next.data+","+node1.next.next.next.data); } } ArrayList与LinkedList的区别 从以上代码可以看出,ArrayList与LinkedList的底层实现是不一样的,我们现在对ArrayList与LinkedList进行比较分析: a)ArrayList底层采用数组实现,LinkedList底层采用双向链表实现。 b)当执行插入或者删除操作时,采用LinkedList比较好 c)当执行搜索操作时,采用ArrayList比较好 d)当向ArrayList添加一个对象是,实际上就是将该对象放置到了ArrayList底层所维护的数组当中;当向LinkedList中添加一个对象时,实际上LinkedList内部会生成一个Entry对象,该Entry对象的结构为: Entry{ Entryprevious; Objectelements; Entrynext; } 其中的Object类型的元素elements就是我们向LinkedList中所添加的元素,然后Entry又造好了向前与向后的引用previous,next,最后将生成的这个Entry对象加入到了链表当中。 换句话说,LinkedList中所维护的是一个个的Entry对象。 栈(Stack)和队列(Queue) 无论是栈还是队列,里面都会维护一个成员变量,该成员变量用于存储栈或队列中的元素,该成员变量请使用LinkedList类型。 栈和队列实现代码: LinkedList提供以下方法: addFirst(); removeFirst(); addLast(); removeLast(); 栈实现代码 在栈中,push为入栈操作,pop为出栈操作。 Push用addFirst(),pop用removeFirst(),实现后进先出。 用isEmpty()--其父类的方法,来判断栈是否为空。 在队列中,put为入队列操作,get为出队列操作。 Put用addFirst(),get用removeLast()实现队列。 用isEmpty()--其父类的方法,来判断队列是否为空? Package.dataStruct; importjava.util.LinkedList; publicclassMyStack{ LinkedListlinkList=newLinkedList publicvoidpush(Objectobject){ linkList.addFirst(object); } publicbooleanisEmpty(){ returnlinkList.isEmpty(); } publicvoidclear(){ linkList.clear(); } publicObjectpop(){ if(! linkList.isEmpty()) returnlinkList.removeFirst(); else return"栈内无元素"; } publicintgetSize(){ returnlinkList.size(); } publicstaticvoidmain(String[]args){ MyStackmyStack=newMyStack(); myStack.push(“a”); myStack.push(“b”); myStack.push(“c”); System.out.println(myStack.pop()); System.out.println(myStack.pop()); } } 队列实现代码: packagedataStruct; importjava.util.LinkedList; publicclassMyQueue{ LinkedListlinkedList=newLinkedList(); publicvoidput(Objecto){ linkedList.addLast(o); } publicObjectget(){ if(! linkedList.isEmpty()) returnlinkedList.removeFirst(); else return""; } publicbooleanisEmpty(){ returnlinkedList.isEmpty(); } publicintsize(){ returnlinkedList.size(); } publicvoidclear(){ linkedList.clear(); } publicstaticvoidmain(String[]args){ MyQueuemyQueue=newMyQueue(); myQueue.put(“a”); myQueue.put(“b”); myQueue.put(“c”); System.out.println(myQueue.get()); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 集合 List 详解