目录

  • Java 集合类的基本概念
  • Java 集合类的层次关系
  • Java 集合类的应用场景

一. Java集合类的基本概念

在编程中,常需要集中存放多个数据,数组是一个很好的选择,但数组的长度需提前指定且不可变,如果我们需要保存一个动态增长的数据(其数量不确定),Java集合类可以很好实现。

集合类又称为容器类。所有的集合类都位于 java.util 包下,为了处理多线程环境下的并发安全问题,在 java.util.concurrent 包下提供了一些多线程支持的集合类。

Java集合类可分为两大类:

1)Collection :

  • 1.1)List必须保持元素特定的顺序
  • 1.2)Set不能有重复元素
  • 1.3)Queue保持一个队列(先进先出)的顺序

2)Map :

  • 保存的是一组 “键值对” 对象 (key-value对)

 

【虚线箭头表示实现关系,实线箭头表示继承关系】

二. Java集合类的层次关系

1. Iterable<T> 接口

java.lang 下的 Interface Iterable<T> 迭代器接口,是Collecton接口的父接口,包括

  • default void forEach() 方法
  • Iterator<T> iterator() 方法  【Iterator<T> 是java.util 下的接口】
实现这个Iterable接口的对象允许使用foreach进行遍历,所以,所有的Collection集合对象都具有"foreach可遍历性"。

2. Collection 接口

1)Set 接口,继承自Collection 接口。“丢进”Set集合里的多个对象之间没有明显的顺序,不能包含重复元素。【元素特点:无序,不重复】

注:Set判断两个元素是否相同是用equals(object)方法,相同返回true,不同返回false,Set会接受该新元素,而不是用“==”运算符。因此,Set的实现类应实现一个有效的equals(object)方法;

  • HashSet :允许使用null元素,基于HashMap实现;【非线程安全】

HashSet使用HASH算法来存储集合中的元素,因此具有良好的存取和查找性能。

当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该HashCode值决定该对象在HashSet中的存储位置。

注:HashSet集合判断两个元素相等的标准是两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法的返回值相等

  • LinkedHashSet:继承自HashSet,允许null元素,LinkedHashSet中有一个LinkedHahsMap(适配器模式),基于双向链表和HashMap实现;【非线程安全】

LinkedHashSet集合也是根据元素的hashCode值来决定元素的存储位置,但和HashSet不同的是,它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的。LinkedHashSet需要维护元素的插入顺序,因此性能略低于HashSet的性能,但在迭代访问Set里的全部元素时(遍历)将有很好的性能(链表很适合进行遍历)

  • TreeSet : 不允许null元素,基于TreeMap 实现,底层是红黑树;【非线程安全】

Treeset有两种排序方式:自然排序和比较器排序。

A)自然排序:默认排序方式,java.lang 下的comparable 接口,实现了int compareTo(T o)方法;

obj1.compareTo(obj2)方法如果返回0,表示两个对象相等;如果返回一个正数,则表明obj1>obj2;如果返回一个负数,则表明obj1<obj2.

如果两个对象的equals方法返回true,则其compareTo方法应该返回0;

B)比较器排序:java.util 下的comparator接口,实现了int compare(T o1,T o2)方法,取决于创建TreeSet时所用的构造方法;

TreeSet实现java.io.Serializable的方式。当写入到输出流时,依次写入“比较器、容量、全部元素”;当读出输入流时,再依次读取。

2)List接口List集合代表一个元素有序、可重复的集合,集合中每个元素都有其对应的顺序索引。List集合允许加入重复元素,因为它可以通过索引来访问指定位置的集合元素。【元素特点:有序,可重复】

  • ArrayList : 允许null 元素,基于数组实现,它封装了一个动态的增长的、允许再分配的Object[]数组。【非线程安全】

  • LinkedList : 允许null元素,基于双端链表实现,可用作队列和栈;Deque接口继承自Queue接口。【非线程安全】

  • Stack,继承自Vector,用于模拟“栈”先进后出;【线程安全】

3)Queue接口

用于模拟"队列"这种数据结构(先进先出 FIFO)。队列的头部保存着队列中存放时间最长的元素,队列的尾部保存着队列中存放时间最短的元素。新元素插入(offer)到队列的尾部,访问元素(poll)操作会返回队列头部的元素,队列不允许随机访问队列中的元素。

  • PriorityQueue : 不允许null元素,按照队列元素的大小进行重新排序,底层以二叉堆实现;
  • ArrayDeque : 是一个基于数组的双端队列,和ArrayList类似,它们的底层都采用一个动态的、可重分配的Object[]数组来存储集合元素
  • LinkedList

3. Map 接口

Map用于保存具有"映射关系"的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另外一组值用于保存Map里的value。key和value都可以是任何引用类型的数据。
Map 的key不能重复,允许null值,value可重复,允许null值;
  • HashMap : jdk1.7与jdk1.8的底层实现原理有差别,jdk1.7 :散列表+链表 ;jdk1.8: 散列表+链表+红黑树 【非线程安全】

两个key通过equals()方法比较返回true,同时两个key的hashCode值也必须相等。

  • LinkedHashMap : 继承自HashMap, 底层是双向链表+HashMap 【非线程安全】

  • TreeMap :实现了SortedMap<K,V>接口,该接口继承自Map接口,底层实现是红黑树【非线程安全】
TreeMap就是一个红黑树数据结构,每个key-value对即作为红黑树的一个节点。TreeMap存储key-value对(节点)时,需要根据key对节点进行排序。TreeMap可以保证所有的key-value对处于有序状态。同样,TreeMap也有两种排序方式: 自然排序、定制排序。
  • Hashtable :【线程安全】

三、集合类的使用场景

1.Set集合类的应用场景(HashSet、LinkedHashSet、TreeSet)

1)HashSet的性能总是比TreeSet好,因为TreeSet需要额外的红黑树算法来维护集合元素的次序。只有当需要一个保持排序的Set时,才应该使用TreeSet,否则都应该使用HashSet。

2)对于普通的插入、删除操作,LinkedHashSet比HashSet要略慢一点,这是由维护链表所带来的开销造成的。不过,因为有了链表的存在,遍历LinkedHashSet会更快。

3)EnumSet是所有Set实现类中性能最好的,但它只能保存同一个枚举类的枚举值作为集合元素。

4)HashSet、TreeSet、EnumSet都是"线程不安全"的,通常可以通过Collections工具类的synchronizedSortedSet方法来"包装"该Set集合。

Set s = Collections.synchronizedSet(new HashSet<>());

或SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));

2.List 集合类的应用场景(ArrayList 、LinkedList)
1)java提供的List就是一个"线性表接口",ArrayList(基于数组的线性表)、LinkedList(基于链表的线性表)是线性表的两种典型实现。
2)Queue代表了队列,Deque代表了双端队列(既可以作为队列使用、也可以作为栈使用)
3)内部以链表作为底层实现的集合在执行插入、删除操作时有很好的性能
4)因为数组以一块连续内存来保存所有的数组元素,所以数组在随机访问时性能最好。所以的内部以数组作为底层实现的集合在随机访问时性能最好。
3.Map集合类的应用场景(HashMap 、 linkedHashMap、TreeMap)
1)HashMap和Hashtable的效率大致相同,因为它们的实现机制几乎完全一样。但HashMap通常比Hashtable要快一点,因为Hashtable需要额外的线程同步控制。
2) TreeMap通常比HashMap、Hashtable要慢(尤其是在插入、删除key-value对时更慢),因为TreeMap底层采用红黑树来管理key-value对。
3) 使用TreeMap的一个好处就是: TreeMap中的key-value对总是处于有序状态,无须专门进行排序操作。



Java集合类——Set、List、Map、Queue接口的更多相关文章

  1. 牛客网Java刷题知识点之Java集合类里面最基本的接口有哪些

    不多说,直接上干货! https://www.nowcoder.com/ta/review-java/review?tpId=31&tqId=21086&query=&asc= ...

  2. 面试3——java集合类总结(Map)

    1.概述: Java 中的map集合使用键值对(key-value)来保持数据,其中值(value)可以重复,键(key)必须唯一,但最多只能有一个key为空,它的主要实现类有HashMap.Hash ...

  3. Java分享笔记:Map集合(接口)的基本方法程序演示

    package pack02; import java.util.*; public class MapDemo { public static void main(String[] args) { ...

  4. Java集合类学习笔记(Queue集合)

    Queue集合用于模拟队列(先进先出:FIFO)这种数据类型. Queue有一个Deque接口,代表一个"双端队列",双端队列可以同时从两端来添加.删除元素,因此Deque的实现类 ...

  5. Java集合类里面最基本的接口

    Collection:代表一组对象,每一个对象都是它的子元素. Set:不包含重复元素的Collection. List:有顺序的Collection,并且可以包含重复元素. Map:可以把键(key ...

  6. Java集合类框架的基本接口有哪些?

    总共有两大接口:Collection 和Map ,一个元素集合,一个是键值对集合: 其中List和Set接口继承了Collection接口,一个是有序元素集合,一个是无序元素集合: 而ArrayLis ...

  7. java集合类框架的基本接口有哪些

    集合类接口指定了一组叫做元素的对象.集合类接口的每一种具体的实现类都可以以他自己的方式对元素进行保存和排序.有的集合允许重复的键,有些不允许. java集合类里面最基本 的接口: Collection ...

  8. Java集合类--温习笔记

    最近面试发现自己的知识框架有好多问题.明明脑子里知道这个知识点,流程原理也都明白,可就是说不好,不知道是自己表达技能没点,还是确实是自己基础有问题.不管了,再巩固下基础知识总是没错的,反正最近空闲时间 ...

  9. java 集合类基础问题汇总

     1.Java集合类框架的基本接口有哪些? 参考答案 集合类接口指定了一组叫做元素的对象.集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序.有的集合类允许重复的键,有些不允许 ...

  10. Java集合类的概述

    前述 复习一下Java中的集合类,是面试笔试中常考察的一个点,特地做的整理. 什么是集合类? 集合类,也叫容器类.Java集合类可以用来存储数量庞大的对象. 我们和数组进行对比: 数组:存储基本数据类 ...

随机推荐

  1. PAT 1043 Is It a Binary Search Tree

    #include <cstdio> #include <climits> #include <cstdlib> #include <vector> co ...

  2. 【阿里云产品公测】小白对OTS两点小建议

    作者:阿里云用户荷包蛋 我是大一的新生,作为一个爱技术爱学习爱折腾的熊孩子,我在暑假申请了ECS,学到了很多东西.现在阿里巴巴又开放了很多免费测试,我抱着学习和围观的心态申请了测试,其中有OTS这个高 ...

  3. ArcGIS Geodabase OBJECTID重新初始编号的间接方法

    ArcGIS Geodabase OBJECTID为Long型,随着Feature的增加和删除自动编号,均为增加.即删除Feature后,再增加该号码自动只增加不重新编号. 间接方法可以实现重新从1编 ...

  4. HTML基础内容(持续更新...)

    1.<!DOCTYPE html>声明有助于浏览器中正确显示网页 HTML5<!DOCTYPE html>HTML 4.01<!DOCTYPE HTML PUBLIC & ...

  5. RedHat 6.4源码方式安装mysql5.5

    参考文档:http://dev.mysql.com/downloads/file/?id=463397 下载地址http://dev.mysql.com/doc/refman/5.7/en/ 文档地址 ...

  6. 林锐:5 C++/C程序的基本概念

    5.1.1 main 不能重载 不能内联 不能定义为static 不能取其地址 不能由用户直接调用 5.1.3内部名称 struct Sample_1 { int count; }; struct S ...

  7. 最简单的nginx教程 - 如何把一个web应用部署到nginx上

    Nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务.Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Ра ...

  8. Android进阶笔记09:Android 万能适配器

    1. Android 万能适配器      项目中Listview GridView几乎是必用的组件,Android也提供一套机制,为这些控件绑定数据,那就是Adapter.用起来虽然还不错,但每次都 ...

  9. Apache轻量级性能測试工具--ab

    Apache轻量级性能測试工具--ab ab早已不是什么新奇玩意,平时工作中会须要一些性能測试.简单的性能測试全然能够由AB来替代,而不须要动用LR这样重量级的工具. 此文简介一下ab的工具使用与结果 ...

  10. 【[SDOI2016]排列计数】

    一眼题,答案就是\(C_m^m*d_{n-m}\) 就是从\(n\)个中选取\(m\)个在位,剩下的错排,之后就是乘法原理了 但是我发现我的错排公式竟然一直不会推 这个递推式很简单,就是\(d[1]= ...