hashmap

HashMap初始化容量过程

依然范特西╮ 提交于 2020-01-08 13:41:40
集合是Java开发日常开发中经常会使用到的,而作为一种典型的K-V结构的数据结构,HashMap对于Java开发者一定不陌生。在日常开发中,我们经常会像如下方式以下创建一个HashMap: Map<String, String> map = new HashMap<String, String>(); 但是,大家有没有想过,上面的代码中,我们并没有给HashMap指定容量,那么,这时候一个新创建的HashMap的默认容量是多少呢?为什么呢?本文就来分析下这个问题。 什么是容量 在Java中,保存数据有两种比较简单的数据结构:数组和链表。数组的特点是:寻址容易,插入和删除困难;而链表的特点是:寻址困难,插入和删除容易。HashMap就是将数组和链表组合在一起,发挥了两者的优势,我们可以将其理解为链表的数组。在HashMap中,有两个比较容易混淆的关键字段:size和capacity ,这其中capacity就是Map的容量,而size我们称之为Map中的元素个数。简单打个比方你就更容易理解了:HashMap就是一个“桶”,那么容量(capacity)就是这个桶当前最多可以装多少元素,而元素个数(size)表示这个桶已经装了多少元素。 如以下代码: Map<String, String> map = new HashMap<String, String>();map.put(

HashMap(JDK1.8)

北战南征 提交于 2020-01-08 12:13:51
1、HashMap存储的数据结构 数组+单向链表的储存方式 加载因子:0.75,当数组储存的数据量超过75%时进行扩容。数组初始化大小为16,16*0.75=12,使用到12的时候进行扩容(双倍扩容16–>32),扩容必须为2的n次幂,因为计算hash值的时候进行&运算时,要保证011111来进行。 单向链表转成红黑树,当链表中的数据大于8时转,当红黑树的节点少于6时变成单向链表。 二叉树有利于查找,左子树节点小于根节点。 实际源码中是使用&运算来得到0-15的值,因为&运算效率更高。 当然,为了防止运算的结果总是为一个值,在hsahCode运算时进行了高16位与低16位进行异或运算来使hash值尽可能不一样。 put操作 在jdk1.7没有红黑树这些优化。 来源: CSDN 作者: qq_37119960 链接: https://blog.csdn.net/qq_37119960/article/details/103885738

关于hashcode和equals方法说明

扶醉桌前 提交于 2020-01-08 11:11:31
一、前言 我们都知道,要比较两个对象是否相等时需要调用对象的equals()方法,即判断对象引用所指向的对象地址是否相等,对象地址相等时,那么与对象相关的对象句柄、对象头、对象实例数据、对象类型数据等也是完全一致的,所以我们可以通过比较对象的地址来判断是否相等。 二、Object源码理解 对象在不重写的情况下使用的是Object的equals方法和hashcode方法,从Object类的源码我们知道,默认的equals 判断的是两个对象的引用指向的是不是同一个对象;而hashcode也是根据对象地址生成一个整数数值; 另外我们可以看到Object的hashcode()方法的修饰符为native,表明该方法是否操作系统实现,java调用操作系统底层代码获取哈希值。 public class Object { public native int hashCode(); /** * Indicates whether some other object is "equal to" this one. * <p> * The {@code equals} method implements an equivalence relation * on non-null object references: * <ul> * <li>It is <i>reflexive</i>: for any

HashMap实现原理JDK1.8

爱⌒轻易说出口 提交于 2020-01-08 10:55:24
在JDK1.6,JDK1.7中,HashMap采用位桶+链表实现,即使用链表处理冲突, 同一hash值的链表都存储在一个链表里。但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。 而JDK1.8中,HashMap采用位桶+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树 ,这样大大减少了查找时间。 简单说下HashMap的实现原理: 首先有一个每个元素都是链表(可能表述不准确)的数组,当添加一个元素(key-value)时,就首先计算元素key的hash值,以此确定插入数组中的位置,但是可能存在同一hash值的元素已经被放在数组同一位置了,这时就添加到同一hash值的元素的后面,他们在数组的同一位置,但是形成了链表,同一各链表上的Hash值是相同的,所以说数组存放的是链表。而当链表长度太长时,链表就转换为红黑树,这样大大提高了查找的效率。 当链表数组的容量超过初始容量的0.75时,再散列将链表数组扩大2倍,把原链表数组的搬移到新的数组中 即HashMap的原理图是: 一,JDK1.8中的涉及到的 数据结构 1,位桶数组 transient Node<k,v>[] table; //存储(位桶)的数组</k,v> 2,数组元素Node<K,V>实现了Entry接口 1 //Node是单向链表,它实现了Map.Entry接口 2

知识点集锦

江枫思渺然 提交于 2020-01-08 06:44:16
1.TextUtils.isEmpty Returns true if the string is null or 0-length. 2.FileUtils.deleteDir(file) Deletes all files and subdirectories under "dir". 3. HashMap不支持线程的同步 Hashmap 是一个最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。 HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。 Hashtable 同步 Hashtable与 HashMap类似,它继承自Dictionary类,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。 4 判断是否为数字 public static boolean isNumeric(String str) {

你的第一个人脸识别demo

落花浮王杯 提交于 2020-01-08 04:21:59
1、成为开发者 百度ai官网地址: http://ai.baidu.com/ STEP1 :点击百度AI开放平台导航右侧的 控制台 ,点击需要使用的AI服务项,使用百度账号登录。如还未持有百度账户,可以点击此处 注册百度账户 。 STEP2 :首次使用,登录后将会进入开发者认证页面,请填写相关信息完成开发者认证。注:(如您之前已经是百度云用户或百度开发者中心用户,此步可略过。) STEP3 :进入具体AI服务项的控制面板(如文字识别、人脸识别),进行相关业务操作。 2. 创建应用 创建好账号后,在正式调用AI能力之前,需要您创建一下应用,这个是调用服务的基础能力单元,不可或缺哦。在百度云控制台,已默认为您免费开通百度语音、文字识别、人脸识别、自然语言处理、图像审核、知识图谱服务六项服务。您可以选择您需要的服务,进入对应服务的控制台中。进入某个服务的控制台后,您将首先见到此服务的控制台概览页(以人脸识别为例), 如下图所示,点击创建应用: 点击上图中的「创建应用」,即可进入应用创建界面,如下图所示: 点击创建就会生成一个应用,包含API Key和SecretKey,这两个字段是获取accessToken的依据,是调用api接口的必备字段: 3、获取签名 获取accessToken:通过调用接口:https://aip.baidubce.com/oauth/ 2.0/token?

JDK源码分析-HashMap

徘徊边缘 提交于 2020-01-07 14:08:55
HashMap包含的KV键值对的数量,也就是我们通常调用Map.size()方法的返回值 1 2 3 public int size() { return size; } 1.1.2 modCount HashMap的结构被修改的次数(包括KV映射数量和内部结构rehash次数),用于判断迭代器梳理中不一致的快速失败。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 abstract class HashIterator { ... final Node<K,V> nextNode() { Node<K,V>[] t; Node<K,V> e = next; if (modCount != expectedModCount) throw new ConcurrentModificationException(); if (e == null) throw new NoSuchElementException(); if ((next = (current = e).next) == null && (t = table) != null) { do {} while (index < t.length && (next = t[index++]) == null); } return e; } ... } 1.1.3 threshold

hashMap记录

为君一笑 提交于 2020-01-07 13:08:58
继承了abstractMap, 实现了map、cloneable、serializable接口 初始参数 默认初始化容量16 最大容量1<<30(约10亿) 默认负载因子0.75 阈值为容量*负载因子 结构被修改次数modCount(修改val不算) 构造函数 hashMap(初始容量,负载因子) hashMap(初始容量):加上默认负载因子 hashMap(): 默认初始容量,默认负载因子 hashMap(Map): 新建一个hashMap, 容量为(传入的map的容量/负载因子 + 1)和默认容量的最大值,并用map的元素填充新hashMap 方法 hash(h) :静态,默认访问权限。 这个有点儿复杂,只是记下 h ^= (h >>> 20) ^ (h >>> 12);return h ^ (h >>> 7) ^ (h >>> 4); indexFor(h, length) : 静态,默认访问权限。 h&(length-1) 这里可以看出容量选择2的幂的原因了:lenght-1之后二进制所有位都是1(除最高位以上),进而有快速屏蔽h高位的效果 get(key) : 对于key为null,直接查找table数组的第一位(下标为0);非null的键,先hash出在table数组中的下标,再检索Entry链表 put(key, value) : 对于key为null

returning the string associated with the year and rank

巧了我就是萌 提交于 2020-01-07 11:57:02
问题 So basically I have a map that looks like this HashMap<Integer, HashMap<String, Integer>> girls = new HashMap<Integer, HashMap<**String**, Integer>>();' and I want to return the bolded string and this is my method so far public String getGirlName(int year, int rank) { //year refers to Key //rank refers to other integer in value map if (girls.containsKey(year) && girls.get(year).containsKey(rank)){ //shouldn't this return the name return girls.get(year).get(rank); //error here where it says I

Java容器的常见问题

为君一笑 提交于 2020-01-07 09:24:06
记录Java容器中的常见概念和原理 参考: https://github.com/wangzhiwubigdata/God-Of-BigData#%E4%B8%89Java%E5%B9%B6%E5%8F%91%E5%AE%B9%E5%99%A8 https://blog.csdn.net/justloveyou_/article/details/78653929 基础容器 ArrayList(动态数组)、LinkedList(带头结点的双向链表) ArrayList public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable 默认初始容量为 10; 扩容机制:添加元素前,先检查是否需要扩容,一般扩为源数组的 1.5 倍 + 1; 边界检查(即检查 ArrayList 的 Size):涉及到 index 的操作; 调整数组容量(减少容量):将底层数组的容量调整为当前列表保存的实际元素的大小; 在查找给定元素索引值等的方法中,源码都将该元素的值分为null和不为null两种情况处理; LinkedList LinkedList 不但实现了List接口,还实现了Dequeue接口。因此