Java集合容器的深度理解
Java容器里有很多写好的容器API,这使我们很方便的可以存储、操作我们的数据。
下面是我写的容器的特点,一些容器的不同之处,从底层源码解析一下容器实现原理
一、常用的容器目录
上图可以看出,java容器分为两种:Collection和Map
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主要分为ArrayList和LinkedList,前者的底层是使用数组实现的
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集合容器的深度理解的更多相关文章
- 面霸篇:Java 集合容器大满贯(卷二)
面霸篇,从面试角度作为切入点提升大家的 Java 内功,所谓根基不牢,地动山摇. 码哥在 <Redis 系列>的开篇 Redis 为什么这么快中说过:学习一个技术,通常只接触了零散的技术点 ...
- Java集合容器简介
Java集合容器主要有以下几类: 1,内置容器:数组 2,list容器:Vetor,Stack,ArrayList,LinkedList, CopyOnWriteArrayList(1.5),Attr ...
- [转载]Java集合容器简介
Java集合容器主要有以下几类: 1,内置容器:数组 2,list容器:Vetor,Stack,ArrayList,LinkedList, CopyOnWriteArrayList(1.5),Attr ...
- 大数据学习day15----第三阶段----scala03--------1.函数(“_”的使用, 函数和方法的区别)2. 数组和集合常用的方法(迭代器,并行集合) 3. 深度理解函数 4 练习(用java实现类似Scala函数式编程的功能(不能使用Lambda表达式))
1. 函数 函数就是一个非常灵活的运算逻辑,可以灵活的将函数传入方法中,前提是方法中接收的是类型一致的函数类型 函数式编程的好处:想要做什么就调用相应的方法(fliter.map.groupBy.so ...
- 转载---Java集合对象的深度复制与普通复制
原博文:http://blog.csdn.net/qq_29329775/article/details/49516247 最近在做算法作业时出现了错误,原因是没有弄清楚java集合的深度复制和浅度复 ...
- 编程体系结构(03):Java集合容器
本文源码:GitHub·点这里 || GitEE·点这里 一.集合容器简介 集合容器是Java开发中最基础API模块,通常用来存储运行时动态创建的元素,基本特点如下: 泛型特点,存储任意类型对象: 动 ...
- Java——(二)Java集合容器
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.基本概念 1)Collection:一个独立元素的序列,这些元素都服从一条或多条规则.Lis ...
- 【转载】Java集合容器全面分析
转自:http://blog.csdn.net/garfielder007/article/details/52143803 简介: 集合类Collection不是Java的核心类,是Java的扩展类 ...
- java 对 final 关键字 深度理解
基础理解 : 1.修饰类 当用final去修饰一个类的时候,表示这个类不能被继承.处于安全,在JDK中,被设计为final类的有String.System等,这些类不能被继承 .注意:被修饰的类的成员 ...
随机推荐
- 2020级cpp机考模拟题A卷-#题解1
为了各位朋友的身心健康(不是),我们按照题目难度顺序来写题解. 第一次写题解,希望多点包容和鼓励(恬不知耻 1:谁先输出-4 题意: 输入3个整数,按从大到小的顺序输出,每两个数字间加一个空格. 题解 ...
- bind-utils-测试域名解析
bind-utils是一个网络管理类工具集,其集成了我们常用的命令"nslookup",我们可以使用诊断域名解析情况. 1.安装bind-utils [root@localhost ...
- 高危!Fastjson反序列化远程代码执行漏洞风险通告,请尽快升级
据国家网络与信息安全信息通报中心监测发现,开源Java开发组件Fastjson存在反序列化远程代码执行漏洞.攻击者可利用上述漏洞实施任意文件写入.服务端请求伪造等攻击行为,造成服务器权限被窃取.敏感信 ...
- SQL语句中LEFT JOIN ON WHERE和LEFT JOIN ON AND的区别
先上代码: declare @tb table (name varchar(10),sex int) declare @tb2 table (name varchar(10),age int) ins ...
- 构建第一个模型:KNN算法(Iris_dataset)
利用鸢尾花数据集完成一个简单的机器学习应用~万丈高楼平地起,虽然很基础,但是还是跟着书敲了一遍代码. 一.模型构建流程 1.获取数据 本次实验的Iris数据集来自skicit-learn的datase ...
- A* K短路
注:\(A*\) 求解K短路效率极其低下,时间复杂度\(O(nklog\ n)\),空间视题目而定,因为本质是爆搜,可求解数据范围较小的题目. 我们使用\(A*\)求解k短路: 首先需要预处理出估价函 ...
- JAVA - 缓冲和缓存
JAVA - 缓冲和缓存 缓冲 Buffer 功能:协调上下层应用之间的性能差异.通过缓冲区的缓冲,当上层组件性能优于下层组件的时候,缓冲可以有效减少上层组件对下层组件的等待时间. 使用场景:IO流中 ...
- 全新升级的AOP框架Dora.Interception[2]: 基于“约定”的拦截器定义方式
Dora.Interception有别于其他AOP框架的最大的一个特点就是采用针对"约定"的拦截器定义方式.如果我们为拦截器定义了一个接口或者基类,那么拦截方法将失去任意注册依赖服 ...
- RocketMQ消息的顺序与重复
1.如何保证消息的顺序 原因:生产者将消息发给topic,topic分发给不同的队列再给多个消费者并发消费,难以保证顺序. 方案:topic和队列之间加入MessageQueueSelector.将一 ...
- Day02 HTML语法
有两种类型的标签 双标记<标记名>内容</标记名> 单标记<标记名/> 属性: 对标签的描述--属性,由属性名和属性值组成 <标记名 属性名 = " ...