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 ...
随机推荐
- Android在代码中使用布局文件中的一个组件
使用前必须要把组件与其父组件的关系断开,比如有一个组件的名称为scrollChildLayout,则可以使用下面的代码进行分离 ((ViewGroup)scrollChildLayout.getPar ...
- C#读取Excel文件
//excel模板的路径 string strSource = Application.StartupPath + "\\" + "ExcelTemplet" ...
- ORACLE 自定义聚合函数
用户可以自定义聚合函数 ODCIAggregate,定义了四个聚集函数:初始化.迭代.合并和终止. Initialization is accomplished by the ODCIAggrega ...
- jquery选择相同ID
jQuery中$("#id")只能选择第一个对象,不能选择所有相同id的元素. 通过 $("input[id='xxxx']"); 可以选择多个相同id的元 ...
- android app 提示信息
Toast.makeText(this,"You cannot have less than 1 coffee",Toast.LENGTH_SHORT).show();TextVi ...
- Coding源码学习第四部分(Masonry介绍与使用(三))
接上篇继续进行Masonry 的学习. (12)tableViewCell 布局 #import "TableViewController.h" #import "Tes ...
- C#中Thread与ThreadPool的比较
最近同事在编写一个基于UPD RTP协议的通信软件,在处理接收Listen时,发现了一个问题到底是用Thread还是ThreadPool呢? 我看同事的问题比较有典型性,还是做以整理培训一下吧 Thr ...
- POJ 1061
题意: 两只青蛙在同一条纬度上,它们各自朝西跳,问它们要跳多少步才能碰面(必须同时到达同一点). 分析: 假设它们跳了t步才相遇,青蛙a初始坐标为x,青蛙b初始坐标为y,则跳了t步相遇后a的坐标为 x ...
- 第一次用golang写个小程序
1.下载go1.6并安装.我是win7系统(会自动添加GOOROOT环境变,自己建一个放go文件的工程目录并添加到环境变量中) 2.下载liteide并解压缩.(liteide查看菜单中也可编辑环境变 ...
- 解决eclipse中自带的maven搜索不到非本地第三方包问题
解决eclipse中自带的maven搜索不到非本地第三方包问题 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近使用eclipse中的maven插件时发现,在pom.xml文件中添加第 ...