集合整体框架图

各集合框架的概述

1. Collection(常用List和Set,不常用Queue和Vector),单元素集合。

2. Map(常用HashMap和TreeMap,不常用HashTable),key-value映射关系。

3. Iterator(迭代器)

4. Comparable和Comparator比较器

5. Collections和Arrays工具类

Java中结合和数组的比较

1. 数组的长度在初始化时指定,只能保存定长的数据。

    而集合可以保存不确定长度的数据。同时可以保存具有映射关系的数据(即关联数组,键值对key-value)。

2. 数据元素既可以是基本类型的值,也可以是对象,集合只能保存对象(实际上是只保存对象的引用变量),基本数据类型的变量要转换成对应的包装类才能放入集合中。

常用集合特性概述

List系

List的特点:元素有放入顺序,元素可以重复。

List接口的三个实现类:ArrayList、LinkedList和Vector。

ArrayList、LinkedList和Vector的区别

LinkedList:底层是基于链表实现,链表内存是散乱的,每一个元素存储本身内存地址的同时也存储下一个元素的内存地址。链表增删快,查找慢。

ArrayList和Vector:两者底层都是基于数组实现的,查询快,增删慢。两者之间的区别是ArrayList是线程非安全的,效率高;而Vector是线程安全的,效率低。

ArrayList的初始化大小是10,扩容策略是1.5倍原元素数量的大小。

选择标准

如果涉及到“动态数组”、“栈”、“队列”、“链表”等结构,应该考虑用List,具体选择哪个List实现类,根据下面的标准来取舍:

1. 对于需要快速插入、删除元素,应该使用LinkedList。

2. 对于需要快速随机访问元素,应该使用ArrayList。

3. 对于“单线程环境”或者“多线程环境,但List仅仅只会被单个线程操作”,此时应该使用非同步的类(如ArrayList)。对于“多线程环境,且List可能同时被多个线程操作”,此时,应该使用同步的类(如Vector)。

Set系

Set的特点:元素放入无顺序,元素不可重复。

Set接口的三个实现类:LinkedSet、HashSet和LinkedHashSet。

HashSet(底层是通过HashMap实现)底层通过HashCode和equals去重。

HashSet中判断集合元素相等

两个对象比较 具体分为如下四个情况:
1.如果有两个元素通过equal()方法比较返回false,且它们的hashCode()方法返回不相等,HashSet将会把它们存储在不同的位置。

2.如果有两个元素通过equal()方法比较返回true,但它们的hashCode()方法返回不相等,HashSet将会把它们存储在不同的位置。

3.如果两个对象通过equals()方法比较不相等,但hashCode()方法比较相等,HashSet将会把它们存储在相同的位置,在这个位置以链表式结构来保存多个对象。这是因为当向HashSet集合中存入一个元素时,HashSet会调用对象的hashCode()方法来得到对象的hashCode值,然后根据该hashCode值来决定该对象存储在HashSet中存储位置。

4.如果有两个元素通过equal()方法比较返回true,且它们的hashCode()方法返回true,HashSet将不予添加。

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

注意:HashSet是根据元素的hashCode值来快速定位的,如果HashSet中两个以上的元素具有相同的hashCode值,将会导致性能下降。所以如果重写类的equals()方法和hashCode()方法时,应尽量保证两个对象通过hashCode()方法返回值相等时,通过equals()方法比较返回true。

LinkedHashSet类

LinkedHashSet是HashSet对的子类,也是根据元素的hashCode值来决定元素的存储位置,同时使用链表维护元素的次序,使得元素是以插入的顺序来保存的。当遍历LinkedHashSet集合里的元素时,LinkedHashSet将会按元素的添加顺序来访问集合里的元素。但是由于要维护元素的插入顺序,在性能上略低与HashSet,但在迭代访问Set里的全部元素时有很好的性能。
注意:LinkedHashSet依然不允许元素重复,判断重复标准与HashSet一致。

补充:HashSet的实质是一个HashMap。HashSet的所有集合元素,构成了HashMap的key,其value为一个静态Object对象。因此HashSet的所有性质,HashMap的key所构成的集合都具备。可以参考后续文章中HashMap的相关内容进行比对。

TreeSet类

TreeSet是SortedSet接口的实现类,正如SortedSet名字所暗示的,TreeSet可以确保集合元素处于排序状态。此外,TreeSet还提供了几个额外的方法。

 comparator():返回对此 set 中的元素进行排序的比较器;如果此 set 使用其元素的自然顺序,则返回null。
first():返回此 set 中当前第一个(最低)元素。
last(): 返回此 set 中当前最后一个(最高)元素。
lower(E e):返回此 set 中严格小于给定元素的最大元素;如果不存在这样的元素,则返回 null。
higher(E e):返回此 set 中严格大于给定元素的最小元素;如果不存在这样的元素,则返回 null。
subSet(E fromElement, E toElement):返回此 set 的部分视图,其元素从 fromElement(包括)到 toElement(不包括)。
headSet(E toElement):返回此 set 的部分视图,其元素小于toElement。
tailSet(E fromElement):返回此 set 的部分视图,其元素大于等于 fromElement。

Map系

Map的特点:存储的元素是键值对,在JDK1.8版本中是Node,在老版本中是Entry。

Map接口有四个实现类:HashMap、HashTable、LinkedHashMap和ConcurrentHashMap。

HashMap类

HashMap是非线程安全,高效,支持null的key和value,底层实现是数组和链表,通过HashCode方法和equals方法保证键的唯一性。

如果需要使用线程安全的Map可以有两种方式:

1. 采用HashTable

2. 采用Collections.synchronizedMap(hashMap)方式进行同步。

解决冲突主要有三种方法:定址法、拉链发和再散列发。

HashMap是采用拉链法解决哈希冲突的,拉链法是将相同hash值的对象组成一个链表放在hash值对应的槽位。

HashMap的初始化大小是16,扩展因子是0.75,扩容策略是2倍原容量的大小。

put的大致流程

1. 通过hashCode方法计算出key的hash值

2. 通过hash%length计算出存储在table中的index(源码中是使用hash&(length-1),这样结果相同,但是更快)。

3. 如果此时table[index]的值为空,那么就直接存储,如果不为空那么就链接到这个数所在的链表的头部。(在JDK1.8中,如果链表长度大于8就转化成红黑树)

get的大致流程

1. 通过通过hashCode方法计算出key的hash值

2. 通过hash%length计算出存储在table中的index(源码中是使用hash&(length-1),这样结果相同,但是更快)。

3. 遍历table[index]所在的链表,只有当key与该节点中的key的值相同时才取出。

ConcurrentHashMap类

是从JDK1.5之后提供的一个HashTable的替代实现,采用分段锁机制,一个map中的元素分成很多的segment,通过lock机制可以对每个segment加读写锁,从而提高map的效率,底层实现采用数组+链表+红黑树的存储结构。

HashTable类

线程安全,低效,不支持null的key和value。

SortedMap类

有一个实现类:TreeMap会存储放入元素的顺序。

Java基础加强之集合的更多相关文章

  1. Java 基础 -- 泛型、集合、IO、反射

    package com.java.map.test; import java.util.ArrayList; import java.util.Collection; import java.util ...

  2. Java基础系列7——集合系列(1)框架概述

    该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 集合框架概述 Jav ...

  3. 【Java基础】谈谈集合.List

    摘自:https://www.cnblogs.com/54chensongxia/p/11722828.html 目录 1. ArrayList 1.1 ArrayList的构造 1.2 add方法 ...

  4. 黑马程序员——JAVA基础之Map集合

    ------- android培训.java培训.期待与您交流! ---------- Map集合: 该集合存储键值对.一对一对往里存.而且要保证键的唯一性. 和Set很像,其实Set底层就是使用了M ...

  5. 黑马程序员——JAVA基础之List集合

    ------- android培训.java培训.期待与您交流! ---------- Collection : |--List:元素是有序的,元素可以重复.因为该集合体系有索引.         | ...

  6. Java基础题:集合、String、性能、线程

    转载自:Java基础题 https://yq.aliyun.com/articles/601786?utm_content=m_1000001149

  7. Java基础系列--ArrayList集合

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8494618.html 一.概述 ArrayList是Java集合体系中最常使用,也是最简单 ...

  8. Java基础教程(24)--集合

    一.Java集合框架   集合,有时也称为容器,是一个用来存储和管理多个元素的对象.Java中的集合框架定义了一套规范,用来表示和操作集合,使具体操作与实现细节解耦.集合框架都包含下列内容: 接口:这 ...

  9. Java基础加强之集合篇(模块记忆、精要分析)

    千里之行,始于足下.把别人的变成自己,再把自己的分享给别人,这也是一次提升的过程.本文的目的是以一篇文章从整体把握集合体系又不失一些细节上的实现,高手路过. 集合的作用与特点 Java是一门面向对象语 ...

  10. Java基础知识之集合(容器)简介

    JAVA的集合体系,主要由Collection接口,Map接口,Iterator接口和操作集合的工具类Collections组成.其中的Iterator只是一个迭代器,真正的容器则派生自Collect ...

随机推荐

  1. (POI)Excel格式转Html格式

    Demo结构和引用的Jar包 源代码(TestDemo.java) POI中将Excel转换为HTML方法仅能转换HSSFWorkBook类型(即03版xls),故可以先将读取的xlsx文件转换成xl ...

  2. Hystrix使用详解

    原文参考:http://hot66hot.iteye.com/blog/2155036 一:为什么需要Hystrix? 在大中型分布式系统中,通常系统很多依赖(HTTP,hession,Netty,D ...

  3. django(六):view和cbv

    FBV即以函数的形式实现视图函数,CBV即以类的形式实现视图函数:相比而言,CBV根据请求方式书写各自的代码逻辑,结构清晰明了,但是由于多了一层反射机制,性能要差一些:FBV执行效率要高一些,但是代码 ...

  4. ajax请求下载Execl表

    Execl表是经常要用到的存放二位数据的表格,Java也可以直接操作Execl表,经常用到的方式就是jxl和poi. 在这次项目中,我用到的poi往Execl中写数据,刚开始设计的是前端发送一个aja ...

  5. Linux : task work 机制

    task work机制可以在内核中向指定的进程添加一些任务函数,这些任务函数会在进程返回用户态时执行,使用的是该进程的上下文.包括下面的这些API: task_work_add task_work_c ...

  6. SpringMVC接受请求参数、

    1. 接收请求参数 1.1. [不推荐]通过HttpServletRequest 在处理请求的方法中,添加HttpServletRequest对象作为参数,在方法体中,直接调用参数对象的getPara ...

  7. CSS字体无法设置成功的问题

    在 CSS 中设置字体名称,直接写中文是可以的.但是在文件编码(GB2312.UTF-8 等)不匹配时会产生乱码的错误.xp 系统不支持 类似微软雅黑的中文. 方案一: 你可以使用英文来替代. 比如 ...

  8. 激活函数(relu,prelu,elu,+BN)对比on cifar10

    激活函数(relu,prelu,elu,+BN)对比on cifar10   可参考上一篇: 激活函数 ReLU.LReLU.PReLU.CReLU.ELU.SELU  的定义和区别   一.理论基础 ...

  9. 2017 先知创新大会:有 ZHI 而来

    先知创新大会( XIANZHI INNOVATION CONFERENCE ) 是聚焦安全行业创新的行业盛事, 旨在推动安全技术的进步和发展. 先知大会的主题是“极致·眼界·创新” 极致:追求技术的极 ...

  10. Vue项目中引用vue-resource步骤

    直接上步骤: 1.通过命令,进入到当前项目所在目录 2.输入以下命令npm install vue-resource --save 3.安装完毕后,在main.js中导入,如下: import Vue ...