hashmap原理

java容器

陌路散爱 提交于 2019-12-03 01:48:11
原文链接 一、概览 容器主要包括 Collection 和 Map 两种,Collection 存储着对象的集合,而 Map 存储着键值对(两个对象)的映射表。 Collection 1. Set TreeSet:基于红黑树实现,支持有序性操作,例如根据一个范围查找元素的操作。但是查找效率不如 HashSet,HashSet 查找的时间复杂度为 O(1),TreeSet 则为 O(logN)。 HashSet:基于哈希表实现,支持快速查找,但不支持有序性操作。并且失去了元素的插入顺序信息,也就是说使用 Iterator 遍历 HashSet 得到的结果是不确定的。 LinkedHashSet:具有 HashSet 的查找效率,且内部使用双向链表维护元素的插入顺序。 2. List ArrayList:基于动态数组实现,支持随机访问。 Vector:和 ArrayList 类似,但它是线程安全的。 LinkedList:基于双向链表实现,只能顺序访问,但是可以快速地在链表中间插入和删除元素。不仅如此,LinkedList 还可以用作栈、队列和双向队列。 3. Queue LinkedList:可以用它来实现双向队列。 PriorityQueue:基于堆结构实现,可以用它来实现优先队列。 Map TreeMap:基于红黑树实现。 HashMap:基于哈希表实现。 Hashtable:和

数据结构08-散列(自定义HashMap)

喜夏-厌秋 提交于 2019-12-02 11:23:12
实现自定义的HashSet之后HashMap也自然水到渠成了,作者的实现方法是以HashSet的方式来类比实现HashMap,而JavaAPI中标准的HashSet是基于HashMap的,因为Map中的keySet方法就是返回一个HashSet,所以只需要隐藏掉Value的相关操作,稍加改造就可以实现HashSet,减少代码冗余。 作者的这种方法虽然相对于标准的JavaAPI来说有些冗余,但十分利于学习和巩固基础,此种法方法原理就是将HashSet中存储的元素改为固定的Entry类,而Entry类是个泛型类,带有两个泛型K和V,分别代表key和value,闲话少叙,下面进入代码环节; 实现自定义HashMap的基本程序如下: 1.定义MyMap接口: package A03.Hash; public interface MyMap<K, V> { // 查找元素 boolean containsKey(K key); // 查找元素 boolean containsValue(V value); // 根据Key取出Value V get(K key); // 根据Key删除Value void remove(K key); // 获取映射表大小 int size(); // 是否为空 boolean isEmpty(); V put(K key, V value); MySet

GuavaCache学习笔记一:自定义LRU算法的缓存实现

馋奶兔 提交于 2019-12-02 06:35:59
随笔 - 169 文章 - 0 评论 - 292 GuavaCache学习笔记一:自定义LRU算法的缓存实现 前言 今天在看GuavaCache缓存相关的源码,这里想到先自己手动实现一个LRU算法。于是乎便想到LinkedHashMap和LinkedList+HashMap, 这里仅仅是作为简单的复习一下。 LRU LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。 代码实现原理 LinkedList + HashMap: LinkedList其实是一个双向链表,我们可以通过get和put来设置最近请求key的位置,然后hashMap去存储数据 LinkedHashMap:LinkedHashMap是继承自HashMap,只不过Map中的Node节点改为了双向节点,双向节点可以维护添加的顺序,在LinkedHashMap的构造函数中有一个accessOrder, 当设置为true后,put和get会自动维护最近请求的位置到last。 LinkedList+HashMap代码实现 LRUCache接口: /** * @Description: * @Author: wangmeng * @Date: 2018/12/8-10:49 */ public class

HashMap简单实现原理的理解

时间秒杀一切 提交于 2019-12-01 23:31:08
正常情况下,Map的key和Value都可以用数组实现,一边ArrayList是key的keys,另一边是 ArrayList value的values。 通过key获取value的方式是这样的values.get(keys.indexOf(key)). 然而,数组的长度是有限的。不符合map可以无限放入元素的要求。所以要对这个数组进行特殊的要求。 那就是同一个数组的index可以存放多个值,只是这些相同index的hascode值不同,这样就能把他们却别开了。同时也就实现无限个元素要求了(用数组实现主要是性能的优势)。那么要确定value就要计算hascode和数组下标。 数组不直接执行value的值,而是用equals()方法线性的查找;正常情况下这样的查找方式也会慢,但是只要hascode方法设计的合理,每个插槽将会只有少量的value.这样查找也就快很多; import java.util.Map; public class MapEntry<K,V> implements Map.Entry<K, V> { private K key; private V value; public MapEntry(K key, V value) { this.key = key; this.value = value; } @Override public K getKey() {

使用 LinkedHashMap 实现 LRU 算法

我的未来我决定 提交于 2019-12-01 20:57:54
###LinkedHashMap 源码分析 public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> 上面是 LinkedHashMap 的继承结构。然后看下构造方法: private transient Entry<K,V> header;//内部链表的头 private final boolean accessOrder;//是否按照访问的顺序排序,默认是 false public LinkedHashMap(int initialCapacity, float loadFactor) { super(initialCapacity, loadFactor); accessOrder = false; } public LinkedHashMap(int initialCapacity) { super(initialCapacity); accessOrder = false; } public LinkedHashMap() { super(); accessOrder = false; } public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) { super

JAVA三种集合LIST、SET、MAP ——详解

被刻印的时光 ゝ 提交于 2019-12-01 17:15:00
1. 集合框架介绍 我们知道,计算机的优势在于处理大量的数据,在编程开发中,为处理大量的数据,必须具备相应的存储结构,之前学习的数组可以用来存储并处理大量类型相同的数据,但是通过上面的课后练习,会发现数组在应用中的限制:数组长度一旦确定,就无法更改;除非采用建立新数组,再将原数组内容拷贝过来;数组中只能存放指定类型的数据,操作不方便。在实际开发中,为了操作方便,JDK中提供了List集合。 List集合与数组的用途非常相似,都是用来存储大量数据的,不同处有两点: 1. 数组长度在使用前必须确定,一旦确定不能改变。而List集合长度可变,无需定义。 2. 数组中必须存放同一类型的数据,List集合中可以存放不同类型的数据。 List集合是Java集合框架中的一种,另外两种集合Set和Map会在下面介绍。List集合在JDK中被封装称为接口,针对List接口,有若干种实现,常用的有三个子类,即ArrayList、Vector和LinkedList。这三个类的功能与用法相同,但内部实现方式不同。下面以ArrayList为例介绍集合的常用操作,Vector和LinkedList的使用方法与ArrayList类似。 数组与List集合的常规操作类似,下面通过代码对比两者的用法: 代码演示:数组的基本操作 public class ArrayDemo { public static void

HashMap原理详解

浪尽此生 提交于 2019-12-01 11:48:50
HashMap死锁 在讲解HashMap之前我们先来看看一段代码: public class HashMapDeadLockTest { public static void main(String[] args) { MapResizer map= new MapResizer(); for (int i=0;i<30;i++){ new Thread (new MapResizer()).start(); } } } class MapResizer implements Runnable { public Map<Integer,Integer> map = new HashMap<Integer, Integer>(2); public AtomicInteger atomicInteger = new AtomicInteger(); public void run() { while(atomicInteger.get() < 100000){ map.put(atomicInteger.get(),atomicInteger.get()); atomicInteger.incrementAndGet(); } } } 运行这段代码,会发现代码一直处于运行状态,其实就是发生了死锁。(运行环境是jdk1.7)。具体怎么死锁呢,我们下面来具体看看:

JAVA面经整理

佐手、 提交于 2019-12-01 07:53:37
一、Java SE ❤1、Java基础 1、一个十进制的数在内存中是怎么存的? Java支持的数据类型有哪些?什么是自动拆装箱? int 和 Integer 有什么区别 ? 什么时候使用int 什么时候使用Integer? 2、==比较的是什么? 3、hashCode()和equals()方法有什么联系? 为什么重写equals还要重写hashcode? Object若不重写hashCode()的话,hashCode()如何计算出来的?若对一个类不重写,它的equals()方法是如何比较的? 4、一个十进制的数在内存中是怎么存的? 5、Java语言中float和double数据类型的精度是多少?它们在内存中是怎么存储的?和Decimal有什么区别? 6、为啥有时会出现4.0-3.6=0.40000001这种现象? 7、不借助四则运算如何实现加法 8、char可以存汉字吗,底层怎么存的 9、Java的字符集是什么 10、什么是值传递和引用传递? 11、数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList? 12、StringBuilder 和StringBuffer的区别 ? 底层实现上呢? 13、String为什么要设置成final类型?String是不变的吗?String为什么不可变?怎么实现不变的? 14、&和&&的区别?

JAVA面试宝典

我只是一个虾纸丫 提交于 2019-11-30 23:13:26
转载自: https://www.cnblogs.com/lyldaisy/p/10952180.html 1、 meta标签的作用是什么 2、 ReenTrantLock可重入锁(和synchronized的区别)总结 3、 Spring中的自动装配有哪些限制? 4、 什么是可变参数? 5、 什么是领域模型(domain model)?贫血模型(anaemic domain model)和充血模型(rich domain model)有什么区别? 6、 说说http,https协议 7、 "= ="和equals方法究竟有什么区别? 8、 &和&&的区别? 9、 .super.getClass()方法调用? 10、 10条SQL优化技巧 11、 10道经典java面试题_实习生必问! 12、 15个Java线程并发面试题和答案 13、 15个高级Java多线程面试题及回答 14、 2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据 15、 2018年java分布式相关最新面试题 16、 2018最新java技术面试题与答案 17、 23种经典设计模式都有哪些,如何分类? 18、 4个Spring常见面试题及答案解析 19、 58到家MySQL数据库开发规范 20、 9条改善Java性能的小建议 21、 9道常见的java笔试选择题 22、

夯实Java基础系列19:一文搞懂Java集合类框架,以及常见面试题

牧云@^-^@ 提交于 2019-11-30 19:04:41
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star哈 文章首发于我的个人博客: www.how2playlife.com 本文参考 https://www.cnblogs.com/chenssy/p/3495238.html 在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影! java中集合大家族的成员实在是太丰富了,有常用的ArrayList、HashMap、HashSet,也有不常用的Stack、Queue,有线程安全的Vector、HashTable,也有线程不安全的LinkedList、TreeMap等等! 上面的图展示了整个集合大家族的成员以及他们之间的关系。下面就上面的各个接口、基类做一些简单的介绍(主要介绍各个集合的特点。区别)。 下面几张图更清晰地介绍了结合类接口间的关系: Collections和Collection。 Arrays和Collections。 Collection的子接口 map的实现类 Collection接口 Collection接口是最基本的集合接口,它不提供直接的实现,Java