Java容器里有很多写好的容器API,这使我们很方便的可以存储、操作我们的数据。

下面是我写的容器的特点,一些容器的不同之处,从底层源码解析一下容器实现原理

一、常用的容器目录

  

上图可以看出,java容器分为两种:CollectionMap

 Collection:主要是单个元素的集合,由List、Queue、Set三个接口区分不同的集合特征,然后由下面的具体的类来实现对应功能,然后Collection还继承了Iterable(为集合提供了for-each循环的支持,是一个可以为不同的集合类提供遍历的最佳方式)迭代器

 Map:有一组键值对的存储形式来保存,可以用键对象来查找值.

Map里的K-key(密钥类型),v-value(映射值的类型)

  简介:

    1.Map是java集合框架的根接口,另一个是Collection的接口

    2.一个Map中,不能包含重复的Key,一个Key只能映射到一个value

Map本身并不是一种集合,但是Map可以提供三种集合视图:

    1.Key——value映射Set视图

    2.Key的Set视图

    3.value的Collection视图

注意!!: 如果一个可变(Mutable)对象作为Map的key,需要特别注意,如果这个对象的修改影响到了equals比较,那Map的行为是不明确的。针对此种情况有一个很好的示例,Map不允许将自身作为key,因                           为这种情况下,equals()和hashcode()不能被很好地定义。

一般用于的Map应该提供两个构造函数:

    1.无参构造函数,创建一个空的Map

    2.有一个形参为Map的构造函数,既复制一个Map

    Map的实现类对所包含的元素会有不同的限制,HashTable的键和值都不允许为null,HashMap的键和值都允许为null

 二、List

 从此图看出List继承的是Collection集合接口,List最大特点就是所有的元素是可重复的,List接口在Collection的基础上增加了很多的方法.List主要分为ArrayListLinkedList,前者的底层是使用数组实现的

List,后者是使用链表实现的List,还有一个Vector,它是一个被弃用的类,因为它是线程同步的,而我们平常使用的时候都是非同步的,使用同步的坏处就是会在一个记录上加锁,防止多个程序访问同一条数

据导致数据不同步.这样会导致访问速度变慢

 Stack是满足"后进先出"规则的容器,注意LinkedList可以实现所有栈的功能

1).ArrayList

   1.ArrayList是一个可以动态增长的数组

   2.我们都知道Java中的数组一旦指定了长度就不可变了,如果我们在业务中需要使用动态的数组,就可以使用ArrayList(默认长度是10,如果插入的数据超过了10,ArrayList会不断的自我增长)

   3.ArrayList由于底层是使用数组实现的,所以随机访问速度快,插入删除慢

   

  我们可以看到在ArrayList里的底层有EMPTY_ELEMENTDATA 这一段源码,它的作用是为了优化创建ArrayList空实例时产生不必要的空数组,使得所有ArrayList空实例都指向同一个空数组。                DEFAULTCAPACITY_EMPTY_ELEMENTDATA是为了确保无参构成函数创建的实例在添加第一个元素时,最小的容量是默认大小10。

  2.)LinkedList

  LinkedList是使用链表实现的容器。

  在列表中插入和删除速度快,但是查找需要遍历整个链表,速度较慢

  使用LinkedList可以实现很多队列、栈的数据结构,并且有很多方法很类似,但是有细小的差别

  • getFirst和element都返回列表的头,但是不删除它,如果列表为空,抛出异常
  • peek实现的功能一样,但是列表为空时返回null
  • removeFirst和remove都是删除并返回列表的头,如果列表为空抛出异常
  • pool实现的功能一样,但是列表为空时返回null

3.)Queue

  队列是一个满足“先进先出”的数据结构。
  LinkedList提供了方法支持队列操作,并且实现了Queue接口,所以LinkedList是队列的一种实现,可以通过LinkedList向上转型为Queue

  • offer:讲一个元素插入对尾
  • peek:不移除的情况下将元素插入队尾,队列为空返回null
  • element:不移除的情况下将元素插入队尾,队列为空报错
  • poll:移除并返回队头,队列为空返回null
  • remove:不移除的情况下将元素插入队尾,队列为空报错

  4.)Set

  • Set不允许出现重复元素-----------无重复
  • Set不保证集合中元素的顺序---------无序
  • Set允许包含值为null的元素,但最多只能有一个null元素。
  • Set支持泛型(类型的参数化),我们应尽可能使用它。将Generics与List一起使用将在运行时避免ClassCastException。
  • 先去看Map,Set的实现类都是基于Map来实现的(如,HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,LinkedHashSet是通过LinkedHashMap来实现的)。

   (LinkedHashSet

  集合框架提供LinkedHashSet类作为Set接口的另一个实现类

  HashSet不保证顺序元素.LinkedHashSet在插入元素时保持元素顺序

                                                                       (文章有待补充,哪里没有解释到位,请指出)

Java集合容器的深度理解的更多相关文章

  1. 面霸篇:Java 集合容器大满贯(卷二)

    面霸篇,从面试角度作为切入点提升大家的 Java 内功,所谓根基不牢,地动山摇. 码哥在 <Redis 系列>的开篇 Redis 为什么这么快中说过:学习一个技术,通常只接触了零散的技术点 ...

  2. Java集合容器简介

    Java集合容器主要有以下几类: 1,内置容器:数组 2,list容器:Vetor,Stack,ArrayList,LinkedList, CopyOnWriteArrayList(1.5),Attr ...

  3. [转载]Java集合容器简介

    Java集合容器主要有以下几类: 1,内置容器:数组 2,list容器:Vetor,Stack,ArrayList,LinkedList, CopyOnWriteArrayList(1.5),Attr ...

  4. 大数据学习day15----第三阶段----scala03--------1.函数(“_”的使用, 函数和方法的区别)2. 数组和集合常用的方法(迭代器,并行集合) 3. 深度理解函数 4 练习(用java实现类似Scala函数式编程的功能(不能使用Lambda表达式))

    1. 函数 函数就是一个非常灵活的运算逻辑,可以灵活的将函数传入方法中,前提是方法中接收的是类型一致的函数类型 函数式编程的好处:想要做什么就调用相应的方法(fliter.map.groupBy.so ...

  5. 转载---Java集合对象的深度复制与普通复制

    原博文:http://blog.csdn.net/qq_29329775/article/details/49516247 最近在做算法作业时出现了错误,原因是没有弄清楚java集合的深度复制和浅度复 ...

  6. 编程体系结构(03):Java集合容器

    本文源码:GitHub·点这里 || GitEE·点这里 一.集合容器简介 集合容器是Java开发中最基础API模块,通常用来存储运行时动态创建的元素,基本特点如下: 泛型特点,存储任意类型对象: 动 ...

  7. Java——(二)Java集合容器

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.基本概念 1)Collection:一个独立元素的序列,这些元素都服从一条或多条规则.Lis ...

  8. 【转载】Java集合容器全面分析

    转自:http://blog.csdn.net/garfielder007/article/details/52143803 简介: 集合类Collection不是Java的核心类,是Java的扩展类 ...

  9. java 对 final 关键字 深度理解

    基础理解 : 1.修饰类 当用final去修饰一个类的时候,表示这个类不能被继承.处于安全,在JDK中,被设计为final类的有String.System等,这些类不能被继承 .注意:被修饰的类的成员 ...

随机推荐

  1. [2021-TKK 暑期训练第一场] 1585:下馆子-3

    题目做了超链接 参考官方题解,作部分优化 下馆子 -3 题意: 给定n组数据,由name,time构成 当只有一个最大值时,输出该同学 当不止有一个最大值时,输出最先大于等于max次的同学 题解: 考 ...

  2. 低代码前景可期,JNPF灵活易用,用智能定义新型办公模式

    JNPF是引迈信息从事多年软件研发和产品服务的一次时代性的技术革新产物,是集SaaS服务.工作流引擎.一站式低代码开发.支持多端使用于一体的快速开发平台. 强大易用 JNPF将 Excel. Acce ...

  3. vscode的一些优化设置

    @ 目录 编辑代码区的字体设置 控制台字体设置 设置文件自动保存 自动猜测文件编码,防止乱码 关闭vscode的受限模式 取消每一次打开vscode都默认打开上次编辑的文件 编辑代码区的字体设置 控制 ...

  4. Kubernetes client-go Informer 源码分析

    概述ControllerController 的初始化Controller 的启动processLoopHandleDeltas()SharedIndexInformersharedIndexerIn ...

  5. C语言:如何给全局变量起一个别名?

    作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). ...

  6. Spire.Office激活

    更新记录: 2022年5月28日 初始代码便于复用 注意:最多支持到:E-ICEBLUE Spire.Office Platinum v6.10.3 引入命名空间: using Spire.Licen ...

  7. 关于个人全栈项目【臻美IT】博客类出现的问题以及解决方法

    每做一个项目,要记得写下心得哦,别偷懒啊!先上网址:https://www.maomin.club/ 这个项目属于博客类的,因为百度审核的问题就大体做了下,就当来练练手,里面文章链接的是CSDN的博客 ...

  8. 实战回忆录:从Webshell开始突破边界

    正文 某授权单位的一次渗透,由于使用的php框架,某cms的上传,从实现webshell开始. 详情 添加监听,生成木马文件更改应用程序名称隐藏上线. 修改休眠时间为10秒 查看主机名whoami 抓 ...

  9. Linux基础命令、引号和括号的作用

    查看硬件信息 查看 cpu lscpu命令可以查看cpu信息 cat /proc/cpuinfo也可看查看到 查看内存大小 free命令 cat /proc/meminfo 查看硬盘和分区 lsblk ...

  10. CF1042E Vasya and Magic Matrix 题解

    题目链接 思路分析 看到题目中 \(n,m \leq 1000\) ,故直接考虑 \(O(n^2)\) 级别做法. 我们先把所有的点按照 \(val\) 值从小到大排序,这样的话二维问题变成序列问题. ...