赞
踩
众所周知,List集合是我们常用的java工具,那么今天就来说说List,讲到List就不得不说其下的三个实现类:ArrayList,LinkedList和Vector,这三个有什么区别呢?下面就来说说:
ArrayList:是基于动态数组的实现,内部的实现基于数组完成,因此在进行元素查找的时候只需要根据元素的索引即可快速找到,但是在更新时或者插入时,由于数组结构是连续的,元素一旦向中间插入,则后续的元素需要整体后移,效率低。ArrayList是线程不同步的实现,在多线程并发操作时不能保证数据的安全,但是效率高;另外ArrayList在进行容量扩充是增长原来的1.5倍(增长原来长度的一半);线程安全的ArrayList可以使用
java.util.concurrent.CopyOnWriteArrayList
LinkedList:是基于双链表的实现,集合中元素的组织是通过元素的首尾指针连接,在进行数据修改时只需要改动指针的指向即可轻松实现,但是在进行查询的时候,需要从链表头依次搜索,因此修改时,效率较低.
**Vector:**和ArrayList一样也是基于动态数组的实现,但是Vector是老式JDK(JDK1.0)中的一个动态数组类,提供的是一些线程安全(线程同步)的集合操作,因此,在多线程并发时,对数据的安全性会有一定保障,但是带来的影响就是效率低;另外Vector当容量不足时会在原来长度的基础上增长一倍(ArrayList增长一半)
文字说得再多始终比不上实际例子来得实际,那么,上代码:
public class ArrayListDemo { public static void main(String[] args) { /**定义一个ArrayList数组*/ List<Integer> list = new ArrayList<>(); /**向ArrayList中添加数据(整型),可以添加任何类型的数据*/ list.add(10); list.add(20); list.add(30); list.add(40); list.add(50); list.add(60); List<Integer> list2 = new ArrayList<>(); list2.add(100); list2.add(200); /**向ArrayList中添加ArrayList数组*/ list.addAll(list2); System.out.println(list.contains(100)); // for (Integer integer : list) { // list.remove(integer); // } /**不允许在对集合遍历时调用集合的remove方法更改元素,会抛出一ConcurrentModificationException*/ /**如果需要在遍历时删除,因该调用通过集合获取的迭代器对象自生的remove方可更改*/ Iterator<Integer> it = list.iterator(); while(it.hasNext()){ int i = it.next(); /**remove前要确保next()获取过元素,否则会出现IllegalStateException*/ it.remove(); } /**判断ArrayList是否为空*/ System.out.println(list.isEmpty()); /**迭代器迭代*/ Iterator it = list.iterator(); while(it.hasNext()){ System.out.println(it.next()); } System.out.println("============"); /**已按顺序将迭代器中的数据读出,所以不会输出数据*/ while(it.hasNext()){ System.out.println(it.next()); } System.out.println("================"); /**从前往后读数据*/ ListIterator its = list.listIterator(); while(its.hasNext()){ System.out.println(its.next()); } System.out.println("=================="); /**从后往前读数据*/ while(its.hasPrevious()){ System.out.println(its.previous()); } /**获取指定位置的元素*/ System.out.println(list.get(5)); /**对ArrayList进行排序,用到了匿名内部类,需注意比较的数值类型不同,获取返回值的方法也不同*/ list.sort(new Comparator(){ @Override public int compare(Object o, Object o1) { return o-o1; }}); } } /**除此之外还可调用set,size,remove,indexOf,lastIndexOf方法,用法与LinkedList和Vector中一样,就不多写了*/
LinkedList的常用方法:
public class LinkedListDemo { public static void main(String[] args) { LinkedList<String> list = new LinkedList<>(); /**添加元素*/ list.add("Tom"); list.add("Jureey"); list.add("Henry"); list.add("Wappy"); list.add("Henyuv"); /**获取指定位置的元素,但是顺序不是添加的顺序*/ System.out.println(list.get(1)); /**从LinkList中取出一个元素,取出的元素就不再属于LinkList*/ System.out.println(list.pop()); /**将元素添加到栈中*/ list.push("Langth"); System.out.println(list); /**获取最后一位的元素,也可以用list.get(list.size()-1)*/ System.out.println(list.getlast()); /**获取第一个元素*/ System.out.println(list.peek()); /**删除指定位置的元素,还可以删除指定元素list.remove(Object o); 删除第一个元素list.remove();*/ list.remove(2); System.out.println(list); /**将指定位置的元素替换为指定元素*/ list.set(2, "fdas"); System.out.println(list); /**获取栈的长度*/ System.out.println(list.size()); /**遍历表内元素*/ for (String s : list) { System.out.println(s); } /**查找并删除第一个元素*/ System.out.println(list.poll()); System.out.println(list); /**将指定元素添加的列表的最后一位*/ list.offer("fdsaa"); System.out.println(list); /**清空表内所有元素*/ list.clear(); System.out.println(list); } }
Vector的常用方法:
public class VectorDemo { public static void main(String[] args) { /**早期的线程安全的数组,用法差不多*/ Vector<String> v = new Vector<>(); /**将指定的元素追加到此Vector的末尾。*/ v.add("Tom"); v.add("Jureey"); v.add("Henry"); v.add("Wappy"); v.add("Henyuv"); System.out.println(v); /**向指定位置添加元素*/ v.add(3, "fdsd"); System.out.println(v); /**获取指定位置的元素*/ System.out.println(v.get(3)); /**查找指定元素在数组中第一次出现的索引,如果此元素不存在,则返回-1。*/ /**查找指定元素在数组中最后一次出现的索引,v.indexOf("Tom")*/ System.out.println(v.indexOf("Tom")); /**返回数组的长度*/ System.out.println(v.size()); /**删除表所有数据*/ v.clear(); System.out.println(v); /**除此之外,Vector同样可以调用Iterator迭代器来对数组进行迭代*/ } }
我只是写了一小部分方法,还有不少方法,可以在API文档中查看,谢谢观看!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。