HashMap,TreeMap,Hashtable,LinkedHashMap的区别
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的区别相关推荐
- HashMap和Hashtable的详细区别
HashMap和Hashtable的详细区别 一.简述: 1.安全性 Hashtable是线程安全,HashMap是非线程安全.HashMap的性能会高于Hashtable,我们平时使用时若无特殊需求 ...
- Java中的HashMap和Hashtable有什么区别?
Java中的aHashMap和a有什么区别Hashtable? Java中的aHashMap和a有什么区别Hashtable? Java中的aHashMap和a有什么区别Hashtable? Java ...
- HashMap与HashTable联系与区别
HashMap与HashTable 1.hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法. 2.hashTabl ...
- hashmap put复杂度_集合类HashMap,HashTable,ConcurrentHashMap区别?
作者简介: 华哥 10年+后端开发工作经验, 主要分享:关于java体系的知识,如:java基础知识/数据结算/算法,Spring/MyBatis/Netty源码分析,高并发/高性能/分布式/微服务架 ...
- 面试题 HashMap和HashTable有什么区别
- Stockoverflow一集合一HashMap和Hashtable的区别
StockoverflowRestful API 吾生也有涯,而知也无涯 版本号 修改人 修改日期 修改内容 v1.0 shanYueFenCheng 2019-08-19 Restful文档 说明 ...
- 集合类之番外篇:深入解析HashMap、HashTable
Java集合类是个非常重要的知识点,HashMap.HashTable.ConcurrentHashMap等算是集合类中的重点,可谓"重中之重",首先来看个问题,如面试官问你:Ha ...
- python面试 hashmap是什么_Java HashMap与Hashtable的区别是什么?
成为入门级的认证专业,最常被问到的面试问题之一是关于Java HashMap和Hashtable.因此,您必须完全准备好回答任何与HashMap或Hashtable相关的问题.Java利用HashMa ...
- Hashtable TreeMap HashMap LinkedHashMap的区别
Hashtable TreeMap HashMap LinkedHashMap的区别 Hashtable TreeMap HashMap LinkedHashMap详解 Hashtable 1.内部存 ...
- 【Java集合之Map】HashMap、HashTable、TreeMap、LinkedHashMap区别
Java为数据结构中的映射定义了一个接口java.util.Map,它有四个实现类,分别是HashMap.HashTable.LinkedHashMap和TreeMap.本节实例主要介绍这4中实例的用 ...
最新文章
- python画散点图分布-python画时间序列散点图
- 能买到鸿蒙系统,哪里能买到鸿蒙系统的设备?
- 泛函分析2——Normed Linear Spaces
- Invalid URI
- 【转】Memcached管理与监控工具----MemAdmin
- Tomcat的8080、8005、8009端口
- mono for android定义,2.1.3 使用Mono for Android的原因
- Nginx的accept_mutex配置
- Spring Boot后台启动不打印nohup.out
- QString::section
- android Alarm 闹钟
- 怎么旋转PDF文件中的页面
- 带顶点动画的护盾效果——UnityShader学习笔记
- python argparse 和opencv模块的组合使用_如何利用Python3和OpenCV对比两张图片的不同,提取差异性...
- 小身板干大事:DATAhawk无人机独创手抛起飞实现3厘米精准测绘
- HZ服务器装系统速度变慢,360Hz刷新率有些什么厉害的地方?响应时间系统延迟测试...
- Linux 系统检测和加固脚本
- 这些魔术用的是物理原理?有啥诀窍?
- mapxtreme 标注的强调显示
- 增长黑客系列—如何精细化渠道效果投放