一、了解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. 发现个很有意思的angularjs +grunt 复习项目

    最近作运维工作 docker 接触到一个开源webui dockerui 原项目地址 https://github.com/crosbymichael/dockerui 用angular框架实现,项目 ...

  2. python-倒序循环

    有时候循环需要用到倒序,所以整理一下倒序循环的方法 方法1: 如果要倒序遍历访问序列中的元素,可以对该序列使用reversed() 函数,reversed函数会生成一份倒序列表的拷贝,但是不会改变原列 ...

  3. 第十六届“二十一世纪的计算”学术研讨会 牛津大学肿瘤成像学教授Michael Brady主题演讲

    Computing and Healthcare 牛津大学肿瘤成像学教授Michael Brady主题演讲" title="第十六届"二十一世纪的计算"学术研讨 ...

  4. open()操作文件

    open()函数用来读取.写文件 参数解释: r:只读 w:只写,此时进行读,会报错 a:只追加 r+:可读可写 w+:可读可写 a+:可读可写 rb\rb+\wb\wb+\ab\ab+ 针对二进制文 ...

  5. fastdfs+nginx make时报错fatal error:fdfs_define.h: 没有那个文件或目录

    环境: ubuntu 18.04.1 fastdfs-nginx-module_v1.16 root@wang-machine:~/桌面/FastDFS# cd nginx-1.8.1/root@wa ...

  6. vue2.0一个弹窗组件

  7. scatter散点图

    import matplotlib.pyplot as plt import numpy as np n = 1024 X = np.random.normal(0,1,n) Y = np.rando ...

  8. Dream权限追踪系统<=2.0.1 重安装漏洞

    在./install/install.php中 if(file_exists('lock.txt')){ echo '系统已安装,请不要重复安装!如需安装,请删除install文件夹下的lock.tx ...

  9. 沈向洋|微软携手 OpenAI 进一步履行普及且全民化人工智能的使命

    OpenAI 进一步履行普及且全民化人工智能的使命"> 作者简介 沈向洋,微软全球执行副总裁,微软人工智能及微软研究事业部负责人 我们正处于技术发展历程中的关键时刻. 云计算的强大计算 ...

  10. C++走向远洋——39(指向学生类的指针)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:zhizhen.cpp * 作者:常轩 * 微信公众号:Worl ...