set,list,map分析
想了下集合,列表,映射三者关系
set,list,map
ArrayList采用数组方式存储数据,继承List;
LinkedList采用链表方式存储数据,继承List;
所以数组方式都有下表,以及每个下表都对应value,所以里面的元素可以重复,每次增加删除元素,插入位置后面的元素都要变动(下表id,以及value都要变动),所以增删会很慢, 查询起来会很快,相当于有索引;
链表方式采用指针,除了几个特殊的节点外,几乎每个节点,都有前序节点,后续节点,所以里面元素也是可以重复的, 增加删除会很快,只有移动一两个指针就可以了;
vector,上图掉了这个,采用数组方式存储,也是继承List,和ArrayList的两个不同之处是:1,Vector里的所有方法都是同步的,支持多线程.2,vector每次扩容是数组增加一倍大小,arraylist是增加0.5倍;
(vector开销更大,能用arrayList就不用vector)
list集合中三种实现有利有弊,
数组查询时间复杂度O(1),增删就是O(n);
链表查询时间复杂度O(n),增删就是O(1);
猜想,能否在中间找个平衡点,
于是就有了:二叉搜索树,增删查的时间复杂度都为O(lgn);
下面来看应用...
下面来说Set集合:
可以实例化为HashSet, TreeSet;
set里面存的值不能是重复的 , 所有,首先要明白一点:加入Set里面的元素必须定义equals()方法以确保对象的唯一性。
在往Set中插入新的对象时,首先会用该对象的hashCode()与已经存在对象的hashCode()做比较,如果相等,那就不能插入,如果不等,才会调用equals()方法,如果equals结果为true,说明已经存在,就不能再插入,如果为false,可以插入。
先说下,两者的区别:
1.HashSet是哈希表实现的,数据是无序的,可以存放且只能存放一个null;
有序是因为HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的,而具有相同内容的String对象,hashcode是一样;
2.TreeSet是采用红-黑树结构实现的,元素是自动排序的,不能存放null;
有序是因为元素类型必须实现Comparable接口, 并且覆盖其compareTo方法,TreeSet是SortedSet接口的唯一实现类;
下面再钻一下红-黑树,他其实是二叉搜索树的变形(AVL树其实也是二叉搜索树的变形,avl树必须满足两个条件:1.首先是一个二叉搜索树;2.每个节点的左右子树高度差绝对值<=1);
为什么在有了二叉搜索树的前提下,还要创造出avl以及红黑树呢:因为二叉搜索树在有序(升序,降序)插入的时候,时间复杂度会变成O(n),降到最低;但是红-黑树的自我修复功能保证了即使在最坏的情况下,也能保证时间复杂度在O(logN)的级别上。
其实红-黑树和avl树差不多,那为什么现实中avl很少见,都是用的红-黑树:因为avl的增加-删除节点操作复杂度过高;
AVL树最经典的调节平衡(左旋,右旋)在这里就不做说明了,比较简单,实在不懂,可以看下这个https://my.oschina.net/llmm/blog/158454;
红-黑树的实现以及原理,自己看http://www.cnblogs.com/fanzhidongyzby/p/3187912.html 我就不装逼了.
下面再来说Map集合:(下班了,明天继续)
over...
_ __
(_)/ \
<'_, ____)~~~~~~~
^^ ^^
set,list,map分析的更多相关文章
- 调试技巧 —— 如何利用windbg + dump + map分析程序异常
调试技巧 —— 如何利用windbg + dump + map分析程序异常 逗比汪星人2011-09-04上传 调试技巧 —— 如何利用windbg + dump + map分析程序异常 http ...
- JMP软件中的晶圆图( Wafer Map)分析
关键词:芯片 良率分析 晶圆图 质量管理 JMP Minitab 半导体芯片的生产,简单来讲,是将电路通过各种复杂的物理化学方法制作到晶圆上,在生产的最后阶段会进行不同电性功能的测试以确保产品的功能性 ...
- java map 分析
java 8 对HashMap进行了优化, 当碰撞时使用TreeNode的二分方法查找数据: 但是当数据碰撞厉害的时候, table有很多浪费. table 大小等于size/factor, 当碰撞很 ...
- stm32 map文件的分析
相信有较大项目开发经验的朋友都曾遇到内存溢出的问题,那么大家都是如何分析这类问题的呢?大家遇到HardFault_Handler 有对map分析过吗? 首先讲述一下关于map在MDK-ARM中的配置. ...
- 【Android开源项目分析】android轻量级开源缓存框架——ASimpleCache(ACache)源代码分析
转载请注明出处:http://blog.csdn.net/zhoubin1992/article/details/46379055 ASimpleCache框架源代码链接 https://github ...
- Uboot启动流程分析(二)
1.前言 在前面的文章Uboot启动流程分析(一)中,链接如下: https://www.cnblogs.com/Cqlismy/p/12000889.html 已经简单地分析了low_level_i ...
- ASimpleCache源码分析
ASimpleCache里只有一个JAVA文件——ACache.java,首先我用思维导图制作了ACache类的详细结构图: 通过分析官方给的demo来驱动源码分析吧 以字符串存储为例(官方给的dem ...
- Android--sharepreference总结
SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数. SharedPreferences保存数据,其背后是用xml文件存放数据,文件存放在/data/data/ ...
- 【10-26】java调试技术学习笔记
调试工具 jdk自带的工具 jmap jconsole VisualVM jmap jmap -histo:live pid 列出该进程的所有活动实例统计信息 jmap -dump:live,file ...
随机推荐
- 如何优雅的将DTO转化成BO
用于网络传输的对象,我们都认为他们可以当做是DTO对象,DTO为系统与外界交互的模型对象,那么肯定会有一个步骤是将DTO对象转化为BO对象或者是普通的entity对象,让service层去处理. 网上 ...
- nodejs调用脚本(python/shell)和系统命令
每种语言都有自己的优势,互相结合起来各取所长程序执行起来效率更高或者说哪种实现方式较简单就用哪个,nodejs是利用子进程来调用系统命令或者文件,文档见http://nodejs.org/api/ch ...
- L. Twice Equation ACM Nanning 2017
https://nanti.jisuanke.com/t/19978 acm提交:类 Main 使用java:高精度 BigInteger import java.math.BigInteger; i ...
- P2306 被yyh虐的mzc
P2306 被yyh虐的mzc 容量为 \(V\), 有 \(n\) 件物品, 反正直接背包绝对超时 , 每个有重量和价值 \(a_{i}, b_{i}(a_{i}, b_{i} <= 10)\ ...
- sql server查询数据库的大小和各数据表的大小
查询出来的结果中各字段的详细说明参考MSDN资料:https://msdn.microsoft.com/zh-cn/library/ms188776.aspx 如果只是查询数据库的大小的话,直接使用以 ...
- 四、Kafka 核心源码剖析
一.Kafka消费者源码介绍 1.分区消费模式源码介绍 分区消费模式直接由客户端(任何高级语言编写)使用Kafka提供的协议向服务器发送RPC请求获取数据,服务器接受到客户端的RPC请求后,将数据构造 ...
- CSS3实战之background篇
在CSS3中,background可以添加多个背景图像组,背景图像之间通过逗号进行分隔. 每个背景图像层都可以包含下面的值 background-image 定义背景图像 background-col ...
- centos无法通过ssh连接的解决
系统环境是centos7,虚拟机环境下的.在使用ssh工具连接虚拟机的时候发现连接不上,用的是root 先检查openssh-server是否安装: yum list installed | grep ...
- MFC基于对话框风格按钮控件添加图片的方法(大神止步)
菜鸟还在研究这个东西,大神就不要看了.一直都在觉得用VC或VS建立的对话框总是全灰色感觉太单调了,如果可以在上面添加一些漂亮的图片就好了,今天终于实现了.其实挺简单的,下面就分几个步骤讲一下: 第一步 ...
- 关于Python编码问题小记
Python编码问题小记: 引子: 最近在复习redis,当我在获取redis的key的时候,redis 存储英文和汉字下面这个样子的,我知道汉字是用16进制的UTF-8编码了,然后突然很想搞清楚字符 ...