初学者第51节之HashMap

Posted Java研发军团

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初学者第51节之HashMap相关的知识,希望对你有一定的参考价值。

Java 猿程之家 程序员的家
500G java web Linux  nginx   ssm 大型互联网项目视频免费分享
初学者第51节之HashMap
公告通知

本公众专注于为广大Java初学者和爱好者提供一个好的学习交流平台,不管你是编程大佬也好,还是编程小白也好,有问题都随时欢迎加小编微信咨询,小编都会在闲暇时候帮助大家解答工作和学习上遇到的问题,最重要也希望借助平台,多交一些朋友



HashMap

HashMap

HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。

该类实现了Map接口,根据键的HashCode值存储数据,具有很快的访问速度,最多允许一条记录的键为null,不支持线程同步。

散列表(Hash table,也叫哈希表)

是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

HashMap实现原理

初学者第51节之HashMap


HashMap主要是以数组和链表实现的。每个列表被称为桶要想査找表中对象的位置, 就要先计算它的散列码, 然后与桶的总数取余, 所得到的结果就是保存这个元素的桶的索引。

解释:hashmap是以一个数组和链表储存的。那么现在加入数组有10个长度,比方说现在需要add的一个key=1,vallue=“张三”的元素

 1. 散列表数组的下标=1.hashcode()%散列表数组.length,这个就是数组的下标

 2. 将key,value存进索引下的链表中,当然,有时候会遇到桶被占满的情况, 这也是不可避免的。这种现象被称为散列冲突( hashcollision) o 这时, 需要用新对象与桶中的所有对象进行比较,査看这个对象是否已经存在。如果散列码是合理且随机分布的, 桶的数目也足够大, 需要比较的次数就会很少。

构造方法

HashMap() 

          构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap。

HashMap(int initialCapacity) 

          构造一个带指定初始容量和默认加载因子 (0.75) 的空 HashMap。

HashMap(int initialCapacity) 

          构造一个带指定初始容量和默认加载因子 (0.75) 的空 HashMap。

HashMap(Map<? extends K,? extends V> m) 

          构造一个映射关系与指定 Map 相同的新 HashMap。

HashMap常用方法

size()

            返回此映射中的键-值映射关系数。


put(K key, V value)

          在此映射中关联指定值与指定键。


putAll(Map<? extends K,? extends V> m)

          将指定映射的所有映射关系复制到此映射中,这些映射关系将替换此映射目前针对指定映射中所有键的所有映射关系


get(Object key)

          返回指定键所映射的值;如果对于该键来说,此映射不包含任何映射关系,则返回 null。


remove(Object key)

          从此映射中移除指定键的映射关系(如果存在)。


isEmpty()

          如果此映射不包含键-值映射关系,则返回 true。


keySet()

          返回此映射中所包含的键的 Set 视图。


containsKey(Object key)

          如果此映射包含对于指定键的映射关系,则返回 true。


containsValue(Object value)

          如果此映射将一个或多个键映射到指定值,则返回 true。


values()

          返回此映射所包含的值的 Collection 视图。


entrySet()

          返回此映射所包含的映射关系的 Set 视图。


clear()

          从此映射中移除所有映射关系。

size()

          返回此映射中的键-值映射关系数。

HashMap<String,String> map = new HashMap<>();
System.out.println(map.size());

结果:0
put(K key, V value)

          在此映射中关联指定值与指定键。就是一个添加元素的方法。

HashMap<String,String> map = new HashMap<>();
map.put("1","zhangsan1");
map.put("2","zhangsan2");
map.put("3","zhangsan3");
map.put("4","zhangsan4");
System.out.println(map.size());

结果:4
putAll(Map<? extends K,? extends V> m)

          将指定映射的所有映射关系复制到此映射中,这些映射关系将替换此映射目前针对指定映射中所有键的所有映射关系

HashMap<String,String> map1 = new HashMap<>();
map1.put("1","zhangsan1");
map1.put("2","zhangsan2");
map1.put("3","zhangsan3");
map1.put("4","zhangsan4");

HashMap<String,String> map2 = new HashMap<>();
map2.put("5","zhangsan5");
map2.put("6","zhangsan6");
map2.put("7","zhangsan7");
map2.put("8","zhangsan8");
//将map2的元素添加到map1中
map1.putAll(map2);
System.out.println(map1.size());

结果:8
get(Object key)

          返回指定键所映射的值;如果对于该键来说,此映射不包含任何映射关系,则返回 null。

HashMap<String,String> map1 = new HashMap<>();
map1.put("1","zhangsan1");
map1.put("2","zhangsan2");
map1.put("3","zhangsan3");
map1.put("4","zhangsan4");

System.out.println(map1.get("2"));

结果:zhangsan2

根据put的key值来获取实际值。

remove(Object key)

          从此映射中移除指定键的映射关系(如果存在)。

HashMap<String,String> map1 = new HashMap<>();
map1.put("1","zhangsan1");
map1.put("2","zhangsan2");
map1.put("3","zhangsan3");
map1.put("4","zhangsan4");
System.out.println("删除前:"+ map1.size());
//删除
map1.remove("3");

System.out.println("获取key=3的值:" + map1.get("3"));

System.out.println("删除后:"+ map1.size());

结果: 删除前:4
    获取key=3的值:null
    删除后:3
isEmpty()

          如果此映射不包含键-值映射关系,则返回 true。

HashMap<String,String> map1 = new HashMap<>();
map1.put("1","zhangsan1");
map1.put("2","zhangsan2");
map1.put("3","zhangsan3");
map1.put("4","zhangsan4");
//表示不为空
System.out.println(map1.isEmpty());

结果:false
keySet()

          返回此映射中所包含的键的 Set 视图。

HashMap<String,String> map1 = new HashMap<>();
map1.put("1","zhangsan1");
map1.put("2","zhangsan2");
map1.put("3","zhangsan3");
map1.put("4","zhangsan4");


//这里需要返回一个set集合
Set<String> strings = map1.keySet();
//然后遍历,这个set集合后期章节会讲到
Iterator<String> iterator = strings.iterator();
//这样就循环出所有的key了
while (iterator.hasNext()) {
   System.out.print(iterator.next() + "\t");
}

结果: 1 2 3 4

这里需要配合set集合来使用,后期章节会讲解set

containsKey(Object key)

          如果此映射包含对于指定键的映射关系,则返回 true。

HashMap<String,String> map1 = new HashMap<>();
map1.put("1","zhangsan1");
map1.put("2","zhangsan2");
map1.put("3","zhangsan3");
map1.put("4","zhangsan4");
//查询map中的keys中是否包含2
System.out.println(map1.containsKey("2"));

结果:true
containsValue(Object value)

          如果此映射将一个或多个键映射到指定值,则返回 true。

HashMap<String,String> map1 = new HashMap<>();
map1.put("1","zhangsan1");
map1.put("2","zhangsan2");
map1.put("3","zhangsan3");
map1.put("4","zhangsan4");
//查询map中的keys中是否包含2
System.out.println(map1.containsValue("zhangsan3"));

//包含zhangsan3
结果:true
values()

          返回此映射所包含的值的 Collection 视图。

HashMap<String,String> map1 = new HashMap<>();
map1.put("1","zhangsan1");
map1.put("2","zhangsan2");
map1.put("3","zhangsan3");
map1.put("4","zhangsan4");
/**
* 转换为Collection数组,然后用iterator来遍历
*/

Collection<String> values =  map1.values();
Iterator<String> iterator = values.iterator();
while (iterator.hasNext()) {
  System.out.println(iterator.next());
}

结果
zhangsan1
zhangsan2
zhangsan3
zhangsan4
entrySet()

          返回此映射所包含的映射关系的 Set 视图。

HashMap<String,String> map1 = new HashMap<>();
map1.put("1","zhangsan1");
map1.put("2","zhangsan2");
map1.put("3","zhangsan3");
map1.put("4","zhangsan4");
/**
* 转换为Set数组,然后用iterator来遍历
*/

Set<Map.Entry<String, String>> strings = map1.entrySet();
Iterator<Map.Entry<String, String>> iterator = strings.iterator();
while (iterator.hasNext()) {
   System.out.println(iterator.next());
}


结果:

1=zhangsan1

2=zhangsan2

3=zhangsan3

4=zhangsan4

这个返回的是一个set的集合,set的元素是map的形式

clear()

          从此映射中移除所有映射关系。

HashMap<String,String> map1 = new HashMap<>();
map1.put("1","zhangsan1");
map1.put("2","zhangsan2");
map1.put("3","zhangsan3");
map1.put("4","zhangsan4");
//全部移出了
map1.clear();
System.out.println("map的元素个数:" + map1.size());

结果: map的元素个数:0


如果您觉得文章好,请动手转发,谢谢!

推荐阅读目录




扫码关注   有捣乱者绕道
长按,识别二维码,加关注

不存在任何培训机构招生信息!!

以上是关于初学者第51节之HashMap的主要内容,如果未能解决你的问题,请参考以下文章

初学者第二节之HelloWorld

第一小节之编程基础

python学习第一节之环境搭建

2017-12-19python全栈9期第四天第二节之列表的增删改查之切片

2017-12-19python全栈9期第四天第二节之列表的增删查改之按切片删除

2017-12-15python全栈9期第二天第四节之格式化输出%s和个人简介模板