集合03_Map
Map集合总览
保存映射关系key-value键值对,键唯一,值可以重复,Map和Set的实现类相似
Entry是Map的内部类
Map接口中常用的方法:
- void clear()
- Set keySet(),返回Map中key组成的Set集合
- Object put(Object key, Object value)
- Map内部类Entry的方法
- Object getKey()
- Object getValue()
Map遍历
public void map() {
Map<Integer, String> books = new HashMap<>();
books.put(1, "first");
books.put(2, "second");
// 1.使用foreach
for (Object key : books.keySet()) {
System.out.println(key + "->" + books.get(key));
}
// 2.使用迭代器
for(Iterator<Map.Entry<Integer, String>> it = books.entrySet().iterator();it.hasNext();) {
System.out.println(Key + "->" + it.next().getKey());
}
}
HashMap
- 核心要点如下:
- 无序,线程不安全,集合元素可以为null
- 底层是散列表(数组+链表)和红黑树
- 散列表中的装载因子属性默认是0.75,当装载因子*初始容量小于需要散列容量时,散列表会再散列,扩容两倍
- 初始容量默认是16
- put方法存储时,不是直接使用key的hash值,而是将key的hash值与其高16位进行异或操作,使得在做&运算时的低位其实为高位和低位的结合,增加随机性。防止碰撞冲突
- 当桶上有8位元素并且散列表容量大于64时链表数组变成红黑树
- HashMap与Hashtable比较:
- 相同
- 存储结构基本相同,都是实现Map接口
- 区别
- HashMap不是线程同步的,Hashtable是线程同步的
- HashMap允许值为null,Hashtable不允许为null
- Hashtable有contains方法,HashMap将contains方法改成了containsValue和containsKey
- HashMap继承AbstractMap,Hashtable继承Dictionary
- 相同
LinkedHashMap
- 核心要点如下:
- LinkedHashMap比HashMap多了一个双向链表的维护,初始容量对其遍历是不影响的
- LinkedHashMap调用父类HashMap的put方法,重写了put方法内部的newNode方法
- 默认使用插入顺序(insertion-ordered)遍历,也可以通过重写方法设置为访问顺序(access-ordered)
- 访问顺序开启的情况下,get方法和put方法中调用的afterNodeAccess方法会生效,执行将被访问的Entry移到尾部
- 对LinkedHashMap进行扩展实现LRUCache
TreeMap
- 核心要点如下:
- 有序,线程不安全,key不能为null
- 底层是红黑树,时间复杂度保证在O(logN)
- 默认自然排序,自定义需在构造方法中传入Comparator对象
ConcurrentHashMap
- 核心要点如下:
- Java8中,其底层结构是散列表和红黑树,同HashMap
- 键、值都不能为null
- 支持高并发的检索与更新,线程安全
- get方法是非阻塞的,不需要加锁。因其重写了Node类,通过volatile关键字修饰值V及其对象使得每次获取最新的值
- 与Hashtable比较:
- Hashtable在每个方法上都加上Synchronized以完成同步,效率低下
- ConcurrentHashMap通过在部分加锁和利用CAS算法来实现同步
面试题一览
文章地址:https://www.cnblogs.com/chenpt/p/9824548.html
集合03_Map的更多相关文章
- java基础集合经典训练题
第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...
- .Net多线程编程—并发集合
并发集合 1 为什么使用并发集合? 原因主要有以下几点: System.Collections和System.Collections.Generic名称空间中所提供的经典列表.集合和数组都不是线程安全 ...
- 一起学 Java(三) 集合框架、数据结构、泛型
一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...
- 编写高质量代码:改善Java程序的151个建议(第5章:数组和集合___建议75~78)
建议75:集合中的元素必须做到compareTo和equals同步 实现了Comparable接口的元素就可以排序,compareTo方法是Comparable接口要求必须实现的,它与equals方法 ...
- java基础_集合List与Set接口
List接口继承了Collection的方法 当然也有自己特有的方法向指定位置添加元素 add(索引,添加的元素); 移除指定索引的元素 remove(索引) 修改指定索引的元素 set ...
- Java基础Collection集合
1.Collection是所有集合的父类,在JDK1.5之后又加入了Iterable超级类(可以不用了解) 2.学习集合从Collection开始,所有集合都继承了他的方法 集合结构如图:
- 轻量级“集合”迭代器-Generator
Generator是PHP 5.5加入的新语言特性.但是,它似乎并没有被很多PHP开发者广泛采用.因此,在我们了解PHP 7对Generator的改进之前,我们先通过一个简单却显而易见的例子来了解下G ...
- Asp.net MVC 传递数据 从前台到后台,包括单个对象,多个对象,集合
今天为大家分享下 Asp.net MVC 将数据从前台传递到后台的几种方式. 环境:VS2013,MVC5.0框架 1.基本数据类型 我们常见有传递 int, string, bool, double ...
- 这些.NET开源项目你知道吗?.NET平台开源文档与报表处理组件集合(三)
在前2篇文章这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧 和这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,大伙热情高涨.再次拿出自己的私货,在.NET平台 ...
随机推荐
- html5-button元素
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- uva 1322 Minimizing Maximizer
题意: 有n个数,m个排序器,每个排序器可以把区间ai到bi的数从小到大排序.这m个排序器的输出就是m个排序之后的第n个数. 现在发现有些排序器是多余的.问至少需要多少个排序器可以使得输出不变.排序器 ...
- Operation(Swift)
介绍: NSOperation需要配合NSOperationQueue来实现多线程.因为默认情况下,NSOperation单独使用时系统同步执行操作,并没有开辟新线程的能力,只有配合NSOperati ...
- SVM支撑向量机原理
转自:http://blog.csdn.net/v_july_v/article/details/7624837 目录(?)[-] 支持向量机通俗导论理解SVM的三层境界 前言 第一层了解SVM 1分 ...
- WebStorm: The Smartest JavaScript IDE by JetBrains
WebStorm: The Smartest JavaScript IDE by JetBrains https://www.jetbrains.com/webstorm/?fromMenu
- hihoCoder #1037 : 数字三角形 (动态规划)
题目链接:https://hihocoder.com/problemset/problem/1037# 问题描述 小Hi和小Ho在经历了螃蟹先生的任务之后被奖励了一次出国旅游的机会,于是他们来到了大洋 ...
- Numpy 矩阵
矩阵定义在NumPy中,矩阵是ndarray的子类,可以由专用的字符串格式来创建 1. 创建矩阵mat函数创建矩阵(mat函数创建矩阵时,若输入已为matrix或ndarray对象,则不会为它们创建副 ...
- [转载]web服务器
Web系统由客户端(浏览器)和服务器端两部分组成.Web系统架构也被称为B/S架构.最常见的Web服务器有Apache.IIS等,常用的浏览器有IE.Firefox.chrome等.当你想访问一个网页 ...
- Python+OpenCV图像处理(八)—— 图像直方图
直方图简介:图像的直方图是用来表现图像中亮度分布的直方图,给出的是图像中某个亮度或者某个范围亮度下共有几个像素.还不明白?就是统计一幅图某个亮度像素数量.比如对于灰度值12,一幅图里面有2000 个像 ...
- Django框架----logging配置
我写Django项目常用的logging配置.(追加在setting.py文件中) LOGGING = { 'version': 1, 'disable_existing_loggers': Fals ...