集合类结构

  • 集合类的基本接口是 CollectionMap

    • Collection 向下派生出 Set List Queue 等接口
    • Map 向下派生出 HashMap LinkedHashMap TreeMap 等实现类

Collection

  • Set代表无序的,元素不可重复的集合;
  • List代表有序的,元素可以重复的集合;
  • Queue代表先进先出(FIFO)的队列。

List 和 Set 的区别

  • 有序性

    • List 集合中存储的元素是有序的。集合中的元素按照存储的先后顺序排序。
    • Set 集合中存储的元素是无序的。
  • 可重复性
    • List 集合中可以存储重复元素,同样允许多个NULL值的存在。
    • Set 集合不能存储重复元素,只能存在一个NULL值。
  • 迭代方式
    • List 集合可以使用迭代器遍历,也可以通过索引进行查询和遍历
    • Set 集合只能使用迭代器获取和遍历集合中的元素

ArrayList 和 LinkedList 的区别

  • 实现结构

    • ArrayList 是基于数组结构实现的,因此是使用连续的存储空间进行数据存储。
    • LinkedList 是基于链表结构实现的,因此存储数据可以分散在内存空间中。
  • 查询效率
    • ArrayList 是数组实现,可以直接通过下标查询到目标数据,因此时间复杂度为O(1)
    • LinkedList 是链表实现,需要通过遍历链表中的节点查找目标数据,因此时间复杂度为O(n)

Map

HashMap 源码分析

存储结构

  • JDK1.7 中的 HashMap,是基于数组+链表来实现的,它的底层维护一个Entry数组,数组中的每个元素都是一个链表头节点。

    • 当出现哈希冲突时,新插入的元素会被添加到数组索引所在链表上(插入头部)。
    • 存在的问题是,当哈希冲突严重时,链表的长度过长,导致查询的效率下降。
    • 注意,JDK1.7 在多线程环境下可能出现链表成环的问题
  • JDK1.8 中的 HashMap,是基于数组+链表+红黑树来实现的,它的底层维护一个Node数组。
    • 在1.8中引入红黑树结构,目的是解决哈希冲突严重时查询效率低的问题,链表为O(N),而红黑树一直是O(logN)。
    • 当数组的长度大于64,同时链表的节点个数大于等于8的时候,链表会转为红黑树
    • 当链表的节点数低于6时会将红黑树转回链表
    • 注意在 JDK1.8 中插入数据是尾插法

添加元素流程

  • 计算索引

    • 计算对象(key)的哈希值,根据哈希值计算索引位置,计算方法为取余 hash % n = (n-1) & h
  • 插入数据
    • 若数组在该索引位置为空,则创建一个节点将该数据存入索引位置;
    • 若数组在该索引位置不为空,则遍历该索引位置对应的链表,调用 equals() 方法判断是否存在;
      • 若发现重复元素,则覆盖重复数据;
      • 若没有重复元素,则在链表尾部插入数据;
      • 注意,当链表长度达到8时,若数组长度不足64,则会先触发扩容机制,否则会将链表转化为红黑树

扩容机制

  • 扩容触发条件

    • 数组是否需要扩充是通过负载因子判断的,负载因子默认值为0.75,如果数组已用空间达到0.75时会触发自动扩容。
    • JDK1.8 当链表长度达到8时,也会先触发扩容机制。
  • 扩容方式
    • 默认情况下,初始化的数组长度为16,每次以2的整数次扩容。
    • 使用2的整数次扩容的目的是使用位运算代理与运算,提高哈希计算索引的效率,当n是2的整数次方时, hash % n = (n-1) & h

HashMap 和 HashTable 区别

  • 线程安全性

    • HashMap 是线程不安全的。
    • HashTable 是线程安全的,通过在 HashMap 方法的基础上添加 synchronized 关键字来保证线程安全。
  • 空值问题
    • HashMap 的 key 可以是 null,而 HashTable 的 key 不允许是 null。
  • 扩容算法不同
    • HashMap 的初始容量为16,扩容时 *2
    • HashTable 的初始容量是11,扩容时 *2 + 1

java-javaSE-集合类的更多相关文章

  1. java基础 集合类

    java集合类主要有以下集中: List结构的集合类: ArrayList类, LinkedList类, Vector类, Stack类 Map结构的集合类: HashMap类,Hashtable类 ...

  2. Java的集合类

    转自:Q.Mr的博客 http://www.cnblogs.com/zrtqsk/p/3472258.html (本人第一次写博客,部分内容有参照李刚老师的疯狂java系列图书,如有遗漏错误,请多指教 ...

  3. 首先java中集合类主要有两大分支

    本文仅分析部分原理和集合类的特点,不分析源码,旨在对java的集合类有一个整体的认识,理解各个不同类的关联和区别,让大家在不同的环境下学会选择不同的类来处理. Java中的集合类包含的内容很多而且很重 ...

  4. Java:集合类的区别详解

    Java中集合类的区别 Array是数组,不在集合框架范畴之内,一旦选定了,它的容量大小就不能改变了,所以通常在编程中不选用数组来存放. 集合 : 集合对象:用于管理其他若干对象的对象 数组:长度不可 ...

  5. JDK8 下载地址 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

    JDK8 下载地址 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 安装时最好在 ...

  6. java中集合类中Collection接口中的List接口的常用方法熟悉

    1:集合类,在java语言中的java.util包提供了一些集合类,这些集合类又被称作容器. 2:区别集合类和数组.(1)数组的长度是固定的,集合的长度是可变的.(2)数组是用来存放基本数据类型的,集 ...

  7. Java Map 集合类简介

      作者:Jack Shirazi 了解最常用的集合类型之一 Map 的基础知识以及如何针对您应用程序特有的数据优化 Map. 本文相关下载: · Jack 的 HashMap 测试 · Oracle ...

  8. Java常用集合类详解

    在Java中有一套设计优良的接口和类组成了Java集合框架,使程序员操作成批的数据或对象元素极为方便.所有的Java集合都在java.util包中. 在编写程序的过程中,使用到集合类,要根据不同的需求 ...

  9. JAVA Map集合类简介

    了解最常用的集合类型之一 Map 的基础知识以及如何针对您应用程序特有的数据优化 Map. 本文相关下载: · Jack 的 HashMap 测试· Oracle JDeveloper 10g jav ...

  10. java的集合类【转】

    在JDK API中专门设计了一组类,这组类的功能就是实现各种各样方式的数据存储,这样一组专门用来存储其它对象的类,一般被称为对象容器类,简称容器类,这组类和接口的设计结构也被统称为集合框架(Colle ...

随机推荐

  1. Linux几种网络模式介绍

    简单介绍Linux几种网络模式 ​ 虚拟化层次: ​ 打开vmware虚拟机,我们可以在选项栏的"编辑"下的"虚拟网络编辑器"中看到VMnet0(桥接模式).V ...

  2. Django框架之drf:9、接口文档,coreapi的使用,JWT原理、介绍、快速使用、定制、认证

    目录 Django框架之drf 一.接口文档 二.CoreAPI文档生成器 1.使用方法 三.JWT 1.JWT原理及介绍 2.JWP快速使用 3.定制返回格式 4.JTW的认证类 Django框架之 ...

  3. Jetpack Compose学习(10)——使用Compose物料清单BOM,更好管理依赖版本

    原文地址:Jetpack Compose学习(10)--使用Compose物料清单BOM,更好管理依赖版本 - Stars-One的杂货小窝 本期讲解下关于Android推出的BOM来简化我们添加co ...

  4. k8s中使用prometheus operator监控外部服务器部署的windows exporter

    k8s中使用prometheus operator监控外部服务器部署的windows exporter 0.文档说明 (1)Prometheus Operator是一个流行的k8s集群监控套件,项目地 ...

  5. 题解 P4317 花神的数论题

    并不难,但是因为各种 SB 原因调了 1145141919810min(悲 我们会发现 \(\operatorname{sum}\) 其实很小,顶多就 \(50\),这启发我们统计每个 \(\oper ...

  6. VSCode 国内镜像下载地址

    https://vscode.cdn.azure.cn/stable/,比如: https://vscode.cdn.azure.cn/stable/e4503b30fc78200f846c62cf8 ...

  7. 基于OpenLayers使用WFS实现GeoServer地图要素的增删改查

    1. 概述 Web Feature Service(WFS)接口标准定义了一组接口,用于在Internet上访问要素和要素属性级别的地理信息.WFS提供了检索或查询矢量要素的方法,这种方法独立于它们发 ...

  8. LVS的NAT,TUN,DR原理及区别

    原理及其区别 Linux Virtual Server是通过ipvs内核模块和ipvsadm用户空间命令行工具来实现负载均衡的它支持三种工作模式: NAT模式:LVS调度器将请求转发给后端服务器,同时 ...

  9. 制造业常用KPI

    1.  质量KPI CA (Capability of Accuracy): 平均值距离期望中心值的距离,值越大,说明平均值越接近期望中心值. Ca=(X-U)/(T/2) CP (Capabilit ...

  10. java学习日记20230227-java学习方法/转义字符/注释

    Java学习方法 学习java基本原理和基本语法 快速入门(基本程序 CRUD) 研究技术的注意事项,使用细节,使用规范,如何优化 JAVA转义字符 \t : 一个制表位,实现对齐的功能 \n:换行符 ...