hashmap

手写HashMap底层(源码)

╄→尐↘猪︶ㄣ 提交于 2019-12-16 05:15:51
底层结构: 在手写HashMap的时候,需要首先弄清楚HashMap底层结构实现原理。HashMap底层采用哈希表实现,其中哈希表相当于“数组+链表”的结构。其结构示意图如下: 采用哈希表实现HashMap的时候,需要首先弄清楚其存储流程。首先创建Entry节点的结构,并且创建指定长度的数组;其次根据哈希函数计算的哈希值确定节点在数组中的存储位置,最后判断数组指定位置是否已有其他节点,并在链表的尾部添加新的节点。其存储流程示意图如下: 源码: Entry类: package cn.csu.hashmap; public class Entry { private int hash; private Object key; private Object value; private Entry next; public Entry() { } public Entry(int hash, Object key, Object value, Entry next) { super(); this.hash = hash; this.key = key; this.value = value; this.next = next; } public int getHash() { return hash; } public void setHash(int hash) { this

HashMap,HashSet,HashTable的区别

这一生的挚爱 提交于 2019-12-16 03:33:49
什么是HashMap HashMap实现了Map接口,Map接口对键值对进行映射。Map中不允许重复的键。Map接口有两个基本的实现,HashMap和TreeMap。TreeMap保存了对象的排列次序,而HashMap则不能。HashMap允许键和值为null。HashMap是非synchronized的,但collection框架提供方法能保证HashMap synchronized,这样多个线程同时访问HashMap时,能保证只有一个线程更改Map。 public Object put(Object Key,Object value)方法用来将元素添加到map中。 什么是HashSet HashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有储存相等的对象。如果我们没有重写这两个方法,将会使用这个方法的默认实现。 public boolean add(Object o)方法用来在Set中添加元素,当元素值重复时则会立即返回false,如果成功添加的话会返回true。 什么是Hashtable 哈希表(Hashtable)又称为“散置”,Hashtable是会根据索引键的哈希程序代码组织成的索引键

HashMap你了解多少

橙三吉。 提交于 2019-12-16 00:03:18
HashMap几乎是面试必问的知识,对于HashMap面试是你真的能从容面对吗?相信如果你去面试知名互联网公司的时候,决对不会只是问问你HashMap的数据结构这么简单的问题。我收集了最近老大在面试过程中关于HashMap常问的几个问题: 1. 为什么HashMap是2的幂次方? new HashMap(14); HashMap是由数组+链表(1.8还有红黑树)来实现的,那么上面这行代码它执行后,创建的数组大小是多少呢? 追踪源码可以看到它会执行这样一个函数来返回数组大小的: static final int tableSizeFor(int cap) { int n = cap - 1; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1; } 图解: 第一次右移并且或运算,可以保证从左到右第一位1后面再多出来一个1 第二次右移并且或运算,可以保证从左到右再多出两个1 以此类推,因为java中int值是4个字节,32位的,所以最后移16位的时候,足以保证2^32这种情况的出现; 通过这个函数的运算,可以将我们传入的14运算得到16

list中含有map的排序问题

牧云@^-^@ 提交于 2019-12-15 22:42:34
Map的种类 在Java中,Map的主要作用是存储键值对。由于是根据键得到值,所以不允许键重复。它主要有如下几个类别: HashMap 最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。HashMap最多只允许一条记录的键为Null;允许多条记录的值为Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。Hashtable与HashMap类似,它继承自Dictionary类,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。 LinkedHashMap 保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关

80道最新java基础部分面试题(六)

大憨熊 提交于 2019-12-15 18:04:46
自己整理的面试题,希望可以帮到大家,需要更多资料的可以私信我哦,大家一起学习进步! 59、ArrayList和Vector的区别 答: 这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置索引号取出某个元素,,并且其中的数据是允许重复的,这是HashSet之类的集合的最大不同处,HashSet之类的集合不可以按索引号去检索其中的元素,也不允许有重复的元素(本来题目问的与hashset没有任何关系,但为了说清楚ArrayList与Vector的功能,我们使用对比方式,更有利于说明问题)。 接着才说ArrayList与Vector的区别,这主要包括两个方面:. (1)同步性: Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最好是使用Vector,因为不需要我们自己再去考虑和编写线程安全的代码。 备注:对于Vector&ArrayList、Hashtable&HashMap,要记住线程安全的问题,记住Vector与Hashtable是旧的

Redis常见问题和知识点汇总

白昼怎懂夜的黑 提交于 2019-12-15 14:41:35
Redis 相关的问题有很多需要注意,本文就大多数问题做了解答。 目录 1.什么是redis? 2.Reids的特点   3.使用redis有哪些好处?    4.redis相比memcached有哪些优势?    5.Memcache与Redis的区别都有哪些? 6.redis适用于的场景? 7、redis的缓存失效策略和主键失效机制 8.为什么redis需要把所有数据放到内存中?  9.Redis是单进程单线程的 10.redis的并发竞争问题如何解决? 11、redis常见性能问题和解决方案:    12.redis事物的了解CAS(check-and-set 操作实现乐观锁 )? 13.WATCH命令和基于CAS的乐观锁? 14.使用过Redis分布式锁么,它是什么回事? 15.假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来? 16.使用过Redis做异步队列么,你是怎么用的? 17.如果有大量的key需要设置同一时间过期,一般需要注意什么? 18.Redis如何做持久化的? 19.Pipeline有什么好处,为什么要用pipeline? 20.Redis的同步机制了解么? 21.是否使用过Redis集群,集群的原理是什么? 1.什么是redis?    Redis 是一个基于内存的高性能key-value数据库。

HashMap源码分析

☆樱花仙子☆ 提交于 2019-12-15 12:31:19
HashMap 文章目录 HashMap 基本属性 构造函数 无参构造 HashMap(int,float)型构造函数 HashMap(int)型构造函数 `HashMap(Map)型构造函数` HashMap常用方法 put方法 hash方法 putVal方法 寻找key对应的映射关系: treeifyBin方法 treeify方法 get方法 resize方法 hashmap的实现原理:首先有一个每个元素都是链表(可能表述不准确)的数组,当添加一个元素时,就首先计算元素key的hash值,以此确定插入数组中的位置,但是可能存在同一hash值的元素已经被放在数组同一位置了,这时就添加到同一hash值的元素的后面,他们在数组的同一位置,但是形成了链表,同一各链表上的Hash值是相同的,所以说数组存放的是链表。而当链表长度太长时,链表就转换为红黑树,这样大大提高了查找的效率。 当链表数组的容量超过初始容量的0.75时,再散列将链表数组扩大2倍,把原链表数组的搬移到新的数组中 当table中的元素足够多时,发生冲突的概率就会大大增加,冲突的增多会导致每个桶中的元素个数变多,这样的话会使得查找元素效率变得低下,当同一个桶中元素个数达到8时,桶中的元素结构将转换为红黑树。 基本属性 public class HashMap < K , V > extends AbstractMap < K

ConcurrentHashMap的实现原理(JDK1.7和JDK1.8)

☆樱花仙子☆ 提交于 2019-12-15 07:14:37
哈希表 1.介绍 哈希表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值。 哈希的思路很简单,如果所有的键都是整数,那么就可以使用一个简单的无序数组来实现:将键作为索引,值即为其对应的值,这样就可以快速访问任意键的值。这是对于简单的键的情况,我们将其扩展到可以处理更加复杂的类型的键。 2.链式哈希表 链式哈希表从根本上说是由一组链表构成。每个链表都可以看做是一个“桶”,我们将所有的元素通过散列的方式放到具体的不同的桶中。插入元素时,首先将其键传入一个哈希函数(该过程称为哈希键),函数通过散列的方式告知元素属于哪个“桶”,然后在相应的链表头插入元素。查找或删除元素时,用同们的方式先找到元素的“桶”,然后遍历相应的链表,直到发现我们想要的元素。因为每个“桶”都是一个链表,所以链式哈希表并不限制包含元素的个数。然而,如果表变得太大,它的性能将会降低。 3.应用场景 我们熟知的缓存技术(比如redis、memcached)的核心其实就是在内存中维护一张巨大的哈希表,还有大家熟知的HashMap、CurrentHashMap等的应用。 ConcurrentHashMap与HashMap等的区别 1.HashMap 我们知道HashMap是线程不安全的,在多线程环境下,使用Hashmap进行put操作会引起死循环

Java面试---HashSet 是如何保证不重复的

你离开我真会死。 提交于 2019-12-15 03:15:55
HashSet类实现了Set接口, 其底层其实是包装了一个HashMap去实现。HashSet采用HashCode算法来存取集合中的元素,因此具有比较好的读取和查找性能。 下面我们来看一下源码: 下面是HashSet的几个构造方法 可以看得出 HashSet的底层其实是HashMap存储的 通俗来说HashSet就是HashMap的马甲: // 默认构造函数 底层创建一个HashMap public HashSet() { // 调用HashMap的默认构造函数,创建map map = new HashMap<E,Object>(); } // 带集合的构造函数 public HashSet(Collection<? extends E> c) { // 创建map。 map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16)); // 将集合(c)中的全部元素添加到HashSet中 addAll(c); } // 指定HashSet初始容量和加载因子的构造函数 public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<E,Object>(initialCapacity, loadFactor); } //

hashCode与equals的区别与联系

旧街凉风 提交于 2019-12-14 23:22:19
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 一、equals方法的作用 1、 默认情况(没有覆盖equals方法)下equals方法都是调用Object类的equals方法,而Object的equals方法主要用于判断对象的内存地址引用是不是同一个地址(是不是同一个对象)。 2 、要是类中覆盖了equals方法,那么就要根据具体的代码来确定equals方法的作用了,覆盖后一般都是通过对象的内容是否相等来判断对象是否相等。 没有覆盖equals方法代码如下: [java] view plain copy //学生类 public class Student { private int age; private String name; public Student() { } public Student( int age, String name) { super (); this .age = age; this .name = name; } public int getAge() { return age; } public String getName() { return name; } public void setAge( int age) { this .age = age; } public void setName(String