当前位置:文档之家› Java类集合之List详解

Java类集合之List详解

Java集合框架之List详解ArrayList首先我们熟悉下ArrayList类中常用方法的使用。

1)添加:public boolean add(Object e):将指定的元素(对象)添加到此列表的尾部2)获取:public Object get(int index):返回此列表中指定位置(索引)上的元素。

3)元素的个数:public int size():返回此列表中的元素数。

4)清空:public void clear():移除此列表中的所有元素。

此调用返回后,列表将为空。

5)是否为空:public boolean isEmpty():如果此列表中没有元素,则返回 true 6)移除(删除):public E remove(int index):移除此列表中指定位置上的元素。

向左移动所有后续元素(将其索引减 1)。

7)移除(重载):public boolean remove(Object o):移除此列表中首次出现的指定元素(如果存在)。

如果列表不包含此元素,则列表不做改动。

更确切地讲,移除满足 (o==null ? get(i)==null : o.equals(get(i))) 的最低索引的元素(如果存在此类元素)。

如果列表中包含指定的元素,则返回 true (或者等同于这种情况:如果列表由于调用而发生更改,则返回 true)。

8)获得索引:public int indexOf(Object o): 返回此列表中首次出现的指定元素的索引,或如果此列表不包含元素,则返回 -1。

更确切地讲,返回满足(o==null ? get(i)==null : o.equals(get(i))) 的最低索引 i ,如果不存在此类索引,则返回 -1。

如何使用这些方法,代码如下:import java.util.ArrayList;public class ArrayListTest {public static void main(String[] args) {ArrayList list=new ArrayList();/** 添加*/list.add("hello");list.add(" world");list. add(" welcome");/** 获得*/String s1=(String)list.get(0);String s2=(String)list.get(1);String s3=(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(int i=0;i<list.size();i++){System.out.print(list.get(i)); //打印Arraylist中的元素}System.out.println();//换行/** 移除重载*///list.add("ddd");list.remove("aaa");for(int i=0;i<list.size();i++){System.out.print(list.get(i)); //打印Arraylist中的元素}}}下面我们来看看,把ArrayList其他方法1.转换数组:public Object[] toArray():按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组。

由于此列表不维护对返回数组的任何引用,,因而它将是“安全的”。

(换句话说,此方法必须分配一个新的数组)。

因此,调用者可以自由地修改返回的数组。

此方法担当基于数组的API 和基于collection 的API 之间的桥梁。

下面的代码,来看看toArray()方法的使用:import java.util.ArrayList;public class ArrayListTest4 {public static void main(String[] args) {ArrayList list=new ArrayList();list.add(1);list.add(2);list.add(3);list.add(4);/** 我们不能把Object[]转换为Interger[]*/Object[] o=list.toArray();for(int i=0;i<o.length;i++){System.out.println((Integer)o[i]);}}}我们再看如下代码,来看看集合中存放的是什么?import java.util.ArrayList;public class ArrayListTest3 {public static void main(String[] args) {ArrayList list=new ArrayList();list.add(new Point(1,2));list.add(new Point(3,4));list.add(new Point(5,6));for(int i=0;i<list.size();i++){System.out.println(((Point)list.get(i)));}System.out.println(list);}}class Point{int x;int y;public Point(int x,int y) {this.x=x;this.y=y;}public String toString() {return this.x+","+this.y;}}总结:集合中存放的依然是对象的引用而不是对象本身。

ArrayList的底层实现是什么原理?ArrayListList底层采用数组实现,当使用不带参数的构造方法生成ArrayList对象时,实际上会在底层生成一个长度为10的Object类型数组。

如果增加的元素个数超过了10个,那么ArrayList底层会新生成一个数组,长度为原数组的1.5倍+1,然后将原数组的内容复制到新数组当中,并且后续增加的内容都会放到新数组当中。

当新数组无法容纳增加的元素时,复该过程。

对于ArrayList元素的删除操作,需要将被删除元素的后续元素向前移动,代价比较高。

基本上说ArrayList是一个数组。

注意:在jdk1.5之前,没有包装类自动装箱拆箱,集合类当中只能放置对象的引用,无法放置原生数据类型,我们需要使用原生数据类型的包装类才能加入到集合当中。

还有在集合当中放置的都是Object类型,因此取出来的也是Object类型,那么必须要使用强制类型转换将其转换为真正的类型(放置进去的类型)。

LinkedListLinkedList的很多方法使用和ArrayList的方法一样,因为实现了接口List。

还有一些其他常用的方法。

1)添加的几种常用方法:i.public boolean add(E e) :将指定元素添加到此列表的结尾。

此方法等效于addLast(E)。

ii.public void add(int index, E element): 在此列表中指定的位置插入指定的元素。

移动当前在该位置处的元素(如果有),所有后续元素都向右移(在其索引中添加.iii.public void addLast(E e): 将指定元素添加到此列表的结尾, 此方法等效于add(E)。

iv.public void addFirst(E e) : 将指定元素插入此列表的开头2)移除的几种常用方法:i.public E remove(int index):移除此列表中指定位置处的元素。

将任何后续元素向左移(从索引中减1)。

返回从列表中删除的元素。

ii.public boolean remove(Object o) 从此列表中移除首次出现的指定元素(如果存在)。

如果列表不包含该元素,则不作更改。

更确切地讲,移除具有满足(o==null ? get(i)==null : o.equals(get(i))) 的最低索引i 的元素(如果存在这样的元素)。

如果此列表已包含指定元素(或者此列表由于调用而发生更改),则返回true。

3) 替换方法:public E set(int index, E element): 将此列表中指定位置的元素替换为指定的元素.4) 查找:public E get(int index):返回此列表中指定位置处的元素。

我们对于上面的几个方法,用代码来看看如何使用:import java.util.LinkedList;public class LinkedListTest {public static void main(String[] args) {LinkedList list=new LinkedList();/*** 添加的几种方法*/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()*/String value=(String)list.get(2);list.set(3, value+"changed");System.out.println("最后的集合"+list);}}其实LinkedList的底层是一种链表形式,链表形式有单向链表和双向链表,我们看看单向链表的实现方式,我们看看如下代码:public class Node {String data;Node next;public Node(String data) {this.data=data;}}public class NodeTest {public static void main(String[] args) {Node node1 = new Node("node1");Node node2 = new Node("node2");Node node3 = new Node("node3");node1.next = node2;node2.next = node3;System.out.println("单向链表:" + node1.data + "," + node1.next.data + ","+ node1.next.next.data);System.out.println("------插入--------");Node node4=new Node("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+",");}}现在我们再看看双向链表的实现方式:public class DoubleNode {DoubleNode previous;//前一个对象String data;//当前数据DoubleNode next;//后一个对象public DoubleNode(String data) {this.data=data;}}public class DoubleNodeTest {public static void main(String[] args) {DoubleNode node1=new DoubleNode("node1");DoubleNode node2=new DoubleNode("node2");DoubleNode node3=new DoubleNode("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+","+n ode1.previous.previous.data+","+node1.previous.previous.previo us.data);System.out.println(node1.data+","+node1.next.data+","+node1 .next.next.data+","+node1.next.next.next.data);System.out.println("-----------插入---------");DoubleNode node4=new DoubleNode("node4");node1.next=node4;node4.previous=node1;node4.next=node2;node2.previous=node4;System.out.println(node1.data+","+node1.previous.data+","+node 1.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.n ext.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+","+n ode1.previous.previous.data+","+node1.previous.previous.previo us.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底层采用双向链表实现。

相关主题