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日相关推荐

  1. 始于2015年11月23日,终于2018年08月08日

    留念. 2015年11月23日:在一起 2016年01月17日-21日:北京机场,我们❤ 2016年04月16日:去他所在城市--成都 2016年06月04-06日:第一次小旅游--都江堰.青城山 2 ...

  2. 扒一扒HTTPS网站的内幕[2015年09月29日]

    扒一扒HTTPS网站的内幕 野狗 2015年09月28日发布 作者:王继波  野狗科技运维总监,曾在360.TP-Link从事网络运维相关工作,在网站性能优化.网络协议研究上经验丰富. 野狗官博:ht ...

  3. 传智播客 刘意_2015年Java基础视频-深入浅出精华版 笔记(2015年10月25日23:28:50)

    day01 win 7系统打开DOS有趣方法:按住shift+右键,单击"在此处打开命令窗口"(注意:在此处可以是任何的文件夹,不一定是桌面) 用DOS删除的文件不可以在回收站恢复 ...

  4. python编程入门与案例详解-quot;Python小屋”免费资源汇总(截至2018年11月28日)...

    原标题:"Python小屋"免费资源汇总(截至2018年11月28日) 为方便广大Python爱好者查阅和学习,特整理汇总微信公众号"Python小屋"开通29 ...

  5. 【历史上的今天】4 月 28 日:人工智能理论之父出生;大众点评上线;苹果开设 iTunes 音乐商店

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2022 年 4 月 28 日,在 1994 年的今天,美国克林顿政府公布了一项价值数百万美元的计划,以帮助那些制 ...

  6. 【历史上的今天】12 月 28 日:冯·诺伊曼诞生;林纳斯·托瓦兹出生;CSDN 正式上线

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2021 年 12 月 28 日,在 126 年前的今天,法国摄影师路易·卢米埃尔在巴黎卡布辛路的大咖啡馆,用活动 ...

  7. 星系炸弹 在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。 每个炸弹都可以设定多少天之后爆炸。 比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16

    解析:此题手算或者用excel很快,这里我用代码代码量较大但思路简单. 星系炸弹 在X星系的广袤空间中漂浮着许多X星人造"炸弹",用来作为宇宙中的路标. 每个炸弹都可以设定多少天之 ...

  8. 腾讯内部转岗_即将退出历史舞台,腾讯微博将于9月28日停止服务和运营

    一个时代过去了-- 文丨猎云网 ID:ilieyun 作者丨王非.王潇宵 腾讯微博在沉寂了多年之后,终于有了结局.近日,腾讯微博发布公告表示,由于业务调整,将于2020年9月28日晚23时59分停止服 ...

  9. 【2017 数据技术嘉年华】10月28日广州站即将华丽来袭!

    还有 8 天 我们就要 到达广州站 啦 在各位业界同仁的支持下,ACOUG 已经成功举办六届千人规模的 Oracle 技术嘉年华.今年,秉承"云 • 数据 • 智能 - 数聚价值 智胜未来& ...

最新文章

  1. 业务高峰期不小心拔掉了服务器电源!!
  2. ad19 导出step 没有pcb_PCB设计导出Gerber基本操作及注意事项(三)
  3. POJ2356 Find a multiple 鸽巢原理
  4. 反驳生命的起点是rna_科学家提出了生命分子的手性起源新假说,源自宇宙射线...
  5. linux phpredisAdmin安装步骤
  6. jQuery表单验证插件
  7. 教你实战Flutter Deskstop之Tinypng(熊猫图片压缩)GUI工具
  8. sql 树形 子节点获取最顶级的节点
  9. 4.OpenCV视频处理
  10. 怎样使用Maya快速制作角色模型
  11. ArcGIS中拓扑规则英文对照说明
  12. 【SpringCloud】SpringCloud简介
  13. 天池大赛 - 特征提取 总结
  14. 老师讲的真棒!javaisblank函数的使用方法
  15. WMS仓库管理系统---(1)总体设计
  16. java获取n个工作日后的日期, 排除周末和节假日(顺延)
  17. python实现--月报和年报
  18. Jenkins 流水线说明
  19. 51摇摇棒的简介与改字详解
  20. 为什么在SPD(浪涌保护器)的前端要安装后备保护器(SCB)

热门文章

  1. 设计一个低电平VI转换器
  2. uniapp内置组件
  3. Android RxJava操作符的学习---过滤操作符
  4. 收藏几个高清图片和动图搜索制作的网站
  5. (附源码)php在线考试系统 毕业设计 032028
  6. 李彦宏蝉联福布斯内地首富
  7. 逐级模糊度固定方法(CIR)
  8. 2020年熔化焊接与热切割模拟考试题库及熔化焊接与热切割实操考试视频
  9. 计算机拨号测试在哪,电脑拨号设置在哪里设置
  10. 互联网催生的新的商业模式