双列集合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接口的集合 ...
随机推荐
- Longest Increasing Subsequence (Medium)
第一次做题思路201511092250 1.采用map存储,key为nums[i],value为以nums[i]为结尾的最大递增子序列的长度 2.采用map里面的lower_bounder函数直接找出 ...
- mysqli存储过程
<?php$link = mysqli_connect('localhost','root','','chinatupai'); $sql = "call getEmail('000 ...
- Java过滤器Filter的原理及配置_学习笔记
Filter中文意思为过滤器.顾名思义,过滤器可在浏览器以及目标资源之间起到一个过滤的作用.例如:水净化器,可以看成是生活中的一个过滤器,他可以将污水中的杂质过滤,从而使进入的污水变成净水. 对于WE ...
- Go语言如何实现单例模式
单例模式是常见的设计模式,被广泛用于创建数据库,redis等单实例.作用在于可以控制实例个数节省系统资源 特点: 保证调用多次,只会产生单个实例 全局访问 单例的分类 单例模式大致分为2大类: 懒汉式 ...
- Typescript - 联合类型
原文:TypeScript基本知识点整理 零.序言 联合类型表示一个变量值可以是几种类型之一,我们可以使用 “|” 来分割每个类型: 联合类型的变量在被赋值时,会根据类型推断的规则推断出一个类型: 如 ...
- LeetCode Problem 90. Subsets II
python solution 123456789101112131415161718192021222324252627 class (object): def subsetsWithDup(sel ...
- 用Python拨打电话
用python拨打电话,先看小视频 跟selenium操作浏览器原理类似,这是用appium操作移动设备的一个自动化功能,自娱自乐,主要是通过小案例引出相关技术 一.环境配置: 1.安装 jdk 1. ...
- Mybatis: 插件及分页
Mybatis采用责任链模式,通过动态代理组织多个拦截器(插件),通过这些拦截器可以改变Mybatis的默认行为(诸如SQL重写之类的). Mybatis支持对Executor.StatementHa ...
- fastcgi_param详解
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;#脚本文件请求的路径 fastcgi_param QUERY_STRI ...
- Nginx设置目录浏览并配置验证
Nginx默认是不允许进行列目录的,如果需要使某个目录可以进行浏览,可如下设置:如: 让/var/www/soft 这个目录在浏览器中完成列出. 一.设置目录浏览1.打开/usr/local/ngin ...