一、接口List 点击此处返回总目录 二、List接口的特有的方法 三、ArrayList 四、LinkedList 五、Vector 一、接口 List<E> 序列。(我理解的List就是线性表)。List的三个主要特性: 1. 是有序的集合(不是排序,而是存储的顺序和取出的顺序是一样的)。 2. 用户可以对列表中每个元素的插入位置进行精确地控制。 3. 可以存储重复的数据。 List接口继承自Collection接口。List接口的实现类有:ArrayList、LinkedList等。 List接口下有很多实现类,他们存储元素的存储方式不一样,这就导致这些集合各有各的特点,供我们在不同的环境下使用。 常用的数据存储方式有:堆栈、队列、数组、链表。 二、List接口的特有的方法 List接口的抽象方法,有一部分是跟他的父类Collection是一样的。这一部分就没必要看了,前面学过。 我们只需要关注List接口特有的方法即可。 1. void add(int index, E element) //将元素插入到指定位置【例1】。要小心越界异常问题。 2. E get(int index) //获取索引位置的元素。【例2】 3. E remove(int index) //删除指定位置的元素,并把该元素返回。【例3】 4. E set(int index, E element) //将指定位置的元素进行替换,返回的是替换之前的元素。【例4】 例1:
package cn.itcast.demo01; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Test { public static void main(String[] args) { List<String> l = new ArrayList<String>(); l.add("aa"); l.add("bb"); l.add("cc"); System.out.println(l); //[aa, bb, cc] l.add(1, "dd"); //在位置1上插入"dd"。注意不要越界,可以写0,1,2,3,但是不能写4. System.out.println(l); //[aa, dd, bb, cc] } } |
例2:
package cn.itcast.demo01; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Test { public static void main(String[] args) { List<String> l = new ArrayList<String>(); l.add("aa"); l.add("bb"); l.add("cc"); System.out.println(l); //[aa, bb, cc] System.out.println(l.get(2)); //cc } } |
例3:
package cn.itcast.demo02; import java.util.ArrayList; import java.util.List; public class Test { public static void main(String[] args) { List<Double> list = new ArrayList<Double>(); list.add(3.14); list.add(4.12); list.add(5.6); System.out.println(list); //[3.14, 4.12, 5.6] Double d = list.remove(1); System.out.println(d); //4.12 System.out.println(list); //[3.14, 5.6] } } |
例4:
package cn.itcast.demo02; import java.util.ArrayList; import java.util.List; public class Test { public static void main(String[] args) { List<Double> list = new ArrayList<Double>(); list.add(3.14); list.add(4.12); list.add(5.6); System.out.println(list); //[3.14, 4.12, 5.6] Double d = list.set(0, 8.88); System.out.println(d); //3.14 System.out.println(list); //[8.88, 4.12, 5.6] } } |
三、ArrayList List接口的大小可变数组的实现。本质上就是一个数组。所以查询快,增删慢。ArrayList是线程不安全的。 查看源码可以看到,当调用add操作时,可能会扩容。扩容就是把数组拷贝到另一个数组中。数组的拷贝本质使用的是System.arraycopy()函数。 四、LinkedList List接口的链表实现。是单向链表。查询速度比较慢,增删速度快。也是线程不同步的。 1. public void addFirst(E e) //将元素插入到列表的开头。【例1】 2. public void addLast(E e) //将元素插入到列表的最后。跟add()效果相同。【例1】 3. public E getFirst() //返回此列表的第一个元素。如果没有元素,会有异常。【例2】 4. public E getLast() //返回此列表的最后一个元素。如果没有元素,会有异常。【例2】 5. public E removeFirst() //移除并返回此列表的第一个元素。【例3】 6. public E removeLast() //移除并返回此列表的最后一个元素。【例3】 例1:
package cn.itcast.demo04; import java.util.LinkedList; public class Test { public static void main(String[] args) { LinkedList<Integer> link = new LinkedList<Integer>(); link.add(11); link.add(12); link.add(13); System.out.println(link); //[11, 12, 13] link.addFirst(0); System.out.println(link); //[0, 11, 12, 13] link.addLast(22); System.out.println(link); //[0, 11, 12, 13, 22] } } |
例2:
package cn.itcast.demo05; import java.util.LinkedList; public class Test { public static void main(String[] args) { LinkedList<String> link = new LinkedList<String>(); link.add("aaa"); link.add("bbb"); link.add("ccc"); String first = link.getFirst(); String last = link.getLast(); System.out.println(first); //aaa System.out.println(last); //ccc } } |
例3:
package cn.itcast.demo06; import java.util.LinkedList; public class Test { public static void main(String[] args) { LinkedList<String> link = new LinkedList<String>(); link.add("aa"); link.add("bb"); link.add("cc"); System.out.println(link); //[aa, bb, cc] String first = link.removeFirst(); String last = link.removeLast(); System.out.println(first); //aa System.out.println(last); //cc System.out.println(link); //[bb] } } |
五、Vector 跟ArrayList一回事,也是一个可变的数组。版本比较早。与新的collection实现不同,是线程安全的,意味着速度慢。 已经被ArrayList集合取代了。郁郁而终了已经~~已经淡出历史舞台~~卸磨杀驴了已经~~ |