双列集合Map相关面试题
一、了解Map集合吗?Map集合都有哪些实现
- HashMap
- HashTable
- LinkedHashMap
- TreeMap
- ConcurrentHashMap
二、HashMap和HashTable之间的区别
1、定义
HashMap底层基于数组+单向链表(红黑树),非线程安全,允许有空的键和值
- 数组:Node<K,V> [] table ,每一个元素都是一个Node
- 单向链表:Node<K,V> next,当发生Hash碰撞,会追加链表,当链表长度大于8,那就转换为红黑树
HashTable底层基于哈希表实现,线程是安全的,不允许有空的键和值
2、继承
HashMap继承自AbstractMap类
HashTable是继承自Dictionary类
3、扩容原理
HashMap的初始容量为,之后每次扩容,容量就变成了原来的2倍;
HashTable的初始容量为,之后每次扩容,容量就变成了原来的2n+1;
三、hashCode()和equals()方法使用场景
hashCode():
顶级父类Object当中的方法,返回值类型为int类型的值,根据一定的规则(存储地址,字段,长度等等)生成一个数组,数据保存的就是Hash值
equals():
顶级类Object中的方法,根据一定的比较规则,判断对象是否一致,底层一般逻辑:
1.判断两个对象的内存地址是否一样
2.非空判断和Class类型判断
3.强转
4.对象中的字段一一匹配
package com.zn.mytest;
import java.util.Objects;
public class UserTest {
private int uid;
private String uName;
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getuName() {
return uName;
}
public void setuName(String uName) {
this.uName = uName;
}
@Override
public boolean equals(Object o) {
//判断两个对象内存地址是否一样
if (this == o) return true;
//非空判断和class判断
if (o == null || getClass() != o.getClass()) return false;
//强转
UserTest userTest = (UserTest) o;
//对象中的字段--匹配
return uid == userTest.uid &&
Objects.equals(uName, userTest.uName);
}
@Override
public int hashCode() {
return Objects.hash(uid, uName);
}
}
四、HashMap和TreeMap应该如何选择
HashMap:
底层采用数组+链表(红黑树)结构,可以实现快速的存储和检索,但是数据是无序的,适用于在Map当中插入删除或者获取元素
TreeMap:
存储结构是一个平衡二叉树,具体实现方式为红黑树,默认采用自然排序,可以自定义排序规则,但是需要实现Comparator接口能够便捷的实现内部元素的各种排序,但是性能比HashMap差,适用于按照自然排序和自定义排序规则
五、Set和Map的关系
Set核心就是保存不重复的元素,存储一组唯一的对象
set当中每一种实现都对应Map
HashSet对应的HashMap,TreeSet对应的TreeMap
HashSet对应的底层就是new HashMap,TreeSet对应的底层就是new TreeMap;
HashSet:

TreeSet:

六、常见的Map排序规则
按照添加规则使用LinkedHashMap,按照自然排序或者自定义规则排序可以采用TreeMap
1、TreeMap排序
TreeMap只能根据key进行排序,TreeMap本身是个二叉树,元素的顺序是由key的值决定的;
按照自然排序可以采用TreeMap;
实现代码:
package com.zn.mytest;
import java.util.TreeMap;
public class TreeMapTest {
public static void main(String[] args) {
TreeMap<String, String> map = new TreeMap<String,String>();
map.put("1","A");
map.put("2","B");
map.put("3","C");
map.put("4","D");
map.put("5","E");
System.out.println(map);
}
}
效果展示:

2、HashMap排序
HashMap本身是没有顺序的,不能直接对其进行排序;
要排序,只能先转成list;
实现代码:
package com.zn.mytest; import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map; public class HashMapTest {
public static void main(String[] args) {
HashMap<Integer,String> map = new HashMap<Integer,String>();
map.put(1,"A");
map.put(3,"B");
map.put(2,"C");
map.put(4,"D");
map.put(5,"E");
ArrayList<Object> list = new ArrayList<>();
for (Map.Entry<Integer,String> entry:map.entrySet()){
System.out.println("entry.getKey.hash:"+entry.getKey().hashCode());
list.add(entry.getValue());
}
System.out.println(list);
}
}
效果展示:

3、LinkedHashMap排序
插入顺序,遍历LinkedHashMap时,先得到的记录肯定是先插入的;
实现代码:
package com.zn.mytest;
import java.util.LinkedHashMap;
public class LinkedListTest {
public static void main(String[] args) {
LinkedHashMap<String, String> map = new LinkedHashMap<>();
for (int i=0;i<10;i++){
map.put("key"+i,"value"+i);
}
map.get("key"+3);
for (String value:map.keySet()){
System.out.println(value);
}
}
}
效果展示:

七、如何保证Map线程安全
多线程环境下,可以使用concurrent包下有一个ConcurrentHashMap或者是使用Collections.synchronizedList(new HashMap<K,V>());
ConcurrentHashMap保证线程安全,效率比HashTable高,采分段锁
双列集合Map相关面试题的更多相关文章
- 双列集合Map
1.双列集合Map,就是存储key-value的键值对. 2.hashMap中键必须唯一,值可以不唯一. 3.主要方法:put添加数据 getKey---通过key获取数据 keySet- ...
- 双列集合Map的嵌套遍历
双列集合Map的嵌套使用,例如HashMap中还有一个HashMap,这样的集合遍历起来稍微有点儿复杂.例如一个集合:HashMap<Integer,HashMap<String,Inte ...
- (10)集合之双列集合Map,HashMap,TreeMap
Map中的元素是两个对象,一个对象作为键,一个对象作为值.键不可以重复,但是值可以重复. 看顶层共性方法找子类特有对象. Map与Collection在集合框架中属并列存在 Map存储的是键值对 Ma ...
- Day 9:双列集合Map及实现该接口的类的常用方法
为什么要学双列集合? 因为单列集合无法处理映射关系,会有成对出现的数据 Map接口 如果是实现了Map接口的集合类,具备的特点: 存储的数据都是以键值对的形式存在的,键不可重复,值可以重复 Map接 ...
- 双列集合Map接口 & Collections工具类
HashMap 常用方法 遍历方式 iterator迭代器 ITIT HashTable 继承字典 Hashtable--Properties 文件读写 总结 Collections工具类
- Map集合(双列集合)
Map集合(双列集合)Map集合是键值对集合. 它的元素是由两个值组成的,元素的格式是:key=value. Map集合形式:{key1=value1 , key2=value2 , key3=val ...
- Map集合——双列集合
双列集合<k, v> Map: Map 和 HashMap是无序的: LinkedHashMap是有序的: HashMap & LinkedHashMap: put方法: 其中,可 ...
- Java之Map接口(双列集合)
Map集合概述 现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射.Java提供了专门的集合类用来存放这种对象关系的对 ...
- 56. Map(双列集合)
在生活中有些数据是以映射关系存在的,也就是成对出现的,比如:老公 老婆(key-->value) 双列集合:-------------------| Map 如果是实现了Map接口的集合 ...
随机推荐
- python-django框架-电商项目-商品模块开发_20191124
用户浏览记录的添加 什么时候添加历史浏览记录? 在商品详情的视图里面添加浏览记录, 之前使用的list来存储浏览记录, 注意:如果good_id之前已经浏览过了,那就要移除,conn.lrem(his ...
- mysql挖掘与探索------第2章 索引1-1
1索引作用 说起提高数据库性能,索引是最物美价廉的东西了.不用加内存,不用改程序,不用调sql,只要执行个正确的’create index’,查询速度就可能提高百倍千倍,这可真有诱惑力.可是天下没有免 ...
- [LC] 82. Remove Duplicates from Sorted List II
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numb ...
- python多线程交替打印abc以及线程池进程池的相关概念
import threading import sys import time def showa(): while True: lockc.acquire() #获取对方的锁,释放自己的锁 prin ...
- python3下scrapy爬虫(第二卷:初步抓取网页内容之直接抓取网页)
上一卷中介绍了安装过程,现在我们开始使用这个神奇的框架 跟很多博主一样我也先选择一个非常好爬取的网站作为最初案例,那么我先用屌丝必备网站http://www.shaimn.com/xinggan/作为 ...
- CentOS 7上Docker的安装
一.安装docker 1.Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker . 通过 uname -r 命令查看 ...
- ltp压力测试结果分析脚本
最近工作性质发生了改变,在做操作系统方面的测试.接手的第一个任务是做ltp stress.测试内核稳定性. 做完之后会结果进行统计分析.因为统计的内容比较多,都是通过shell命令行进行操作.于是编写 ...
- jmeter+ant+jenkins 接口自动化测试持续集成(送源码)
9.1 安装和介绍 JMeter 安装文件路径:https://pan.baidu.com/s/1kVJdnuv. JMeter 是轻量级的开源且稳定的自动化测试工具. 思路:在接口说明文档中整理 ...
- 腾讯入股Snap,能救“阅后即焚”的命吗?
互联网社交的强大包容性,让各种社交形式都能有着较多的受众群体.普适性极广的QQ.微信."脸谱":专攻陌生人社交的陌陌:让人们发布意见的微博--当然也少不了"阅 ...
- AI超越人类大脑,或许是场“别有用心者”的骗局
谷歌.微软.苹果.特斯拉.百度.腾讯.阿里等互联网巨头企业,以及纳德拉.马斯克.扎克伯格.马云等互联网大佬,近年来一直都对人工智能--AI非常上心.在众多场合对AI给予了或肯定,或恐惧的评价.但无 ...