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对象后面
*/

HashMap测试程序1的更多相关文章

  1. HashMap测试程序2

    package com.iotek.map; import java.util.HashMap;import java.util.Map; public class HashMapDemo2 { /* ...

  2. Java 集合系列10之 HashMap详细介绍(源码解析)和使用示例

    概要 这一章,我们对HashMap进行学习.我们先对HashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用HashMap.内容包括:第1部分 HashMap介绍第2部分 HashMa ...

  3. JAVA HashMap详细介绍和示例

    http://www.jb51.net/article/42769.htm 我们先对HashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用HashMap.   第1部分 HashMa ...

  4. HashMap源码分析和应用实例的介绍

    1.HashMap介绍 HashMap 是一个散列表,它存储的内容是键值对(key-value)映射.HashMap 继承于AbstractMap,实现了Map.Cloneable.java.io.S ...

  5. Java之HashMap用法

    源码: package test_demo; import java.util.HashMap; import java.util.Iterator; import java.util.Map; im ...

  6. Java HashMap详细介绍和使用示例

    ①对HashMap的整体认识 HashMap是一个散列表,它存储的内容是键值对(key-value)映射. HashMap继承于AbstractMap,实现了Map.Cloneable.java.io ...

  7. Java集合系列之HashMap

    概要 第1部分 HashMap介绍 HashMap简介 HashMap 是一个散列表,它存储的内容是键值对(key-value)映射.HashMap 继承于AbstractMap,实现了Map.Clo ...

  8. HashMap与ConcurrentHashMap的区别

    从JDK1.2起,就有了HashMap,正如前一篇文章所说,HashMap不是线程安全的,因此多线程操作时需要格外小心. 在JDK1.5中,伟大的Doug Lea给我们带来了concurrent包,从 ...

  9. 转发 java数据结构之hashMap详解

    概要 这一章,我们对HashMap进行学习.我们先对HashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用HashMap.内容包括:第1部分 HashMap介绍第2部分 HashMa ...

随机推荐

  1. leetcode 40. 组合总和 II (python)

    给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只能使用一次. ...

  2. day15生成器send方法,递归,匿名函数,max结合匿名工作原理,常用的内置函数

    复习 ''' 1.带参装饰器 - 自定义 | wraps def wrap(info) def outer1(func): from functools import wraps @wraps(fun ...

  3. VMware虚拟机上运行Manjaro系统

    Manjaro系统是从ArchLinux系统发展而来.它的软件安装工具不是ubuntu的apt-get,不是yum,而是pacman. 在虚拟机安装好Manjaro后, 安装虚拟机工具VM-Tools ...

  4. python-IDE的使用(小白先看)

    一.定义 IDE:集成开发环境(Integrated Development Environment) 二.常见的IDE工具: 1.VIM,经典的Linux下的文本编辑器 2.Emacs,LInux的 ...

  5. C#中Func与Action的理解

    Action 与 Func是.NET类库中增加的内置委托,以便更加简洁方便的使用委托.最初使用委托时,均需要先定义委托类型,然后定义一个符合委托类型签名的函数,在调用前,需声明并创建委托对象,将指定函 ...

  6. 如何配置属于自己的Git账户

    如何配置属于自己的Git账户:https://jingyan.baidu.com/article/3d69c55123e556f0cf02d730.html

  7. 40-python基础-python3-字典常用方法-setdefault()

    setdefault() 常常需要为字典中某个键设置一个默认值,当该键没有任何值时使用它,如下面的情况: setdefault()方法, 字典.setdefault(键,默认值) 传递给该方法的第一个 ...

  8. CSS制作垂直口风琴2

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. Log4Net 之将日志记录到数据库的配置 (一)

    原文:Log4Net 之将日志记录到数据库的配置 (一) 前段时间我一直想做一个通用一点的日志记录系统,可以便于不同的业务组调用进行日志记录及分析.本来打算着自己下手写一个,后面发现各业务组可能会需要 ...

  10. java定时任务详解

    首先,要创建你自己想要定时的实体类 @Service("smsService")@Transactionalpublic class SmsSendUtil { @Autowire ...