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. js颜色调试器

    1 /* ColorTestViewer 颜色调试器 2 3 attribute: 4 onchange: Function; //颜色改变回调; 默认null 5 6 //以下属性不建议直接修改 7 ...

  2. 关于『HTML』:第二弹

    关于『HTML』:第二弹 建议缩放90%食用 第二弹! 它来了! 它来了! 我竟然没有拖更,对了,你们昨天用草稿纸了么 开始正文之前提一个问题:大家知道"%%%"是什么意思吗?就这 ...

  3. c++ 辗转相除(动图)

    #include<iostream> #include<cstdio> #include<iomanip> #include<cstring> usin ...

  4. cut命令、case与select语句

    cut命令 常用参数: -c character 字符 -d delimiter 分隔符 -f field 域(列) --output-delimiter 输出分隔符 例: # echo 12345 ...

  5. RPA应用场景-财务报表统计整合

    场景概述 财务报表统计整合 所涉系统名称 邮储银行系统 人工操作(时间/次) 3小时 所涉人工数量 1 操作频率 每月 场景流程 1.登录各个区支行系统 2.机器人按照要求,自动复选多项业务参数,导出 ...

  6. SpringBoot启动代码和自动装配源码分析

    ​ 随着互联网的快速发展,各种组件层出不穷,需要框架集成的组件越来越多.每一种组件与Spring容器整合需要实现相关代码.SpringMVC框架配置由于太过于繁琐和依赖XML文件:为了方便快速集成第三 ...

  7. P6622 信号传递 做题感想

    题目链接 前言 在这里分享两种的做法. 一种是我第一直觉的 模拟退火.(也就是骗分) 还有一种是看题解才搞懂的神仙折半搜索加上 dp . 模拟退火 众所周知,模拟退火 是我这种没脑子选手用来骗分的好算 ...

  8. 经典的损失函数:交叉熵和MSE

    经典的损失函数: ①交叉熵(分类问题):判断一个输出向量和期望向量有多接近.交叉熵刻画了两个概率分布之间的距离,他是分类问题中使用比较广泛的一种损失函数.概率分布刻画了不同事件发生的概率. 熵的定义: ...

  9. 反向传播神经网络(BP)

    实验部分: ①输入.输出矢量及问题的阐述 由题意输入变量取值范围为e={-2,-1,0,1,2}和ec={-2,-1,0,1,2},则输入矢量有25种情况,分别如下所示: 则由T=int((e+ec) ...

  10. java枚举和注解

    枚举 一.枚举(enumeration) 是一组常量的集合,可以理解为:枚举属于一种特殊的类,里面只包含一组有限的特定的对象,构造方法默认为private. 二.枚举的两种实现方式 1.自定义实现枚举 ...