• JAVA基础——集合浅析


    Java  集合

         数组是一种很常见的数据结构,开始接触编程的时候多数程序都和数组相关。刚开始接触Java时也是一直使用数组写一些程序,后来越来越觉得数组这东西没法满足需求了,这时一位“前辈”对我说了一句:不会用集合类就等于没学过Java。然后才知道有集合类。

        什么时候数组会显得力不从心,没法满足需求,需要集合类呢?

    1. 不知道具体数据长度
    2. 需要自动排序
    3. 存储键值对

        当然,上面的情况不是绝对的,只是数组比较难满足。这时集合类(也可称为容器类)就显示了它强大的功能。

        集合类的分类(图片转自http://biancheng.dnbcw.info/1000wen/359774.html)

        

        上图中不包含Queue内容,部分Map的实现类未给出。

        常见使用的有List、Set、Map及他们的实现类。

        List、Set、Map接口及各实现类的特性

    接口

    特性

    实现类

    实现类特性

    成员要求

    List

    线性、有序的存储容器,可通过索引访问元素

    ArrayList

    数组实现。非同步。

    Vector

    类似ArrayList,同步。

    LinkedList

    双向链表。非同步。

    Map

    保存键值对成员

    HashMap

    基于哈希表的 Map 接口的实现,满足通用需求

    任意Object对象,如果修改了equals方法,需同时修改hashCode方法

    TreeMap

    默认根据自然顺序进行排序,或者根据创建映射时提供的 Comparator进行排序

    键成员要求实现caparable接口,或者使用Comparator构造TreeMap。键成员一般为同一类型。

    LinkedHashMap

    类似于HashMap,但迭代遍历时取得“键值对”的顺序是其插入顺序或者最近最少使用的次序

    与HashMap相同

    IdentityHashMap

    使用==取代equals()对“键值”进行比较的散列映射

    成员通过==判断是否相等

    WeakHashMap

    弱键映射,允许释放映射所指向的对象

    ConcurrentHashMap

    线性安全的Map

    Set

    成员不能重复

    HashSet

    为快速查找设计的Set

    元素必须定义hashCode()

    TreeSet

    保持次序的Set,底层为树结构

    元素必须实现Comparable接口

    LinkedHashSet

    内部使用链表维护元素的顺序(插入的次序)

    元素必须定义hashCode()

      在满足要求的情况下,Map应尽量使用HashMap,Set应尽量使用HashSet。

        集合类的基本使用

        List

    List基本操作

        ArrayList和LinkedList的效率比较

    ArrayList添加元素的效率

        执行时间比较

    执行次数(在0号位置插入)

    ArrayList所用时间(ms)

    LinkedList所用时间(ms)

    10000

    31

    0

    20000

    141

    0

    40000

    484

    16

    80000

    1985

    0

    160000

    7906

    0

    320000

    31719

    16

    执行次数(在尾部插入)

    ArrayList所用时间(ms)

    LinkedList所用时间(ms)

    10000

    0

    0

    20000

    15

    0

    40000

    0

    0

    80000

    0

    0

    160000

    0

    15

    320000

    0

    16

    循环输出次数(get(index)方法)

    ArrayList所用时间(ms)

    LinkedList所用时间(ms)

    10000

    93

    204

    20000

    188

    797

    40000

    328

    2734

    80000

    688

    13328

    160000

    1594

    62313

    320000

    2765

    太久了……

        因为ArrayList底层由数组实现,在0号位置插入时将移动list的所有元素,在末尾插入元素时不需要移动。LinkedList是双向链表,在任意位置插入元素所需时间均相同。所以在List中有较多插入和删除操作的情况下应使用LinkedList来提高效率,而有较多索引查询的时候使用ArrayList(使用增强型的for循环或Iterator遍历LinkedList效率将提高很多)。

     

  • 相关阅读:
    js实现页面触摸滑动
    关于js中window.location.href,location.href,parent.location.href,top.location.href的用法
    eclipse tomcat 插件
    Eclipse中的Web项目自动部署到Tomcat的webapp目录下
    i=i+1与i+=1的区别及效率(Java)
    Java super和this
    Thinkphp
    单一静态网页如何实现点击左边菜单在右边展现内容
    dbda封装类(包括:返回二维数组、Ajax调用返回字符串、Ajax调用返回JSON)
    图片轮播代码
  • 原文地址:https://www.cnblogs.com/huan-guo/p/8453997.html
Copyright © 2020-2023  润新知