一、了解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相关面试题的更多相关文章

  1. 双列集合Map

    1.双列集合Map,就是存储key-value的键值对. 2.hashMap中键必须唯一,值可以不唯一. 3.主要方法:put添加数据    getKey---通过key获取数据    keySet- ...

  2. 双列集合Map的嵌套遍历

    双列集合Map的嵌套使用,例如HashMap中还有一个HashMap,这样的集合遍历起来稍微有点儿复杂.例如一个集合:HashMap<Integer,HashMap<String,Inte ...

  3. (10)集合之双列集合Map,HashMap,TreeMap

    Map中的元素是两个对象,一个对象作为键,一个对象作为值.键不可以重复,但是值可以重复. 看顶层共性方法找子类特有对象. Map与Collection在集合框架中属并列存在 Map存储的是键值对 Ma ...

  4. Day 9:双列集合Map及实现该接口的类的常用方法

    为什么要学双列集合? 因为单列集合无法处理映射关系,会有成对出现的数据 Map接口  如果是实现了Map接口的集合类,具备的特点: 存储的数据都是以键值对的形式存在的,键不可重复,值可以重复 Map接 ...

  5. 双列集合Map接口 & Collections工具类

    HashMap 常用方法 遍历方式 iterator迭代器  ITIT HashTable 继承字典 Hashtable--Properties 文件读写 总结 Collections工具类

  6. Map集合(双列集合)

    Map集合(双列集合)Map集合是键值对集合. 它的元素是由两个值组成的,元素的格式是:key=value. Map集合形式:{key1=value1 , key2=value2 , key3=val ...

  7. Map集合——双列集合

    双列集合<k, v> Map: Map 和 HashMap是无序的: LinkedHashMap是有序的: HashMap & LinkedHashMap: put方法: 其中,可 ...

  8. Java之Map接口(双列集合)

    Map集合概述 现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射.Java提供了专门的集合类用来存放这种对象关系的对 ...

  9. 56. Map(双列集合)

    在生活中有些数据是以映射关系存在的,也就是成对出现的,比如:老公  老婆(key-->value) 双列集合:-------------------| Map    如果是实现了Map接口的集合 ...

随机推荐

  1. django框架进阶-form组件-长期维护

    ##################     form组件做了什么事情?      ####################### 之前web开发的模式,以注册为例 1,要有一个注册页面,然后有一个f ...

  2. linux下安装glibc-2.14,解决“`GLIBC_2.14' not found”问题

    下载安装包:http://ftp.gnu.org/gnu/glibc/ 我下载的是glibc-2.14.1.tar.gz 解压:tar xzf glibc-2.14.1.tar.gz cd glibc ...

  3. JAVA的堆栈和内存、垃圾回收解说

    1.有关java健壮性特点的真相 很多书上都说java健壮性的特点是因为java使用数组代替了c++的指针:c++最令人头痛的问题就是内存问题,java的健壮性使编程人员不用再考虑内存的问题:这种观点 ...

  4. spring给予XML配置的声明式事务

    步骤: 1.添加aop.tx命名空间声明: 2.配置事务管理器: 3.配置增强: 4.配置aop 具体xml设置如下: <?xml version="1.0" encodin ...

  5. 用R的dplyr进行数据转换(一)

    在网上找了很久关于数据转换的,都没有找到比较好的.现在为大家整理一下.按照我自己的思路.当然也是为了自己做笔记. 为了方便,大家可以统一安装一个系列的包,这个只需要安装tidyverse这个包就可以, ...

  6. Vue错误信息解决

    在运行Vue项目时提示如下错误: [Vue warn]: You are using the runtime-only build of Vue where the template compiler ...

  7. js中的call

    //例1 <script> window.color = 'red'; document.color = 'yellow'; var s1 = {color: 'blue' }; func ...

  8. 插入排序算法&算法分析

  9. Win10+GTX906M+Tensorflow-gpu==2.1.0

    环境 Windows10 GeForce GTX 960M python 3.7.6 tensorflow-gpu==2.1.0 CUDA 10.2 cuDNN v7.9.4.38 for windo ...

  10. 如何正确的hook方法objc_msgSend · jmpews

    如何正确的hook方法objc_msgSend 前言 如果希望对 Objective-C 的方法调用进行 log, 一个很好的解决方法就是 hook 方法 objc_msgSend, 当然想到的就是利 ...