2015年2月28日
map的子接口。和实现类
java 中的map是用来存储键值对象的,以key-value的方式来存储,使用者通过key来获取value的值。由于map并不继承自接口collection。所以map并不提供自身的迭代器来遍历元素。
map 常用的实现类有hashmap,treemap.hashtable,linkedhashmap等等,其中如果我们构造一个需要排序的map,就使用treemap。
map与set的关系。提到map就不得不提set,map中提供的一些方法都是以set作为返回值的,比如说entryset和keyset.为什么要用set呢?因为set是不允许有重复值的集合,这恰好与map的key的唯一性相一致,而set的底层也是由map来实现的。所以二者有这密不可分的联系,
常用的map.
hashmap,hashmap是采用hash表来存储的map。具体怎么实现的呢?在hashMap里面有个Entry<K,V>[] 的变量table。就是一个数组,数组里面的元素Entry对象,可以看见里面除了key和value外,还有一个next变量和hash的变量,hash这个变量比较容易理解,就是这个Entry的hash值,那么next的这个变量是起什么作用的呢?因为有些时候,有些对象的hash值相同,那么就会采用链表的方式将hash值相同的对象连起来。next起的就是这个作用。
正是由于hashmap按照hash的规律存放了元素,所以,当查找时,直接由hash值算出该元素在数组中的位置,返回数组中相应的值,所以查找速度比较快。
transient Entry<K,V>[] table;
static class Entry<K,V> implements Map.Entry<K,V> {final K key;V value;Entry<K,V> next;int hash;
public V put(K key, V value) {if (key == null)return putForNullKey(value);int hash = hash(key);int i = indexFor(hash, table.length);for (Entry<K,V> e = table[i]; e != null; e = e.next) {Object k;if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {V oldValue = e.value;e.value = value;e.recordAccess(this);return oldValue;}}modCount++;addEntry(hash, key, value, i);return null;}
final Entry<K,V> getEntry(Object key) {int hash = (key == null) ? 0 : hash(key);for (Entry<K,V> e = table[indexFor(hash, table.length)];e != null;e = e.next) {Object k;if (e.hash == hash &&((k = e.key) == key || (key != null && key.equals(k))))return e;}return null;}
hashtable. hashtable与hashmap比较类似,但是主要有3点不一样
1.hashtable是继承自传统的Dictionary类。
public class Hashtable<K,V>extends Dictionary<K,V>implements Map<K,V>, Cloneable, java.io.Serializable {
2. hashtable中所有的方法都是同步的,二hashMap不是,不过可以hasMap可以通过collections.synchronizedMap方法来实现同步。
3. hashmap中允许使用null作为key或者value.hashtable 中不允许使用null做为key或者value。
treemap,继承了sortedmap接口。里面的对象是按照key的大小来排序的,由于key有可能是一个对象,所以说要实现排序得需要一个比较器。treemap的底层是使用红黑二叉树来实现的,接近平衡。查找的效率比较高。
private transient Entry<K,V> root = null;
static final class Entry<K,V> implements Map.Entry<K,V> {K key;V value;Entry<K,V> left = null;Entry<K,V> right = null;Entry<K,V> parent;boolean color = BLACK;
public V put(K key, V value) {Entry<K,V> t = root;if (t == null) {compare(key, key); // type (and possibly null) checkroot = new Entry<>(key, value, null);size = 1;modCount++;return null;}int cmp;Entry<K,V> parent;// split comparator and comparable pathsComparator<? super K> cpr = comparator;if (cpr != null) {do {parent = t;cmp = cpr.compare(key, t.key);if (cmp < 0)t = t.left;else if (cmp > 0)t = t.right;elsereturn t.setValue(value);} while (t != null);}else {if (key == null)throw new NullPointerException();Comparable<? super K> k = (Comparable<? super K>) key;do {parent = t;cmp = k.compareTo(t.key);if (cmp < 0)t = t.left;else if (cmp > 0)t = t.right;elsereturn t.setValue(value);} while (t != null);}Entry<K,V> e = new Entry<>(key, value, parent);if (cmp < 0)parent.left = e;elseparent.right = e;fixAfterInsertion(e);size++;modCount++;return null;}
Set 的主要实现类有hashSet和TreeSet,
HashSet的底层是有hashMap来实现的,Hashset的元素充当了HashMap中的key,而实现Set的HashMap中,value的值是一个常量。
private transient HashMap<E,Object> map;// Dummy value to associate with an Object in the backing Mapprivate static final Object PRESENT = new Object();
public boolean add(E e) {return map.put(e, PRESENT)==null;}
TreeSet的底层是由NavigableMap<E,Object> 来实现的,默认是有TreeMap来实现的。如果想要构造一个按照指定顺序排序的set需要传入一个比较器。
private transient NavigableMap<E,Object> m;// Dummy value to associate with an Object in the backing Mapprivate static final Object PRESENT = new Object();
/*** Constructs a set backed by the specified navigable map.*/TreeSet(NavigableMap<E,Object> m) {this.m = m;}
public TreeSet() {this(new TreeMap<E,Object>());}
public TreeSet(Comparator<? super E> comparator) {this(new TreeMap<>(comparator));}
关于map的遍历,由于map并没有继承iteratble接口,所以不能像collection一样使用迭代器。
那么遍历map有这么几个途径,map里面有keySet,返回key的集合,然后通过key的集合的迭代器来访问所有的value。 map还提供entrySet方法,返回所有对象的set,
也可以到达遍历map的目的
2015年2月28日相关推荐
- 始于2015年11月23日,终于2018年08月08日
留念. 2015年11月23日:在一起 2016年01月17日-21日:北京机场,我们❤ 2016年04月16日:去他所在城市--成都 2016年06月04-06日:第一次小旅游--都江堰.青城山 2 ...
- 扒一扒HTTPS网站的内幕[2015年09月29日]
扒一扒HTTPS网站的内幕 野狗 2015年09月28日发布 作者:王继波 野狗科技运维总监,曾在360.TP-Link从事网络运维相关工作,在网站性能优化.网络协议研究上经验丰富. 野狗官博:ht ...
- 传智播客 刘意_2015年Java基础视频-深入浅出精华版 笔记(2015年10月25日23:28:50)
day01 win 7系统打开DOS有趣方法:按住shift+右键,单击"在此处打开命令窗口"(注意:在此处可以是任何的文件夹,不一定是桌面) 用DOS删除的文件不可以在回收站恢复 ...
- python编程入门与案例详解-quot;Python小屋”免费资源汇总(截至2018年11月28日)...
原标题:"Python小屋"免费资源汇总(截至2018年11月28日) 为方便广大Python爱好者查阅和学习,特整理汇总微信公众号"Python小屋"开通29 ...
- 【历史上的今天】4 月 28 日:人工智能理论之父出生;大众点评上线;苹果开设 iTunes 音乐商店
整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2022 年 4 月 28 日,在 1994 年的今天,美国克林顿政府公布了一项价值数百万美元的计划,以帮助那些制 ...
- 【历史上的今天】12 月 28 日:冯·诺伊曼诞生;林纳斯·托瓦兹出生;CSDN 正式上线
整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2021 年 12 月 28 日,在 126 年前的今天,法国摄影师路易·卢米埃尔在巴黎卡布辛路的大咖啡馆,用活动 ...
- 星系炸弹 在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。 每个炸弹都可以设定多少天之后爆炸。 比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16
解析:此题手算或者用excel很快,这里我用代码代码量较大但思路简单. 星系炸弹 在X星系的广袤空间中漂浮着许多X星人造"炸弹",用来作为宇宙中的路标. 每个炸弹都可以设定多少天之 ...
- 腾讯内部转岗_即将退出历史舞台,腾讯微博将于9月28日停止服务和运营
一个时代过去了-- 文丨猎云网 ID:ilieyun 作者丨王非.王潇宵 腾讯微博在沉寂了多年之后,终于有了结局.近日,腾讯微博发布公告表示,由于业务调整,将于2020年9月28日晚23时59分停止服 ...
- 【2017 数据技术嘉年华】10月28日广州站即将华丽来袭!
还有 8 天 我们就要 到达广州站 啦 在各位业界同仁的支持下,ACOUG 已经成功举办六届千人规模的 Oracle 技术嘉年华.今年,秉承"云 • 数据 • 智能 - 数聚价值 智胜未来& ...
最新文章
- 业务高峰期不小心拔掉了服务器电源!!
- ad19 导出step 没有pcb_PCB设计导出Gerber基本操作及注意事项(三)
- POJ2356 Find a multiple 鸽巢原理
- 反驳生命的起点是rna_科学家提出了生命分子的手性起源新假说,源自宇宙射线...
- linux phpredisAdmin安装步骤
- jQuery表单验证插件
- 教你实战Flutter Deskstop之Tinypng(熊猫图片压缩)GUI工具
- sql 树形 子节点获取最顶级的节点
- 4.OpenCV视频处理
- 怎样使用Maya快速制作角色模型
- ArcGIS中拓扑规则英文对照说明
- 【SpringCloud】SpringCloud简介
- 天池大赛 - 特征提取 总结
- 老师讲的真棒!javaisblank函数的使用方法
- WMS仓库管理系统---(1)总体设计
- java获取n个工作日后的日期, 排除周末和节假日(顺延)
- python实现--月报和年报
- Jenkins 流水线说明
- 51摇摇棒的简介与改字详解
- 为什么在SPD(浪涌保护器)的前端要安装后备保护器(SCB)