Java util 包 的层次结构

Java util 工具包 包含集合框架、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组、日期Date类、堆栈stack类、向量Vector 类等)。

一、Collection 和Collections

Collection是最基本的集合接口。JDK 不提供此接口的任何直接 实现。

由Collection接口派生的两个接口是List和Set。

Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set

  ├HashSet
        ├LinkedHashSet

   ├TreeSet
Map
├Hashtable
├HashMap
└WeakHashMap

 

List接口

List 是有序的collection,类似于数组,可以通过索引访问list的元素。List除了有iterator()方法外,

还有一个listIterator() 方法,ListIterator多了一些add()之类的方法,还能向前或向后遍历。List允许有相同的元素。

List<String> list = new ArrayList<String>();         list.add("A");         list.add("B");         list.add("C");         ListIterator<String> listIterator = list.listIterator();         while (listIterator.hasNext()) {             System.out.println(" 从前往后: " + listIterator.next());         }         while (listIterator.hasPrevious()) {             System.out.println(" 从后往前: :" +listIterator.previous());         }

 

 

注意:由后向前输出时必须先由前向后输出。因为 hasPrevious()方法实现中有一个游标 cursor会判断是否有元素。

在使用 ListIterator接口进行双向输出时,如果想完成从后往前的输出,则一定要先进行从前往后的输出。

实现List 接口的常用类有LinkedList, ArrayList, Vector和 Stack。

 

LinkedList类

LinkedList允许null元素,意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。

一种解决方法是在创建List时构造一个同步的List:
      List list = Collections.synchronizedList(new LinkedList(...));

 

ArrayList类

        ArrayList类实现了可变大小的数组,它继承了AbstractList 并且实现了List 接口。在我们能确定它的容量的时候,

   初始化时我们需要给出一个初始值,这样当容量不够时它不用重新在分配容量。可以提高性能。

   和LinkedList一样,ArrayList也是非同步的(unsynchronized)。

 

Vector类

Vector 类似于ArrayList ,但是Vector是同步的。当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态

(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕 获该异常。

 

Stack类

Stack 继承了Vector,所有它也是同步的,它其实是一个后进先出的堆栈,有基本的push、peek和pop方法。

 

小结:

(1)对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。

(2)对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

(3)Vector是基于Synchronized实现的线程安全的ArrayList。即Vector是线程安全的。

       ArrayList适用于单线程,Vector适用于多线程。

List<String> list = new LinkedList<String>();         List<String> arrList = new ArrayList<String>();         long startTime = new Date().getTime();         for (int i = 0; i < 200000; i++) {             list.add("AAA"+i);         }         long endTime = new Date().getTime();         System.out.println("LinkedList 花费:" + (endTime - startTime));         long startTimearr = new Date().getTime();         for (int i = 0; i < 200000; i++) {             arrList.add("AAA"+i);         }         long endTimearr = new Date().getTime();         System.out.println("ArrayList 花费:" + (endTimearr - startTimearr));
             LinkedList 花费: 195
             ArrayList 花费: 249

转载于:https://www.cnblogs.com/pan2011/p/3650046.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值