一、 Collection

1、 List

a、 ArrayList

b、 Vector

c、 LinkedList

首先要对List的三种实现进行一个简单的异同比较:

同:

*ArrayList和Vector都可以看做是一个可变的数组;

*ArrayList和LinkedList都属于线程不安全的类型;

*但是ArrayList和LinkedList都可以通过调用Colletions类里的SynchronizedList()来进行ArrayList和LinkedList的调用来保证线程的安全性;

异:

*ArrayList和Vector虽然都可以看做是一个可变的数组,但是Vector类中大部分函数都包含了Synchronized关键字保证了线程的安全性;

*ArrayList和LinkedList虽然都属于线程不安全的类型,但是LinkedList实际上是一种双向链表的存储集合,而ArrayList实际上是数组;

*ArrayList和Vector因为都是可变的数组,所以在数据查找上的效率是跟数组差不多,因为数组存储过程中会有明确的下表同时保存起来所以相对速度会更快一些,但是在数据插入的时候,在数组中插入数据实际上是牵扯到了内存的调动所以在数据插入时是相对较慢的,而Vector因为大部分方法都考虑了线程安全的问题,所以效率相对ArrayList更加缓慢一些;

*LinkedList因为是双向链表方式,所以实际上是通过<Node>节点来进行数据的存储的,并在存储一个节点的同时,记录它的前一个及后一个节点,并且在集合中标识出了首节点first和终节点last。所以在数据添加的时候实际上只要在对应节点添加指向并记录前后节点即可,在效率上远远高于ArrayList,但是在查询是,当LinkedList需要查询某一个下标的节点数据时,需要遍历整个集合,计算相对应的下标才可以查询出来,所以LinkedList的查询相对更加缓慢一些。

ArrayList的add方法表明是数组添加:

Vector的函数实现,表明是线程安全的:

LinkedList源码展示,表现是双向链表:

代码展示ArrayList和LinkedList插入和查询效率比较:

输出结果为:

这个结果有没有很惊讶呢?

2、 Set

a、 HashSet

b、 TreeSet

简单分析一下HashSet和TreeSet的异同

同:

*都是基于Map来进行数据的存储的

*都是线程不同步的

*都不能存储重复数据(因为都是通过Map的key值进行数据存储的,所以不允许存在重复数据)

*都只能通过Iterator来进行遍历

异:

*HashSet是一个无序的集合,TreeSet是一个有序的集合,并且可根据自然排序或者TreeSet创建时的Comparator进行排序;

*HashSet可以存储Null,TreeSet不允许存储Null(因为需要compareTo函数,Null值无法比较,所以会抛空指针异常)

*HashSet是基于HashMap实现的,TreeSet是基于TreeMap实现的

HashSet基本源码及相关继承:

TreeSet基本源码及相关继承:

TreeSet,add null时源码跟踪:

HashSet及TreeSet的基本遍历:

输出结果为:

二、 Map

以下等多种map的实现类,主要有一下共同点就是,实现了Map接口,并且都是通过Key-Value键值对形式存储数据。接下来单独说一下他们各自的特点

1、 Hashtable

首先Hashtable继承于Dictionary,实现了Map、Cloneable、Serializable接口,并且其中大部分方法都是通过synchronized关键字修饰意味着,Hashtable是线程同步的。

并且Hashtable的key-value值都不可以存储null值因为在put函数中,校验了value如果为null直接抛空指针,并且需要计算key值的hashcode值,所以hashtable是不允许存储null的,并且其实Hashtable也是通过Entry<K, V>对象的数组来进行数据存储的:

2、 HashMap

首先HashMap继承于AbstractMap,实现了Map、Cloneable、Serializable接口,但是hashMap并不是线程同步的,当然从另一种角度来说,HashMap的效率就要高于Hashtable了。

其次HashMap并不禁止key-value值存储null值,因为其实Map也是通过node节点进行参数存储的,如下代码:

另外,HashMap的存储方式其实类似excel一样的空间,在HashMap的存储空间中就是一列列小格子,每一列都代表着一个hash值,我们在将参数存储至HashMap后,在我们需要查找的时候,我们会先根据key值的hash值快速定位出那一列,然后通过equals方法快速定位出我们需要的键值对。另外需要补充说明的一点是HashMap使用的是散列算法,会尽量分散key值得hash值范围,以此保证尽量在‘同一列’不会保存过多的键值对。

源码有兴趣可以跟一下HashMap的get方法,最底层是一个find的递归函数:

3、 TreeMap

首先TreeMap继承于AbstractMap,实现了NavigableMap、Cloneable、Serializable接口,但是TreeMap并不是线程同步的,但是TreeMap是有序的。

另外需要说明一下的是TreeMap的key值是不允许存储null的,因为在TreeMap的存储过程中是需要通过key值调用compare方法来进行一个比较排序的,所以在TreeMap存储的过程中如果key值为null是会报空指针异常的。

还有一点要注意的是TreeMap和HashTable一样是通过Entry<K, V>对象来存储数据的,但是和Hashtable不一样的是,TreeMap的存储方式更接近与一个树装链表一样的存在,在存储一个Entry节点的过程中还会将这个Entry节点的左右及父节点一起保存下来。

如图,PS:如果需要更详细的了解TreeMap的相关实现方式可以查询一下红黑树,因为TreeMap就是基于红黑树(Red-Black tree)实现的。

4、 WeakHashMap

基本功能与HashMap相同,与HashMap最核心的不同即WeakHashMap是一个弱键值对,意思大致解释说当WeakHashMap的key值失去引用时,当发生了java的垃圾回收时,WeakHashMap的对应键值对会被清除:

5、 简单展示一些HashMap、Hashtable的遍历方式

a、 HashMap的遍历:

HashMap与TreeMap、WeakHashMap一样都有以下四种遍历方式:

输出结果如下:

PS: HashMap的keySet也可以通过iterator方式遍历就不在此展示了。

b、 Hashtable的遍历:

Hashtable除了和HashMap同样的四种遍历方式外,还有一种相对独有的遍历方式接下来进行展示一下:

代码依然是照片,手敲有益身心健康,没事还是可以多读一读jdk源码有很多值得学习的地方

Java集合简单解析的更多相关文章

  1. java集合List解析

    作为一个Developer,Java集合类是我们在工作中运用最多的.最频繁的类.相比于数组(Array)来说,集合类的长度可变,更加适合于现代开发需求: Java集合就像一个容器,可以存储任何类型的数 ...

  2. Java集合简单介绍

    再最前面分享一下我再学习集合时的方法: 1.首先了解各集合的定义和特点 2.集合的构造方法和常用方法(增删改查等) 3.了解集合使用的场景,再什么情况下使用什么类型的集合(关键是集合的特性) 4.了解 ...

  3. java集合简单特性

  4. Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例

    概要  前面,我们已经学习了ArrayList,并了解了fail-fast机制.这一章我们接着学习List的实现类——LinkedList.和学习ArrayList一样,接下来呢,我们先对Linked ...

  5. Java 集合系列07之 Stack详细介绍(源码解析)和使用示例

    概要 学完Vector了之后,接下来我们开始学习Stack.Stack很简单,它继承于Vector.学习方式还是和之前一样,先对Stack有个整体认识,然后再学习它的源码:最后再通过实例来学会使用它. ...

  6. Java 集合系列10之 HashMap详细介绍(源码解析)和使用示例

    概要 这一章,我们对HashMap进行学习.我们先对HashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用HashMap.内容包括:第1部分 HashMap介绍第2部分 HashMa ...

  7. Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例

    概要 前一章,我们学习了HashMap.这一章,我们对Hashtable进行学习.我们先对Hashtable有个整体认识,然后再学习它的源码,最后再通过实例来学会使用Hashtable.第1部分 Ha ...

  8. java集合框架之java HashMap代码解析

     java集合框架之java HashMap代码解析 文章Java集合框架综述后,具体集合类的代码,首先以既熟悉又陌生的HashMap开始. 源自http://www.codeceo.com/arti ...

  9. Java 集合系列 09 HashMap详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

随机推荐

  1. Invalid [xxx] in servlet mapping 、 <url-pattern>的匹配规则 、 DefaultServlet介绍

    真的是很容易被忽视的错误,servlet 配置url的时候遇到问题,这个之前确实没有详细了解过. 出现这个错误的时候往往伴随着一系列高大上的错误,比如会出现类似[StandardEngine[Cata ...

  2. CSS的五种基本选择器

    要使用css对HTML页面中的元素实现一对一,一对多或者多对一的控制,这就需要用到CSS选择器. ㈠什么是选择器? 每一条css样式定义由两部分组成,形式如下: [code] 选择器{样式} [/co ...

  3. Visual Stdio C++ 编译器、链接器常用命令

    概览: cmd常用命令配合使用: del 删除指定文件 同erase cls 清屏 rd 删除空目录文件夹 dir 显示目录 cd 在当前盘符跳转指定目录(不同盘符跳转用盘符号)(分别表示根目录 上一 ...

  4. hdu 1081 dp问题:最大子矩阵和

    题目链接 题意:给你一个n*n矩阵,求这个矩阵的最大子矩阵和 #include<iostream> #include<cstdio> #include<string.h& ...

  5. C# 下载文件的心得

    下载文件最常用的有两种: 第一种:直接使用A标签,对应着文件的地址. 第二种:将文件写成流,然后在回传给客户端. 第一种,使用起来方便,但是有个坏处,如果你的文件是可编辑的文件(比如Excel wor ...

  6. [NLP] 语义网络与知识图谱入门(二)

    语义网络与知识图谱入门(二) OWL 本体声明 owl用owl:Ontology来声明一个本体.rdf:about属性为本体提供一个名称或引用.根据标准,当rdf:about属性的值为"&q ...

  7. D2下午

    前言 至于为什么D2要分上下午,唯一的原因就是lyd那个毒瘤用了一上午讲他昨天要讲的鬼畜东西,所以今天下午才开始讲数论了 对了,补一下lyd的数论人 <数论人>(大雾) 数论的光束是歌德巴 ...

  8. C++动态链接库实践

    参考:https://www.cnblogs.com/Anker/p/3746802.html gcc -fPIC -shared calc.c -o libcalc.so, 编译得到 在linux上 ...

  9. OpenCV学习笔记(7)——图像阈值

    简单阈值,自适应阈值,Otsu's二值化等 1.简单阈值 当像素值高于阈值时,我们给这个像素赋予一个新值,否则给他赋予另一个值.这个函数就是cv2.threshhold().这个函数的第一个参数就是原 ...

  10. nodejs之静态文件托管、 路 由、EJS 模板引擎、GET、POST

    1.静态文件托管 静态文件托管:是指对于一个js方法进行封装,提高代码可读性 //fs模块 var fs=require('fs'); //path模块 var path=require('path' ...