zoukankan      html  css  js  c++  java
  • java集合框架小结(初级版)

    今天大概的整理了一下java集合框架,在这里做一个小结,方便以后查阅,本博文主要参考资料为《java编程思想第四版》第11章——持有对象以及JAVA 1.6 API文档。并没有研究更深入的第17章<容器深入研究>。大概介绍了集合框架中几个比较常用的集合类。

    以下为正文。

    首先来看一张图,不太会用visio,画的可能不太好看

    图中将接口、抽象类、实现类、淘汰类(圆角矩形)进行标注。有直线连接的类(或接口)表示是子类关系或者实现关系

    由图示可以看出,集合类主要有两个集合接口:

    1.Collection: 独立元素的序列

    2.Map:         成对出现的“键值对”对象序列

    Collection集合:

    1.1 List(数组的升级版)

    List集合即是数据结构中所讲的线性表。此接口的可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引访问元素,并搜索列表中的元素。列表通常允许重复的元素。

    List有一个抽象类:AbstractList,该子接口又有两个子类:ArrayList,Vector(已废弃)

    ArrayList即顺序表,其内部数据结构就是一个数组。相对于数组而言,最大的优点即支持扩容。相对于LinkedList的优点在于支持随机检索。缺点在于插入,删除节点效率低下

    LinkedList即链表,但是其内部实现是双向链表,而非单链表。相对于顺序表而言的有点在于,插入、删除节点效率高,虽然支持索引访问,但是其本质是遍历链表,因此访问效率低下

    Vector与ArrayList的区别:

    1.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的 

    2.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半 。

    1.2 Set(主要用于检测归属性

    Set是真正数学意义上的集合。其特点即确定性互异性无序性

    Set接口有一个子接口SortedSet及一个抽象子类AbstractSet。

    最常用的实现类有三个:HashSet、LinkedHashSet(HashSet的子类)以及TreeSet

    HashSet-基于散列表的集,加进散列表的元素要实现hashCode()方法,访问速度非常快。

    LinkedHashSet-同样是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序。这样使得元素看起 来像是以插入顺序保存的,也就是说,当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。 

    TreeSet-基于(平衡)树的数据结构。TreeSet是SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方式,自然排序 和定制排序,其中自然排序为默认的排序方式。

    1.3 Queue(并发编程中很重要)

    Queue即数据结构中所提到的“队列”,其实队列的功能完全可以由线性表实现。事实上,“队列”和“栈”也的确是有插入删除规范的线性表。java也很体贴的让LinkedList实现了Queue接口。(ArrayList并不合适)

    如图中所示

    Queue接口有一子接口:Deque和一抽象类AbstractQueue,并有三个常用实现类PriorityQueue,LinkedList,ArrayDeque

    LinkedList自不必说。

    PriorityQueue(常称为优先级队列)是不同于FIFO队列的另一种队列。其是个基于优先级堆的极大优先级队列。此队列按照在构造时所指定的顺序对元素排序,既可以根据元素的自然顺序来指定排序(参阅 Comparable),

    也可以根据 Comparator 来指定,这取决于使用哪种构造方法。优先级队列不允许 null 元素。依靠自然排序的优先级队列还不允许插入不可比较的对象(这样做可能导致 ClassCastException)
    优先队列有几点需要注意的地方:
    1: 该队列是用数组实现(堆),但是数组大小可以动态增加,容量无限。

    2: 此实现不是同步的。不是线程安全的。如果多个线程中的任意线程从结构上修改了列表, 则这些线程不应同时访问 PriorityQueue 实例,这时请使用线程安全的PriorityBlockingQueue 类。
    3: 不允许使用 null 元素。
    4: 此实现为插入方法(offer、poll、remove() 和 add 方法)提供 O(log(n)) 时间(堆的调整); 为 remove(Object) 和 contains(Object) 方法提供线性时间; 为检索方法(peek、element 和 size)提供固定时间。

    2. Map

    Map接口不是Collection接口的继承。

    Map接口用于维护键/值对。该接口描述了从不重复的键到值的映射。Map 接口提供三种collection 视图,允许以键集、值集合或键-值映射关系集的形式查看某个映射的内容:

    Set keySet(): 返回映像中所有关键字的视图集

    Collection values():返回映像中所有值的视图集

    Set entrySet(): 返回Map.Entry对象的视图集,即映像中的关键字/值对

    Map接口有一个子接口SortedMap,该接口有两个实现类:TreeMap(ConcurrentSkipListMap不常用,不作讨论)

    由于TreeMap它底层采用一棵“红黑树”来保存集合中的 Entry,这意味这 TreeMap 添加元素、取出元素的性能都比HashMap OlgN:当 TreeMap 添加元素时,需要通过循环找到新增 Entry 的插入位置,因此比较耗性能;当从TreeMap 中取出元素时,需要通过循环才能找到合适的 Entry,也比较耗性能。但 TreeMap、TreeSet 比HashMap、HashSet 的优势在于:TreeMap 中的所有 Entry 总是按 key 根据指定排序规则保持有序状态,TreeSet 中所有元素总是根据指定排序规则保持有序状态,对排序二叉树,若按中序遍历就可以得到由小到大的有序序列  

    Map接口有一个抽象类,并有三个常用的实现子类:HashMap,LinkedHashMap(HashMap的子类)、以及TreeMap

    HashMap,其中最最常用的即HashMap。Map 插入、删除和查找元素HashMap 是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。使用HashMap要求添加的键类明确定义了hashCode()equals()的实现。

    LinkedHashMap:扩展HashMap插入顺序将关键字/值对添加进链接哈希映像中。象LinkedHashSet一样,LinkedHashMap内部也采用双重链接式列表。所以迭代顺序也就是插入顺序。

    Collection 和 Collections的区别。  

    Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。  

    Collection是个java.util下的接口,它是各种集合结构的父接口

     

    ArrayList和Vector的区别。 

    一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的 
    二.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半
      

     

    HashMap和Hashtable的区别  
    一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现   

    二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的  

    三.值:只有HashMap可以让你将空值作为一个表的条目的key或value 

  • 相关阅读:
    mybatis 错误 Invalid bound statement (not found)
    Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.
    bug 记录 Unable to start ServletWebServerApplicationContext due to multiple ServletWebServerFactory beans
    解决:The Tomcat connector configured to listen on port 8182 failed to start. The port may already be in use or the connector may be misconfigured.
    jquery validate 验证插件 解决多个相同的Name 只验证第一个的方案
    phpStorm+xdebug调试(php7.3)
    小程序视频多个视频播放与暂停
    CSS实现单行、多行文本溢出显示省略号(…)
    Packet for query is too large (4,544,730 > 4,194,304). You can change this value on the server by setting the 'max_allowed_packet' variable.
    idea自动在文件头中添加作者和创建时间
  • 原文地址:https://www.cnblogs.com/huntfor/p/3889220.html
Copyright © 2011-2022 走看看