hashmap

kotlin, how to put HashMap in Parcelable

一笑奈何 提交于 2020-02-28 19:01:21
问题 In a class who implements Parcelable it has a HashMap member. Saw Parcelable has public final void readMap(Map outVal, ClassLoader loader) , but could not find a sample to use it. If do it by flatten the map and write/read one by one accordingly, how to extract from the parcel in the constructor? (got error to build the map from the parcelable, cannot access buildTheMap() before constructor is called ) class CachedData(val type: Int, val name: String, val details: HashMap<String, String) :

源码分析HashMap的几个问题(JDK1.7)

大城市里の小女人 提交于 2020-02-28 15:54:25
如何存储数据 (put、get) put数据 public V put(K key, V value) { if (table == EMPTY_TABLE) { inflateTable(threshold); } if (key == null) return putForNullKey(value); //计算key的hash值 int hash = hash(key); //根据hash和数组的长度计算索引,即数组存放的位置 int i = indexFor(hash, table.length); for (Entry<K,V> e = table[i]; e != null; e = e.next) { Object k; //如果值存在,则新值替换老值,并返回老值 if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; //将算出的key的hash值,key,value ,以及索引存放在entry对象中,并加入table数组中 addEntry(hash, key, value, i); return null;

HashMap 如何解决hash冲突

落爺英雄遲暮 提交于 2020-02-28 13:36:02
在Java编程语言中,最基本的结构就是两种,一种是数组,一种是模拟指针(引用),所有的数据结构都可以用这两个基本结构构造,HashMap也一样。 当程序试图将多个 key-value 放入 HashMap 中时,以如下代码片段为例: HashMap<String,Object> m=new HashMap<String,Object>(); m.put("a", "rrr1"); m.put("b", "tt9"); m.put("c", "tt8"); m.put("d", "g7"); m.put("e", "d6"); m.put("f", "d4"); m.put("g", "d4"); m.put("h", "d3"); m.put("i", "d2"); m.put("j", "d1"); m.put("k", "1"); m.put("o", "2"); m.put("p", "3"); m.put("q", "4"); m.put("r", "5"); m.put("s", "6"); m.put("t", "7"); m.put("u", "8"); m.put("v", "9"); HashMap 采用一种所谓的“Hash 算法”来决定每个元素的存储位置。 当 程序执行 map.put(String,Obect)方法 时,系统将调用String的

java HashMap、HashTable、ConcurrentHashMap区别

一笑奈何 提交于 2020-02-28 12:22:39
HashTable 底层数组+链表实现,无论key还是value都 不能为null ,线程 安全 ,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化 初始size为 11 ,扩容:newsize = olesize*2+1 计算index的方法:index = (hash & 0x7FFFFFFF) % tab.length Hashtable的enumerator迭代器不是fail-fast HashMap 底层数组+链表实现,可 以存储null键和null值 ,线程 不安全 初始size为 16 ,扩容:newsize = oldsize*2,size一定为2的n次幂 扩容针对整个Map,每次扩容时,原来数组中的元素依次重新计算存放位置,并重新插入 当Map中元素总数超过Entry数组的75%,触发扩容操作,为了减少链表长度,元素分配更均匀 HashMap的迭代器(Iterator)是fail-fast迭代器 在HashMap中,null可以作为键,这样的键只有一个,但可以有一个或多个键所对应的值为null。 当get()方法返回null值时,即可以表示HashMap中没有该key,也可以表示该key所对应的value为null 。因此,在HashMap中不能由get(

hashMap与concurrentHashMap

杀马特。学长 韩版系。学妹 提交于 2020-02-28 12:22:30
一 功能简介 hashMap与concurrentHashMap 都属于集合,用于存储键值对数据,它两最明显的区别是,hashMap是非线程安全的,concurrentHashMap是线程安全的, concunrrentHashMap还有另外的称呼,如 并发容器 概述 HashMap jdk 1.7 实现方式:底层 数组+链表 jdk 1.8 实现方式:底层 数组+链表+红黑树 初始大小:16 负载因子:0.75 扩容:newSize = oldSize*2; map中元素总数超过Entry数组的75%,触发扩容操作 存放键值对要求:key 和 value 都允许为null,这种key只能有1个 线程安全性:不安全 父类:AbstractMap ConcurrentHashMap jdk 1.7 实现方式:底层 segment数组 + hashEntry数组+链表 segment 数组初始化:在申明 ConcurrentHashMap对象的时候 jdk 1.8 实现方式:底层 node数组+链表+红黑树 node数组初始化:put()第一个元素的时候 默认初始大小 16 负载因子:0.75 线程安全 父类 AbstractMap 二 实现逻辑 2.1 hashMap的内部实现逻辑 JDK1.7 hashmap 里面是一个数组,数组中每个元素是一个Entry类型的实例

HashMap?

…衆ロ難τιáo~ 提交于 2020-02-27 19:08:42
HashMap数据结构是什么? JDK1.7 HashMap由数组+链表组成的,JDK1.8 HashMap由数组+链表+红黑树组成的 数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。 =============================================================================== key-value是通过什么方式存储进去的? key使用set集合来存储的,value使用collection来存储的。 =============================================================================== 解释hashcode、取余、去重等操作? 计算hashcode的值: //这是一个神奇的函数,用了很多的异或,移位等运算

java面向对象集合篇(5)Map详解

喜夏-厌秋 提交于 2020-02-27 15:20:04
一. Map 1.入门+常见方法 HashMap 无序,键不重复 Map集合叫做双列集合,每个元素都由“键”、“值”两部分组成 HashMap 中一个元素 就是一个 键值对 该集合记录的是 键值对 对应关系, 通过键 可以找到对应的值。比如梁山好汉的绰号与该人的对应。 举例结合使用 : /* * HashMap入门 * 键 值 * key value * k v * * 存放数据: * put(key,value) 向集合中添加一个键值对 * 相当于ArrayList add * 键不重复。 * 如果键重复,新值覆盖旧值 * 返回值:如果该键是第一次添加,返回null * 如果改键是第N次添加,返回被覆盖的旧值 * */ public static void main(String[] args) { //1、创建HashMap对象 HashMap<String, String> map1 = new HashMap<String,String>(); map1.put( "黑旋风" , "小杨" ); map1.put( "九纹龙" , "小黄" ); String p1 = map1.put( "花和尚" , "小花" ); //null String p2 = map1.put( "花和尚" , "小刘" ); //小花 System. out .println(p1+ "-

hashmap的扩容方式为什么是2的n次方?

。_饼干妹妹 提交于 2020-02-27 12:07:24
HashMap的初始容量和扩容都是以2的次方来进行的,那么length-1换算成二进制的话肯定所有位都为1,就比如2的3次方为8,length-1的二进制表示就是111, 而按位与计算的原则是两位同时为“1”,结果才为“1”,否则为“0”。所以h& (length-1)运算从数值上来讲其实等价于对length取模,也就是h%length。 如果不满足前提条件“HashMap的初始容量和扩容都是以2的次方来进行的”,会发生什么问题呢? 假设当前table的length是15,二进制表示为1111,那么length-1就是1110,此时有两个hash值为8和9的key需要计算索引值,计算过程如下: 8的二进制表示:1000 8&(length-1)= 1000 & 1110 = 1000,索引值即为8; 9的二进制表示:1001 9&(length-1)= 1001 & 1110 = 1000,索引值也为8; 这样一来就产生了相同的索引值,也就是说两个hash值为8和9的key会定位到数组中的同一个位置上形成链表,这就产生了碰撞。 而查询的时候需要遍历这个链表,这样就降低了查询的效率。同时,我们也可以发现,当数组长度为15的时候,hash值会与length-1(1110)进行按位与,那么最后一位永远是0,而0001,0011,0101,1001,1011,0111

Java高频面试题

谁说胖子不能爱 提交于 2020-02-27 10:20:35
前言 疫情确诊的人数每天都在增加,离去的人也在增多,这个世界上有很多事我们无能为力也无从选择,日升日落,白昼黑夜,我们能看见白昼中的光芒,我们也能看见黑暗里的流氓。暮色四合,龌龊八开。鲜花还是塑料花,香或臭,当潮水散去,现在即历史,而历史通常是由后人说的。 所以还是上次跟乡亲们说的,我们不要传播未经证实或者不该传播的消息,舆论的力量是我们无法估计的,有些也是我们无法承担的,所以乡亲们也要重视起来,点到即止。无法控制别人,但可以做好自己,帮不了别人,但可以不祸害别人。 我不是个喜欢蹭热度的人,上面那段话乡亲们看看就好,现阶段最重要的就是老老实实待在家里,不聚集,也尽量不出门,自己和家人都要做好安全防护,老百姓经历了太多风风雨雨,相信这次一定也会安然无恙的渡过此劫。那待在家里的这段时间,如果能远程办公的,就做好公司交代的事,无法办公的乡亲们也不要停止学习,因为疫情过去之后,一定会有巨大的变动或者机会来临,而到那时,你准备好了吗? 这几天一直在想,码之初能做点什么?最终决定在这个期间就推出一个面试系列,都是经过我精心整理的,希望能给乡亲们一点帮助。下面进入正题。 高频面试题 1、说说对象的四中引用? 1) 强引用 只要引用存在,垃圾回收器永远不会回收。 Object obj = new Object(); User user=new User(); 可直接通过obj取得对应的对象 如

Java~HashMap的遍历

 ̄綄美尐妖づ 提交于 2020-02-27 02:12:38
package org.nico.ratel.landlords.helper.TestMap; import java.util.HashMap; import java.util.Map; class Room { int room_id; public Room(int room_id) { this.room_id = room_id; } @Override public String toString() { return "Room{" + "room_id=" + room_id + '}'; } } public class Main { public static void main(String[] args) { Map<Integer, Room> m = new HashMap<>(); m.put(1, new Room(11)); m.put(2, new Room(22)); for (Integer key : m.keySet()) { Room r = m.get(key); System.out.println(r); } System.out.println("删除后---"); m.remove(1); // 遍历这个的key和m存储的key类型一致 for (Integer key : m.keySet()) { Room r = m