zoukankan      html  css  js  c++  java
  • JAVA集合类汇总

    缩略图如下图所示:图中,实线边框的是实现类,折线边框的是抽象类,而点线边框的是接口

    在JAVA的util包中有两个所有集合的父接口Collection和Map,它们的父子关系:

      set --其中的值不允许重复,无序的数据结构 
      list   --其中的值允许重复,因为其为有序的数据结构 
      map--成对的数据结构,健值必须具有唯一性(键不能同,否则值替换) 

     │├ ArreyList     (Class 数组,随机访问,没有同步,线程不安全)
     │├ Vector        (Class  数组                   同步        线程安全)
     │├ LinkedList    (Class  链表   插入删除   没有同步   线程不安全 
    底层是由链表实现的)
     │└ Stack          (Class)
     └+Set(接口 不能含重复的元素。仅接收一次并做内部排序,集)
     │├ HashSet            (Class)
     │├ LinkedHashSet   (Class)
     │└ TreeSet       (Class)

    +Map(接口)
     ├ +Map(接口 映射集合)
     │ ├ HashMap            (Class 不同步,线程不安全。除了不同和允许使用null 键值之外,与Hashtable大致相同)
     │ ├ Hashtable           (Class 同步   ,线程安全    。不允许实施null 键值)
     │ ├ +SortedMap 接口
     │ │   ├ TreeMap         (Class)
     │ ├ WeakHashMap     (Class)

    ArrayList , Vector , LinkedList 是 List 的实现类

    Vector是线程安全的,效率肯定没有ArrayList高了。实际中一般也不怎么用Vector,可以自己做线程同步,也可以用Collections配合ArrayList实现线程同步。

    前面多次提到扩容的代价很高,所以如果能确定容量的大致范围就可以在创建实例的时候指定,注意,这个仅限于ArrayList和Vector哟:

    ArrayList arrayList = new ArrayList(100);
    arrayList.ensureCapacity(200);
    Vector vector = new Vector(100);
    vector.ensureCapacity(200);

    a.排序

    List的排序的话就是使用Collections的sort方法,构造Comparator或者让List中的对象实现Comparaable都可以,这里就不贴代码了。

    b.去重

    第一种:用Iterator遍历,遍历出来的放到一个临时List中,放之前用contains判断一下。

    第二种:利用set的不可重复性,只需三步走。

      //第一步:用HashSet的特性去重
        HashSet tempSet = new HashSet(arrayList);
        //第二步:将arrayList清除
        tempSet.clear();
        //第三步:将去重后的重新赋给List
        arrayList.addAll(tempSet);
    Stack

    Stack呢,是继承自Vector的,所以用法啊,线程安全什么的跟Vector都差不多,只是有几个地方需要注意:

    第一:add()和push(),stack是将最后一个element作为栈顶的,所以这两个方法对stack而言是没什么区别的,但是,它们的返回值不一样,add()返回boolean,就是添加成功了没有;push()返回的是你添加的元素。为了可读性以及将它跟栈有一丢丢联系,推荐使用push。

    第二:peek()和pop(),这两个方法都能得到栈顶元素,区别是peek()只是读取,对原栈没有什么影响;pop(),从字面上就能理解,出栈,所以原栈的栈顶元素就没了。

    HashSet和TreeSet

    Set集合类的特点就是可以去重,它们的内部实现都是基于Map的,用的是Map的key,所以知道为什么可以去重复了吧。
    既然要去重,那么久需要比较,既然要比较,那么久需要了解怎么比较的,不然它将1等于2了,你怎么办?

    比较是基于hascode()方法和equals()方法的,所以必要情况下需要重新这两个方法。

    HashMap效率高于HashTable。

    多线程环境下,通常也不是用HashTable,因为效率低。HashMap配合Collections工具类使用实现线程安全。同时还有ConcurrentHashMap可以选择,该类的线程安全是通过Lock的方式实现的,所以效率高于Hashtable。

  • 相关阅读:
    C#获取当前路径
    惠普辞退4000员工,今后如何走
    提升你的编码技能,你不知道的免费在线编码资源(上)
    iPhone 5在美销量有望破5000万,Facebook手机何去何从?
    Python获取命令行参数
    C#递归获取文件目录
    Pixel’d:共创美好的像素艺术
    PayPal走向现实支付,消费者们会来买帐吗?
    兼容性测试、手工测试、自动化测试及探索性测试
    冒烟测试 smoking test
  • 原文地址:https://www.cnblogs.com/hkgov/p/7597707.html
Copyright © 2011-2022 走看看