java 集合:实现
集合本来就是为了方便开发的,实现了一些基本数据结构,一般来说数据结构有两种物理的实现:数组和链表。数组是连续的空间,链表是不连续的。基于这两种又扩展了很多的数据结构。队列,栈,hash表,树。
在java中有两种,一种是collection,主要是为了存储对象集合。一种是map,主要存储键值对。要了解各种java集合怎么使用就必须了解底层的数据结构。
collection是一个总的接口,有子接口set和list。然后还有一些抽象类,实际上这些所有的接口和抽象类,只不过定义了一些行为而已,真正的数据结构定义都是在每一个实现类中。
list:主要的实现类有arraylist,正如名字一样底层就是数组。linkedlist,底层是链表。这个两个类的特性也和这两种数据结构是一样的。
set:虽然是在collection中,hashset底层确是hashmap。为什么?首先说一下set是为了存储不一样的数据。hashmap实现了这个存储,hashset只是关注了hashmap中的key,value是一个默认的object对象。
tip:在了解hashset的时候一定要明白什么是hash表以及hash算法。hash其实就是一种映射方式,把很多无关的数据按照一定的函数映射之后,映射在固定的空间之中。为什么是固定空间?因为hash表在容量在不满的时候会有一个性能最佳的时刻,假如hash表很满了,性能就会下降。反而体现不出hash表的性能优越了。所以你要在创建之前最好可以预知空间的大小。这样hash表才会保持一个优良的性能。hash表为什么性能好?由于hash表基于数组,所以会有寻址上的优势,而hash算法是提供hash表一个快速定位的方法。基于这两个特点,hash表可以高效的查找和删除添加操作,但是有一个缺点就是容量,假如容量满了就会导致性能下降,而解决性能问题,只有重新构建hsah表。
hash表性能分析:首先要了解hash表的性能瓶颈是在什么地方,主要就是hash算法可能会出现hash冲突,这个主要就是要映射的集合是很大的,映射到固定的集合中的时候必定会有重复值的情况。解决这个有很多方法,java中采用的是链地址法,就是把一个冲突的值加到数组值的所连接的链表中去。这个方法在特殊情况下(所有值都单一映射)会出现退化,退化为一个链表。这样hash表的特性就体现不出来了,还有就是当hash表很满的时候,所使用的查找和添加元素的时间就会加剧,这样就导致hash表性能下降。这也就是性能瓶颈。即使使用其他的再哈希方法解决冲突,也会导致性能下降。所以一定要防止元素满表,这样就必须在添加元素的时候检查,假如容量超值了就要重新的去构建hash表。
map:了解了hash表之后,也基本上就了解了hashmap的实现,hashmap中有2个指标,一个是容量,一个是加载因子,其实就是hash表的容量比。也就是一个hash表一般都会超出容量。在使用hash表的时候也最好是使用容量的构造。更好的构建你的元素集合。
所以说hashset和hashmap都是同一底层数据结构,其实原理还是一样的。另一个就是treeset和treemap。这个和上一组是一样的原理,就是使用的底层集合是使用的红黑树。红黑树,是一个自平衡的查找二叉树,查找二叉树就是说所有的元素都是有规律的,这就要求你存储的元素要么是继承comparable或者实现compator的比较器。查找二叉树是数结构,树的使用就是为了大量的数据的时候依旧可以保持快速的查找,但是假如你的数据很特殊,树也会退化为一个链表,这样就会导致效率下降。解决的方法就是红黑树,这个是会不断的进行一个平衡,使得树的效率不会下降。这个主要就是针对大量数据的。才会体现出他的性能优越。
java 集合:实现的更多相关文章
- Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结
2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...
- Scala集合和Java集合对应转换关系
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 用Scala编码的时候,经常会遇到scala集合和Java集合互相转换的case,特意mark一 ...
- java集合你了解多少?
用了java集合这么久,还没有系统的研究过java的集合结构,今天亲自画了下类图,总算有所收获. 一.所有集合都实现了Iterable接口. Iterable接口中包含一个抽象方法:Iterator& ...
- 深入java集合学习1-集合框架浅析
前言 集合是一种数据结构,在编程中是非常重要的.好的程序就是好的数据结构+好的算法.java中为我们实现了曾经在大学学过的数据结构与算法中提到的一些数据结构.如顺序表,链表,栈和堆等.Java 集合框 ...
- Java集合框架List,Map,Set等全面介绍
Java集合框架的基本接口/类层次结构: java.util.Collection [I]+--java.util.List [I] +--java.util.ArrayList [C] +- ...
- Java集合框架练习-计算表达式的值
最近在看<算法>这本书,正好看到一个计算表达式的问题,于是就打算写一下,也正好熟悉一下Java集合框架的使用,大致测试了一下,没啥问题. import java.util.*; /* * ...
- 【集合框架】Java集合框架综述
一.前言 现笔者打算做关于Java集合框架的教程,具体是打算分析Java源码,因为平时在写程序的过程中用Java集合特别频繁,但是对于里面一些具体的原理还没有进行很好的梳理,所以拟从源码的角度去熟悉梳 ...
- Java 集合框架
Java集合框架大致可以分为五个部分:List列表,Set集合.Map映射.迭代器.工具类 List 接口通常表示一个列表(数组.队列.链表 栈),其中的元素 可以重复 的是:ArrayList 和L ...
- Java集合概述
容器,是用来装东西的,在Java里,东西就是对象,而装对象并不是把真正的对象放进去,而是指保存对象的引用.要注意对象的引用和对象的关系,下面的例子说明了对象和对象引用的关系. String str = ...
- 深入java集合系列文章
搞懂java的相关集合实现原理,对技术上有很大的提高,网上有一系列文章对java中的集合做了深入的分析, 先转载记录下 深入Java集合学习系列 Java 集合系列目录(Category) HashM ...
随机推荐
- opencv 小任务1 图片的缩放
#include <opencv2/opencv.hpp> using namespace std; int main() { double fScale = 0.2; //缩放倍数 Cv ...
- 论C#未来发展
近日M#的消息令江湖再次起了波澜.大家知道,.NET已经进入了瓶颈期.这个消息又让偶有所期待,趁此机会发表一下个人的展望,对C#或者其继任者,不管是M#还是X#. 一.语法特性 1. using引入类 ...
- lex中yyrestart()的使用
使用lex&yacc时,如果文件有错,parse停止. "每次调用yyparse(),语法分析器会忘记上次分析可能拥有的任何状态而重新开始分析.这不像lex产生的词法分析器的yyle ...
- iOS语音
<span style="white-space:pre"> </span>语音技术近来可是出遍了风头,从iphone4s的siri,到微信的语音聊天 ...
- Python Day04
一.迭代器与生成器: 迭代器(iterator): 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,迭代器的一大优点是不要求事 ...
- MySQL主从同步报错排错结果及修复过程之:Slave_SQL_Running: No
起因调查: 收到大量邮件报警想必事出有因,就问同事到底发生了什么?同事登录从库查看,发现出现如下报错提示,表示与主库同步失败,一直卡在哪里,看他弄了两个多小时,问题越来越多,解决一个恢复平静了一两分钟 ...
- json处理总结(前端js和后端java)
前端(js): json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键,下面将介绍两者之间的相互转换. json字符串:var st ...
- vs13的内存占用 关闭之
.如何关闭CodeLens呢? 在VS菜单栏 >> 工具 >> 选项 >> 文本编辑器 >> 所有语言 >> CodeLens In VS ...
- c# unity PlayerPrefs 游戏存档,直白点就是讲游戏数据本地保存下来
在游戏会话中储存和访问游戏存档.这个是持久化数据储存,比如保存游戏记录. 我的理解是通过某个特殊的标签来保存在本地,而且该标签为key的意思,初始值不用赋值. 在游戏开发中较为实用. 暂时用到了 Se ...
- spring boot 跨域访问处理
问题场景:由于项目中使用到跨域访问,今天也得到高人指点,所以写出来分享给大家.可能是考虑到前后端分离,前端后端服务器不在一台机器上,出现这种跨域访问的情况.正常情况下本地访问是没有问题,但是遇到这种非 ...