hashmap

Java 集合

ぐ巨炮叔叔 提交于 2020-03-14 08:20:20
所有集合类都位于java.util包下。集合中只能保存对象(保存对象的引用变量)。当我们把一个对象放入集合中后,系统会把所有集合元素都当成Object类的实例进行处理。 Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些接口或实现类。 Set和List接口是Collection接口派生的两个子接口,Queue是Java提供的队列实现,类似于List。 Map实现类用于保存具有映射关系的数据(key-value)。 Set、List和Map可以看做集合的三大类。 List集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问。 Set集合是无序集合,集合中的元素不可以重复,访问集合中的元素只能根据元素本身来访问(也是不能集合里元素不允许重复的原因)。 Map集合中保存Key-value对形式的元素,访问时只能根据每项元素的key来访问其value。 接口 实现 历史集合类 Set HashSet TreeSet List ArrayList Vector LinkedList Stack Map HashMap Hashtable TreeMap Properties Collection Collection接口支持如添加和除去等基本操作。设法除去一个元素时

源码分析系列:2. HashMap

北慕城南 提交于 2020-03-13 23:57:20
package java.util; import java.io.IOException; import java.io.InvalidObjectException; import java.io.Serializable; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.function.BiConsumer; import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.function.Function; import sun.misc.SharedSecrets; /** * Hash table based implementation of the <tt>Map</tt> interface. This * implementation provides all of the optional map operations, and permits * <tt>null</tt> values and the <tt>null</tt> key. (The <tt>HashMap</tt> * class is

源码分析系列:1. HashSet

血红的双手。 提交于 2020-03-13 23:44:54
package java.util; import java.io.InvalidObjectException; import sun.misc.SharedSecrets; public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable { static final long serialVersionUID = -5024744406713321676L; private transient HashMap<E,Object> map; // Dummy value to associate with an Object in the backing Map private static final Object PRESENT = new Object(); public HashSet() { map = new HashMap<>(); } public HashSet(Collection<? extends E> c) { map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll(c); } public HashSet(int

从数组到HashMap之算法解释

旧巷老猫 提交于 2020-03-13 19:42:48
作者: Xcafe 编辑日期:20161228 博客: https://my.oschina.net/xcafe 一 数组是什么?   忘了在哪本书里曾看到过类似这样的一句话“所有的数据结构都是数组的演化”,想想其实是有道理的,因为计算机的内存其实就是线性的存储空间。   Java示例代码:int[] array = new int[5]   忽略对象头信息和数组长度信息,JVM执行时会在堆中分配20个字节的内存空间,看起来就是这样的:      这样的数据结构可以很方便地通过数组下标存取数据,但在查找时需要遍历数组,平均时间复杂度为O(n/2)。   当数据量很大或者查找操作频繁的时候,这样的遍历操作几乎是不可接受的。那么,如何才能够在更短的时间内快速找到数据呢? 二 二分查找   假如数组内的元素是已经排序的,那么很自然的方式就是使用二分查找。   譬如有一个整形数组的长度为1000,数组内的整数从小到大排列,如果我想要知道6000是否在此数组中。那么我可以先查看array[500]的数字是否为6000,array[500]的数字比6000小,那么就查看array[750]位置的数字……依次类推,那么最多经过10次,就可以确定结果。   此算法的时间复杂度为O(logN)。   然而,大部分情况下数组元素都是无序的,而排序所需要的时间复杂度O(NlogN

HashMap实现原理解读

帅比萌擦擦* 提交于 2020-03-13 09:50:50
HashMap是Java开发当中使用得非常多的一种数据结构,因为其可以快速的定位到需要查找到数据,其最快的速度可以达到O(1),最差的时候也可以达到O(n)。本文以Java8中的HashMap做为分析原型,因为不同的JDK版本中的HashMap,可能存在着底层实现上的不一样。 HashMap是通过数组存储所有的数据,每个元素所存放数组的下标,是根据该存储元素的key的Hash值与该数组的长度减去1做与运算,如下所示: index = (length_of_array - 1) & hash_of_the_key; 数组中存放元素的数据结构使用了Node和TreeNode两种数据结构,在单个Hash值对应的存储元素小于8个时,默认值为Node的单向链表形式存储,当单个Hash值存储的元素大于8个时,其会使用TreeNode的数据结构存储。 因为在单个Hash值对应的元素小于等于8个时,其查询时间最差为O(8),但是当单个Hash值对应的元素大于8个时,再通过Node的单向链表的方式进行查询,速度上就会变得更慢了;这个时候HashMap就会将Node的普通节点转为TreeNode(红黑树)进行存储,这是由于TreeNode占用的空间大小约为常规节点的两倍,但是其查询速度可以得到保证,这个是通过空间换时间了。当TreeNode中包括的元素变得比较少时,为了存储空间的占用

HashMap的存储结构及原理

本小妞迷上赌 提交于 2020-03-13 09:22:55
1、HashMap的数据结构(HashMap通过hashcode对其内容进行高速查找,是无序的) 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端。 数组 :数组的存储区是连续的,占用内存严重,故空间复杂度非常大。但数组的二分查找时间度小;数组的特点:寻址easy,插入和 删除困难。 链表 :链表的储存区离散。占用内存比較宽松。故空间复杂度非常小,但时间复杂度大;链表的特点:寻址困难,插入和删除easy。 哈希表 HashMap 是由数组+链表组成。寻址easy,插入和删除easy。( 存储单元数组Entry[],数组里面包括链表 ) HashMap 事实上也是由一个线性的数组实现的。 所以能够理解为其存储数据的容器就是一个线性容器; HashMap 里面有一个内部静态类Entry,其重要的属性有key,value,next,从属性key,value 就能够非常明显的看出来 Entry就是 HashMap键值对实现的一个基础bean;也就是说HashMap的基础就是一个线性数组,这个数组就是Entry[]。Map里面的内容都保存 在Entry[]中; /** * The table, resized as necessary. Length MUST Always be a power of two. */ transient Entry[] table; 2

Java HashMap实现原理分析

末鹿安然 提交于 2020-03-13 09:20:18
参考链接:https://www.cnblogs.com/xiarongjin/p/8310011.html 1. HashMap的数据结构 数据结构 中有数组和链表来实现对数据的存储,但这两者基本上是两个极端。 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大。但数组的二分查找时间复杂度小,为O(1);数组的特点是:寻址容易,插入和删除困难; 链表 链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N)。 链表 的特点是:寻址困难,插入和删除容易。 哈希表 那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表。哈希表((Hash table)既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便。   哈希表有多种不同的实现方法,我接下来解释的是最常用的一种方法—— 拉链法,我们可以理解为“ 链表的数组 ” ,如图:   从上图我们可以发现哈希表是由 数组+链表 组成的,一个长度为16的数组中,每个元素存储的是一个链表的头结点。那么这些元素是按照什么样的规则存储到数组中呢。一般情况是通过hash(key)%len获得,也就是元素的key的哈希值对数组长度取模得到。比如上述哈希表中,12%16=12,28%16=12,108%16=12,140%16=12。所以12、28

HashMap是如何实现快速存取的

隐身守侯 提交于 2020-03-13 09:04:52
一、存储实现:put(key,vlaue) 首先我们先看源码: // 将“key-value”添加到HashMap中 public V put( K key, V value) { // 若“key为null”,则将该键值对添加到table[0]中。 if (key == null ) return putForNullKey(value); // 若“key不为null”,则计算该key的哈希值,然后将其添加到该哈希值对应的链表中。 int hash = hash(key.hashCode()); // 计算key hash值在table数组中的位置 ------------ (1) int i = indexFor(hash, table.length); // 迭代e,从i处开始,找到key保存的位置 ------------ (2) for (Entry<K,V> e = table[i]; e != null ; e = e.next) { Object k; // 若“该key”对应的键值对已经存在,则用新的value取代旧的value。然后退出! if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; e

hashmap实现原理

早过忘川 提交于 2020-03-13 08:54:20
hashmap就是一个链表散列,上边是table 下边是链表,可以理解为数组链表 键值对都可以为null 默认的hashmap大小为16,实际可以存储的只有16*0.72个, 一旦超过这个值就会进行hashmap扩容,扩容的方式是size*2,即按照2次方进行自动扩容,扩容时会进行resize,重新进行放置 高并发时不支持,会造成死循环,建议使用currenthashmap 来源: https://www.cnblogs.com/xww115/p/11158545.html

Sort a named list in R

冷暖自知 提交于 2020-03-13 06:00:42
问题 I have a named list of term frequencies, > list $`in the` [1] 67504 $`to the` [1] 36666 $`of the` [1] 79665 $`on the` [1] 31261 $`to be` [1] 25862 $`for the` [1] 28332 I want to sort them into descending order according to the frequencies. How to do this? I tried sort, sort.list, order but had errors saying they don't accept this type of list. 回答1: You can try by unlist and then use order lst[order(unlist(lst),decreasing=TRUE)] # $`4` #[1] 9 #$`3` #[1] 7 #$`1` #[1] 5 #$`2` #[1] 4 #$`5` #[1] 2