zoukankan      html  css  js  c++  java
  • java核心(十五):List、Set、Map功能分析

    一、List、Set、Map三者关系分析
     
      解释一:List与Set的区别
    1. List和Set都是接口继承于Collection接口;
    2. 最大的不同就是List是可以重复的。而Set是不能重复的;
    3. List接口有三个实现类:LinkedList、ArrayList、Vector ,Set接口有两个实现类:HashSet(底层由HashMap实现)、TreeSet、LinkedHashSet;
    4. List适合经常追加数据、插入、删除数据。但随机取数效率比较低;
    5. Set适合经常地随机储存、插入、删除。但是在遍历时效率比较低。
     
      解释二:Set与Map
    1. Set对每个对象只接受一次,并使用自己内部的排序方法(通常,你只关心某个元素是否属于Set,而不关心它的顺序--否则应该使用List)。
    2. Map同样对每个元素保存一份,但这是基于"键"的,Map也有内置的排序,因而不关心元素添加的顺序。如果添加元素的顺序对你很重要,应该使用LinkedHashSet或者LinkedHashMap.
       总结:
    1. List有顺序有重复没有排序,set无重复有排序。
    2. map的key也和set一样。
    3. 如果想跟List一样需要有插入元素的顺序,请使用LinkedHashSet或者LinkedHashMap。

      

    特别说明

    1. 容器类仅能持有对象引用(指向对象的指针),而不是将对象信息copy一份至数列某位置。
    2. Collection没有get()方法,只能通过iterator()遍历元素。Set和Collection拥有一模一样的接口。List可以通过get()方法来一次取出一个元素。
    3. 一般使用ArrayList。用LinkedList构造堆栈stack、队列queue。
    4. HashMap会利用对象的hashCode来快速找到key。说明:哈希码就是将对象的信息经过一些转变形成一个独一无二的int值,这个值存储在一个array中。我们都知道所有存储结构中,array查找速度是最快的,所以,可以加速查找。发生碰撞时,让array指向多个values,即,数组每个位置上又生成一个梿表。
    5. LinkedList、ArrayList、HashSet是非线程安全的,Vector是线程安全的;
    6. HashMap是非线程安全的,HashTable是线程安全的;
     
    二、List的功能方法
      1、List接口及实现类
      实际上有两种List: 一种是基本的ArrayList,其优点在于随机访问元素,另一种是更强大的LinkedList,它并不是为快速随机访问设计的,而是具有一套更通用的方法。
      List : 次序是List最重要的特点:它保证维护元素特定的顺序。List为Collection添加了许多方法,使得能够向List中间插入与移除元素(这只推荐LinkedList使用。)一个List可以生成ListIterator,使用它可以从两个方向遍历List,也可以从List中间插入和移除元素。
      ArrayList : 由数组实现的List。允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢。ListIterator只应该用来由后向前遍历ArrayList,而不是用来插入和移除元素。因为那比LinkedList开销要大很多。
      LinkedList : 对顺序访问进行了优化,向List中间插入与删除的开销并不大。随机访问则相对较慢。(使用ArrayList代替。)还具有下列方法:addFirst(), addLast(), getFirst(), getLast(), removeFirst() 和 removeLast(), 这些方法 (没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。
     
      2、ArrayList 与 LinkedList 的区别和适用场景
     
      (1)Arraylist :
    • 优点:ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的)。
    • 缺点:因为地址连续, ArrayList要移动数据,所以插入和删除操作效率比较低。   
     
      (2)LinkedList:
    • 优点:LinkedList基于链表的数据结构,地址是任意的,所以在开辟内存空间的时候不需要等一个连续的地址,对于新增和删除操作add和remove,LinedList比较占优势。LinkedList 适用于要头尾操作或插入指定位置的场景
    • 缺点:因为LinkedList要移动指针,所以查询操作性能比较低。
     
      (3)适用场景分析:
    •  当需要对数据进行多次访问的情况下选用ArrayList,当需要对数据进行多次增加删除修改时采用LinkedList。
    //ArrayList 有三个构造方法。比LinkedList多了一个指定初始容量的空列表。
    ArrayList()
              构造一个初始容量为 10 的空列表。 
    ArrayList(Collection<? extends E> c)
              构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。 
    ArrayList(int initialCapacity)
              构造一个具有指定初始容量的空列表。 
    //LinkedList 有两个构造方法
    LinkedList()
              构造一个空列表。 
    LinkedList(Collection<? extends E> c)
              构造一个包含指定集合中的元素的列表,这些元素按其集合的迭代器返回的顺序排列。
     
    三、Set的功能方法
      1、Set接口及实现类
      Set : 存入Set的每个元素都必须是唯一的,因为Set不保存重复元素。加入Set的元素必须定义equals()方法以确保对象的唯一性。Set与Collection有完全一样的接口。Set接口不保证维护元素的次序。
      HashSet : 为快速查找设计的Set。存入HashSet的对象必须定义hashCode()。
      TreeSet : 保存次序的Set, 底层为树结构。使用它可以从Set中提取有序的序列。
      LinkedHashSet : 具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。
     
      2、HashSet 与Treeset 的区别及适用场景
      (1)TreeSet:
    • TreeSet 是二差树(红黑树的树据结构)实现的,Treeset中的数据是自动排好序的,不允许放入null值 
      (2)HashSet:
    • HashSet 是哈希表实现的,HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束 
    • HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的,而具有相同内容的String对象,hashcode是一样,所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例
        (3) 适用场景分析:
    • HashSet是基于Hash算法实现的,其性能通常都优于TreeSet。为快速查找而设计的Set,我们通常都应该使用HashSet。
    • 在我们需要排序的功能时,我们才使用TreeSet。
     
    四、Map的功能方法
      1、Map接口及实现类
      标准的Java类库中包含了几种不同的Map:HashMap、TreeMap、 LinkedHashMap,它们都有同样的基本接口Map,但是行为、效率、排序策略、保存对象的生命周期和判定“键”等价的策略等各不相同。
      执行效率是Map的一个大问题。看看get()要做哪些事,就会明白为什么在ArrayList中搜索“键”是相当慢的。而这正是HashMap提高速度的地方。HashMap使用了特殊的值,称为“散列码”(hash code),来取代对键的缓慢搜索。“散列码”是“相对唯一”用以代表对象的int值,它是通过将该对象的某些信息进行转换而生成的。所有Java对象都能产生散列码,因为hashCode()是定义在基类Object中的方法。
      HashMap就是使用对象的hashCode()进行快速查询的。此方法能够显著提高性能。
      Map : 维护“键值对”的关联性,使你可以通过“键”查找“值”
      HashMap : Map基于散列表的实现。插入和查询“键值对”的开销是固定的。可以通过构造器设置容量capacity和负载因子load factor,以调整容器的性能。
      LinkedHashMap : 类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点。而在迭代访问时发而更快,因为它使用链表维护内部次序。
      TreeMap : 基于红黑树数据结构的实现。查看“键”或“键值对”时,它们会被排序(次序由Comparabel或Comparator决定)。TreeMap的特点在于,你得到的结果是经过排序的。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树。 
     

       2、HashMap与TreeMap、HashTable的区别及适用场景

      (1)HashMap : 

    • HashMap 非线程安全  
    • HashMap:基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()和equals()[可以重写hashCode()和equals()],为了优化HashMap空间的使用,您可以调优初始容量和负载因子。 

       (2)TreeMap : 

    • TreeMap:非线程安全基于红黑树实现。
    • TreeMap没有调优选项,因为该树总处于平衡状态。 

       (3)适用场景分析:

    • HashMap和HashTable:HashMap去掉了HashTable的contains方法,但是加上了containsValue()和containsKey()方法。HashTable同步的,而HashMap是非同步的,效率上比HashTable要高。HashMap允许空键值,而HashTable不允许。
    • HashMap:适用于Map中插入、删除和定位元素。 
    • Treemap:适用于按自然顺序或自定义顺序遍历键(key)。

      (3)推荐阅读:HashMap的底层实现

    以上文章,部分内容转载自CSDN:
    作者:星眸之心 
    原文:https://blog.csdn.net/wangguidong520/article/details/51038574

    作者:安卓之夜 
    原文:https://blog.csdn.net/qq_22118507/article/details/51576319 
     
  • 相关阅读:
    Ubuntu 14.04 卸载通过源码安装的库
    Ubuntu 14.04 indigo 相关依赖
    Ubuntu 14.04 indigo 安装 cartographer 1.0.0
    Ubuntu 14.04 改变文件或者文件夹的拥有者
    安装cartographer遇到Unrecognized syntax identifier "proto3". This parser only recognizes "proto2"问题
    Unrecognized syntax identifier "proto3". This parser only recognizes "proto2". ”问题解决方法
    查看所有用户组,用户名
    1卸载ROS
    Ubuntu14.04 软件安装卸载
    Ubuntu14.04系统显示器不自动休眠修改
  • 原文地址:https://www.cnblogs.com/newbie27/p/10568784.html
Copyright © 2011-2022 走看看