Java类集合之List详解.docx

上传人:b****8 文档编号:29370472 上传时间:2023-07-22 格式:DOCX 页数:15 大小:19.69KB
下载 相关 举报
Java类集合之List详解.docx_第1页
第1页 / 共15页
Java类集合之List详解.docx_第2页
第2页 / 共15页
Java类集合之List详解.docx_第3页
第3页 / 共15页
Java类集合之List详解.docx_第4页
第4页 / 共15页
Java类集合之List详解.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

Java类集合之List详解.docx

《Java类集合之List详解.docx》由会员分享,可在线阅读,更多相关《Java类集合之List详解.docx(15页珍藏版)》请在冰豆网上搜索。

Java类集合之List详解.docx

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

}

}

展开阅读全文
相关搜索

当前位置:首页 > 工作范文 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1