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 ...
随机推荐
- css 伪元素分享!!!
最近接触到的css 伪元素觉得还算不错 分享下: 1.清楚内盒浮动设置: ;} .back_list ul:after{;visibility: hidden;}/*清楚内盒浮动设置*/ 2.伪元素a ...
- Linux安装脚本需要交互之如何实现自动安装
Linux中shell脚本运行时经常需要进行交互,比如安装软件的过程中对license声明的确认,需要输入yes,回车之类的确认信息.这个在自动化安装的时候就会是个问题. 通常对于这个问题比较灵活的解 ...
- 用HTML做的简单的个人简历
<html> <head> <title>table表格</title> <style type="text/css"> ...
- <java基础学习>JAVA 对象和类
Java is an Object-Oriented Language. As a language that has the Object Oriented feature, Java suppor ...
- Bootstrap学习笔记(一)
一.什么是Bootstrap bootstrap是一款css框架,便于响应式设计. 二.怎样使用bootstarp 最常用的方法,在html结构中引入样式表bootstarp.min.css,以及jq ...
- 《Pro Express.js》学习笔记——Express服务启动常规七步
Express服务启动常规七步 1. 引用模块 var express=require('express'), compression=require('compression'), bo ...
- 用PowerMock mock static方法
在编写代码时,经常需要调用别人已经写好的工具类,而这些工具提供的方法经常是static方法,在这里,直接贴出<PowerMock实战手册>中的例子 待测试方法: public class ...
- liunx 下 部署并运行java项目(非web)
1. 将这三个包上传到liunx上,之后写一个run.sh 的脚本文件,然后在lib包中上传包<sunjce-provider.jar>包. 2.启动run.sh( ./run.sh st ...
- ueditor工具栏更改按钮的默认操作
ueditor 上的 image 按钮,默认有一个图片选择工具. 但是我想把他去掉,用上自己写的图片选择功能. 原来使用cleditor 是可以给按钮自定义一个函数.但是在ueditor就没有找到可以 ...
- 【转】一名大学生的PHP进阶之路
我是一名河南某职业学院的学生,比较喜欢PHP开发 的 工作,自己也曾经自学过php,but如果没有老师教还真是难以坚持啊,在这里给大家说一下寒假在麦子的学习感受,首先说麦子每一堂课程都给了特别详细的 ...