Java集合框架Map接口
集合框架Map接口
Map接口:
- 键值对存储一组对象
- key不能重复(唯一),value可以重复
- 常用具体实现类:HashMap、LinkedHashMap、TreeMap、Hashtable
HashMap
HashMap实现原理:
- 基于哈希表(数组+链表+二叉树(红黑树JDK1.8新增的))
- 默认负载因子为0.75,默认的数组大小为16
- 如何把对象存储到哈希表中?
把key对象通过hash()方法计算hash值,然后用这个hash值对数组长度(默认16)取余,来决定key对象在数组中的存储位置,当这个位置有多个对象时,以链表长度大于8时,链表将转换为红黑色结构存储。这样做的目的是为了取值更快,而且存储的数据量越大,效果越明显。 - 扩充原理:当数组的容量超过了75%时,那么表示该数组需要扩充,如何扩充呢?
扩充的算法是:当前数组容量<<1(相当于乘2),扩大一倍。扩充次数越多,会影响性能,每次扩充表示哈希表重新散列(重新计算每个对象的存储位置),在开发中尽量减少扩充次数带来的性能问题 - 线程不安全,适合单线程使用
代码示例:
private static void hashMap() {
Map<Integer, String> map = new HashMap<>();
map.put(1, "One");
map.put(2, "Two");
map.put(3, "Three");
// map的遍历方式一(通过遍历Entry遍历键值)
Set<Entry<Integer, String>> entrySet = map.entrySet();
for (Entry<Integer, String> e : entrySet) {
System.out.println(e.getKey() + "->" + e.getValue());
}
// map的遍历方式二(通过遍历键取值)
Set<Integer> keys = map.keySet();
for (Integer i : keys) {
String value = map.get(i);
System.out.println(i + "->" + value);
}
// 只遍历值
Collection<String> values = map.values();
for (String v : values) {
System.out.println(v);
}
// forEach遍历,(遍历键值)
map.forEach((key, value) -> System.out.println(key + "->" + value));
}
TreeMap
/**
* 基于二叉树的红黑树实现
*/
private static void treeMap() {
Map<Integer, String> map = new TreeMap<>();
map.put(1, "One");
map.put(2, "Two");
map.put(3, "Three");
map.forEach((key, value) -> System.out.println(key + "->" + value));
}
LinkedHashMap
/**
* LinkedHashMap:具有可预知的迭代顺序。此实现与HashMap的不同之处在于,它维护着一个运行于所有条目的双重链接列表。
*/
private static void linkedHashMap() {
Map<Integer, String> map = new LinkedHashMap<>();
map.put(1, "One");
map.put(2, "Two");
map.put(3, "Three");
map.forEach((key, value) -> System.out.println(key + "->" + value));
}
Hashtable
/**
* JDK1.0开始就有
* 基于哈希表实现(数组+链表)
* 默认数组大小为11,负载因子为0.75f
* 扩充方式:原数组<<1(乘2) + 1
* 线程安全,用在多线程访问时
*/
private static void hashtable() {
Map<Integer, String> table = new Hashtable<>();
table.put(1, "One");
table.put(2, "Two");
table.put(3, "Three");
table.forEach((key, value) -> System.out.println(key + "->" + value));
}
Java集合框架Map接口的更多相关文章
- Java集合框架——Map接口
第三阶段 JAVA常见对象的学习 集合框架--Map集合 在实际需求中,我们常常会遇到这样的问题,在诸多的数据中,通过其编号来寻找某一些信息,从而进行查看或者修改,例如通过学号查询学生信息.今天我们所 ...
- JAVA集合框架 - Map接口
Map 接口大致说明(jdk11): 整体介绍: 一个将键映射到值的(key-value)对象, 键值(key)不能重复, 每个键值只能影射一个对象(一一对应). 这个接口取代了Dictionary类 ...
- java集合框架——Map
一.概述 1.Map是一种接口,在JAVA集合框架中是以一种非常重要的集合.2.Map一次添加一对元素,所以又称为“双列集合”(Collection一次添加一个元素,所以又称为“单列集合”)3.Map ...
- Java集合框架——Set接口
第三阶段 JAVA常见对象的学习 集合框架--Set接口 List集合的特点是有序的,可重复的,是不是存在这一种无序,且能保证元素唯一的集合呢?(HashSet )这就涉及到我们今天所要讲的Set集合 ...
- Java集合框架——List接口
第三阶段 JAVA常见对象的学习 集合框架--List接口 按照集合框架的继承体系,我们先从Collection中的List接口开始学习 (一) 概述及功能(ArrayList演示) (1) 概述 L ...
- Java集合框架之接口Collection源码分析
本文我们主要学习Java集合框架的根接口Collection,通过本文我们可以进一步了解Collection的属性及提供的方法.在介绍Collection接口之前我们不得不先学习一下Iterable, ...
- Java集合——集合框架Map接口
1.Map接口 public interface Map<K,V>将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值. 2.HashMap.Hashtable.Tr ...
- Java集合框架顶层接口collectiion接口
如何使用迭代器 通常情况下,你会希望遍历一个集合中的元素.例如,显示集合中的每个元素. 一般遍历数组都是采用for循环或者增强for,这两个方法也可以用在集合框架,但是还有一种方法是采用迭代器遍历集合 ...
- Java集合中Map接口的使用方法
Map接口 Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value: Map中的键值对以Entry类型的对象实例形式存在: 建(key值 ...
随机推荐
- Sublime Text3 代码编辑器使用笔记
Sublime Text3 作为一款代码的文本编辑器,有许多插件,这一点是我认为 Sublime Text3 很强大的原因之一.插件的安装可以参考下面的文章. Sublime Text3 插件安装教程 ...
- xiugai2
<div class="myLoading"> <div class="svg-wrap"> <svg width="8 ...
- php面试专题---19、MySQL高可扩展和高可用考点
php面试专题---19.MySQL高可扩展和高可用考点 一.总结 一句话总结: 要区别分区和分库分表,分区的话对用户是透明的,分库分表的话需要程序员做点事情,主从数据库同步的话借助的是二进制日志 1 ...
- 128、TensorFlow元数据MetaData
#tf.Session.run也接收一个可选的参数options #能够让你来配置训练时的参数 #run_metadata参数让你能够收集关于训练的元信息 #列如你可以使用这些可选项来追踪执行的信息 ...
- poj2376Cleaning Shifts (贪心求解)
描述 大表哥分配 N (1 <= N <= 25,000) 只中的一些奶牛在牛棚附近做些清洁. 他总是要让至少一只牛做清洁.他把一天分成T段(1 <= T <= 1,000,0 ...
- Apache Shiro简单介绍
1. 概念 Apache Shiro 是一个开源安全框架,提供身份验证.授权.密码学和会话管理.Shiro 框架具有直观.易用等特性,同时也能提供健壮的安全性,虽然它的功能不如 SpringSecur ...
- servlet--context域
ServletContext(重要) 一个项目只有一个ServletContext对象! 我们可以在N多个Servlet中来获取这个唯一的对象,使用它可以给多个Servlet传递数据! 与天地同寿!! ...
- Java程序流程控制
程序流程控制有 选择,循环,以及跳转结构 选择结构中无非就是 If 和 switch语句我两种都做了一些小案例 1. 利用Scanner库来获得控制台用户输入的数字与代码中定义的变量比较 packag ...
- linux配置mysql数据库远程连接失败
今天配置linux下mysql数据库可以远程访问的问题,百度这方面的资料有很多,但是方法都一样,都试过了却未能解决,记录一下 第一步:在/etc/mysql/my.cnf下找到bind-address ...
- C. Trailing Loves (or L'oeufs?) (质因数分解)
C. Trailing Loves (or L'oeufs?) 题目传送门 题意: 求n!在b进制下末尾有多少个0? 思路: 类比与5!在10进制下末尾0的个数是看2和5的个数,那么 原题就是看b进行 ...