HashMap

HashMap的实现原理

  • 基于哈希表(数组+链表+二叉树(红黑树))
  • 默认加载因子为0.75,默认数组大小是16
  • 把对象存储到哈希表中,如何存储?
  • 把key对象通过hash()方法计算hash的值,然后用这个hash值对数组长度取余数(默认是16),来决定对key对象在数组中存储的位置,当这个位置有多个对象时,以链表结构存储,JDK1.8后,当链表长度大于8时,链表转换为红黑树结构存储
  • 这样的目的是为了取值更快,存储的数据量越大,性能的表现越明显
  • 扩充原理:当数组的容量超过75%,数组需要进行扩充,如何扩充
  • 扩充的算法是:当前容量乘以2,扩充次数过多,会影响性能,每次扩充表示哈希表重新散列(重新计算每个位置的存储位置),我们尽量在开发中减少扩充次数带来的性能问题。
  • 线程不安全,适合在单线程里使用

简单使用:

实体类对象:

class Dog {private int id;private String name;public Dog() {}public Dog(int id, String name) {this.id = id;this.name = name;}// get,set,toString@Overridepublic boolean equals(Object o) {if (this == o) {return true;}if (o == null || getClass() != o.getClass()) {return false;}Dog dog = (Dog) o;return id == dog.id && Objects.equals(name, dog.name);}@Overridepublic int hashCode() {return Objects.hash(id, name);}
}
    private static void hashMap() {Map<Integer, String> map = new HashMap<>();map.put(1, "jack");map.put(2, "vince");map.put(3, "bin");map.put(4, "tom");map.put(null, null);map.put(5, null);System.out.println(map.size());// 从map遍历1map.entrySet().forEach(System.out::println);// map遍历2Set<Integer> integers = map.keySet();for (Integer integer : integers) {System.out.println(map.get(integer));}//map的遍历3(遍历值)map.values().forEach(System.out::println);// map的遍历4map.forEach((integer, s) -> System.out.println(integer + "->" + s));}

Hashtable:

  • JDK1.0开始
  • 基于哈希表(数组+链表)
  • 默认数组大小为11,加载因子0.75
  • 扩充方式:原数组大小*2+1
  • 线程安全的,用在多线程访问时

简单使用:

 private static void hashtable() {Map<String, String> table = new Hashtable<>();table.put("one", "lili");table.put("two", "lalal");table.put("three", "zzz");table.forEach((s, s2) -> System.out.println(s + "->" + s2));}

TreeMap:

  • 基于二叉树的红黑树实现,方便进行排序

简单应用

private static void treeMap() {Map<String, String> map = new LinkedHashMap<>();map.put("one", "lili");map.put("two", "lalal");map.put("three", "zzz");map.forEach((s, s2) -> System.out.println(s + "->" + s2));Map<Dog, String> dogs = new TreeMap<>(Comparator.comparing(Dog::getId));dogs.put(new Dog(1, "1ha"), "dog1");dogs.put(new Dog(2, "2ha"), "dog2");dogs.put(new Dog(3, "3ha"), "dog3");dogs.forEach((s, s2) -> System.out.println(s + "->" + s2));}

LinkedHashMap:

  • LinkedHashMap是HashMap的子类,由于HashMap不能保证顺序恒久不变,此类使用一个双重链表来维护元素添加的顺序

简单使用

 private static void linkedHashMap() {Map<String, String> map = new LinkedHashMap<>();map.put("one", "lili");map.put("two", "lalal");map.put("three", "zzz");map.forEach((s, s2) -> System.out.println(s + "->" + s2));}

HashMap,TreeMap,Hashtable,LinkedHashMap的区别相关推荐

  1. HashMap和Hashtable的详细区别

    HashMap和Hashtable的详细区别 一.简述: 1.安全性 Hashtable是线程安全,HashMap是非线程安全.HashMap的性能会高于Hashtable,我们平时使用时若无特殊需求 ...

  2. Java中的HashMap和Hashtable有什么区别?

    Java中的aHashMap和a有什么区别Hashtable? Java中的aHashMap和a有什么区别Hashtable? Java中的aHashMap和a有什么区别Hashtable? Java ...

  3. HashMap与HashTable联系与区别

    HashMap与HashTable 1.hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法. 2.hashTabl ...

  4. hashmap put复杂度_集合类HashMap,HashTable,ConcurrentHashMap区别?

    作者简介: 华哥 10年+后端开发工作经验, 主要分享:关于java体系的知识,如:java基础知识/数据结算/算法,Spring/MyBatis/Netty源码分析,高并发/高性能/分布式/微服务架 ...

  5. 面试题 HashMap和HashTable有什么区别

  6. Stockoverflow一集合一HashMap和Hashtable的区别

    StockoverflowRestful API 吾生也有涯,而知也无涯 版本号 修改人 修改日期 修改内容 v1.0 shanYueFenCheng 2019-08-19 Restful文档 说明 ...

  7. 集合类之番外篇:深入解析HashMap、HashTable

    Java集合类是个非常重要的知识点,HashMap.HashTable.ConcurrentHashMap等算是集合类中的重点,可谓"重中之重",首先来看个问题,如面试官问你:Ha ...

  8. python面试 hashmap是什么_Java HashMap与Hashtable的区别是什么?

    成为入门级的认证专业,最常被问到的面试问题之一是关于Java HashMap和Hashtable.因此,您必须完全准备好回答任何与HashMap或Hashtable相关的问题.Java利用HashMa ...

  9. Hashtable TreeMap HashMap LinkedHashMap的区别

    Hashtable TreeMap HashMap LinkedHashMap的区别 Hashtable TreeMap HashMap LinkedHashMap详解 Hashtable 1.内部存 ...

  10. 【Java集合之Map】HashMap、HashTable、TreeMap、LinkedHashMap区别

    Java为数据结构中的映射定义了一个接口java.util.Map,它有四个实现类,分别是HashMap.HashTable.LinkedHashMap和TreeMap.本节实例主要介绍这4中实例的用 ...

最新文章

  1. python画散点图分布-python画时间序列散点图
  2. 能买到鸿蒙系统,哪里能买到鸿蒙系统的设备?
  3. 泛函分析2——Normed Linear Spaces
  4. Invalid URI
  5. 【转】Memcached管理与监控工具----MemAdmin
  6. Tomcat的8080、8005、8009端口
  7. mono for android定义,2.1.3 使用Mono for Android的原因
  8. Nginx的accept_mutex配置
  9. Spring Boot后台启动不打印nohup.out
  10. QString::section
  11. android Alarm 闹钟
  12. 怎么旋转PDF文件中的页面
  13. 带顶点动画的护盾效果——UnityShader学习笔记
  14. python argparse 和opencv模块的组合使用_如何利用Python3和OpenCV对比两张图片的不同,提取差异性...
  15. 小身板干大事:DATAhawk无人机独创手抛起飞实现3厘米精准测绘
  16. HZ服务器装系统速度变慢,360Hz刷新率有些什么厉害的地方?响应时间系统延迟测试...
  17. Linux 系统检测和加固脚本
  18. 这些魔术用的是物理原理?有啥诀窍?
  19. mapxtreme 标注的强调显示
  20. 增长黑客系列—如何精细化渠道效果投放

热门文章

  1. Shiro权限控制框架
  2. hdu 1712 ACboy needs your help (DP)
  3. Ruby 2.0 发布首个预览版
  4. c# 小写金额转大写
  5. linux 集成 3g 模块 串口 option,华为等 3G、4G模块拨号上网过程分析
  6. 3. 什么是icmp?icmp与ip的关系_0.3亿人口的美国会比3亿人口的美国富裕吗?
  7. Zookeeper 常用Shell命令总结
  8. Semaphore源码解读
  9. Nacos整合SpringCloud的自动注册原理
  10. css3 水纹效果(仿写阿里云)