package com.iotek.map;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class HashMapDemo1 {
public static void main(String[] args) {
// HashMap<String, String> map = new HashMap<String,String>();
Map<String, String> map = new HashMap<String,String>(); //接口的引用变量指向实现类的对象
//创建HashMap对象,也就是创建一个Map容器
map.put("jay", "张三"); //添加键值对元素
map.put("jay", "李四");
//有相同的键时,后面添加的键对应的值会覆盖掉之前键对应的值
map.put("john", "李四");
//键名不同,键值相同,会保存重名的键值,也就是说值是可以重复的,键是不能重复的
map.put("rose", "玫瑰"); //添加键值对元素
map.put("mary", "小红"); //添加键值对元素
System.out.println(map);

Set<String> keys = map.keySet();// 获取map中所有键,返回的是一个Set容器,可以用迭代器对象或者foreach来进行输出
System.out.println("******输出map容器中所有的键:");
/*for(String key : keys) {
System.out.print(key + " "); //用String类型的变量key来遍历keys容器
}*/

//获取map中所有的值:使用map接口中的values方法,返回Collection接口的实现类
Collection<String> values = map.values();
System.out.println("\n******输出map容器中所有的值:");
for(String value : values) {
System.out.print(value + " "); //用String类型的变量value来遍历values容器
}

//得到key的同时,得到key所对应的值
System.out.println("\n******用获取的键来得到对应的值并输出:");
for(String key : keys) {
System.out.print(key + "--" + map.get(key)); //用String类型的变量key来遍历keys容器
}
//map.get(Object key)方法返回的是指定的键所对应 的值,
System.out.println("\nmap容器中键值对的个数是:" + map.size());
System.out.println("判断map容器中是否为空:" + map.isEmpty());

// map.entrySet()返回的是一个set容器,其中放的是map.Entry内部接口
/*当我们调用put(key,value)方法时,首先会把key和value封装到Entry这个静态内部类中,
* 再把Entry对象添加到数组中(哈希表),所以我们想要获取map中的所有键值对,只需要获取
* 数组汇总所有的Entry,接下来调用Entry对象中的getKey 和getValue方法就能获取键值对
* 以后想输出HashMap容器中所有的键值对,都可以调用HashMap的 entrySet()方法就可以了!!!*/
Set<Entry<String, String>> entrys = map.entrySet();
System.out.println("使用map接口的entrySet()方法获取map容器中所有的键值对:");
for (Entry<String, String> entry : entrys) {
System.out.println(entry.getKey() + "-" + entry.getValue());
}
map.clear();
System.out.println("判断map容器中是否为空:" + map.isEmpty());

}

}

/*
* hashmap调用默认构造方法会产生一个默认底层是长度为16的Entry数组,首先调用key的hasCode()方法来得到一个整数,
* int hash = hash(key.hashCode());
* 这个整数就是哈希码,然后把哈希码作为参数传递到hash()函数中来进行运算,即散列运算,得到一个int类型的散列值
* int i = indexFor(hash, table.length);
* 把散列值和数组的长度来进行运算,最终得到Entry对象要存放到数组的位置(下标)
*
* hashmap内部的结构是数组加单向链表结构,因为不同的key有可能计算出相同的散列值,根据散列值计算出来的存放到数组的下标
* 会冲突(同一个下标值),此时, 如果键相同,散列值也一样,说明是同一个对象,此时会将键所对应的旧值用新的键值覆盖掉
* 如果散列值一样,键名不一样,说明是不同的对象,此时会把键值对封装成entry对象放到那个散列值对应的下标位置处,
* 原来那个entry对象会以链表形式链接在新创建的entry对象后面
*/

最新文章

  1. java基础 作业(一)
  2. merge,join,concat
  3. 白皮 Chapter 1
  4. Linux命令详解之—more命令
  5. EL表达式,JSTL:jsp standard Tag Library
  6. 在JavaScript中判断整型的N种方法
  7. LabVIEW的错误簇以及错误处理函数
  8. DNS服务器的原理
  9. 【数学】XMU 1593 找数字
  10. maven简单工具命令
  11. Android Studio ADB响应失败解决方法
  12. LeetCode: Sum Root to Leaf Numbers [129]
  13. NYoj 素数环(深搜入门)
  14. eclipse的maven操作无反应
  15. 1. [mmc subsystem] 概念与框架
  16. jQuery插件之上传文件ajaxfileupload.js源码与使用
  17. vue-cli3安装创建项目以及目录结构
  18. linux命令行抓取网页快照
  19. shell一出手
  20. Spring mvc接收中文参数值乱码(tomcat配置问题)

热门文章

  1. PJSIP Socket 模型
  2. C# Oledb 连接Access数据库字符串
  3. TC39 - 新特性
  4. Delphi XE2 之 FireMonkey 入门(17) - 特效
  5. iview在项目中遇到的坑
  6. UIAutomation元素识别软件
  7. vue 组件传参
  8. APM全链路监控--日志收集篇
  9. [19/05/08-星期三] JDBC(Java DataBase Connectivity)_ORM(Object Relationship Mapping, 对象关系映射)
  10. spring注解之@Scope