hashmap

hashMap关键知识点

☆樱花仙子☆ 提交于 2020-02-06 20:13:10
1、数据结构 jdk1.7是数组加链表,jdk1.8是数组加链表加红黑树(链表太长了查询也慢,所以链表长度超过8时就使用红黑树咯) 2、hashMap的初始化大小 1)不给长度时,默认初始化为16,创建map时尽量给个长度,防止不断扩容影响效率。 2)大小为2的n次幂时,散列得比较均匀,那么查询就比较快 3、hashMap的put原理 1)把key值通过hash函数(hashcode与map长度减一的二进制做与运算,这样得出0到长度减一的下标)计算一个位置index 例如: 初始化长度为8 hashcode为11001 那么下标就为0 0111&11001=0 0001 那么下标就为1 初始化长度为8 hashcode为11111 那么下标就为0 0111&11111=0 0111 那么下标就为7 2)检测index所在位置是否有值,有值得话就比较key值是否相等, 不等的话直接把值接在所在对象的链表的后面,相等的话就覆盖原有的值 4、hashMap的扩容原理 1)当map中的元素个数等于map长度乘以加载因子时,就需要扩容了;扩容到原来长度的两倍 2)扩容使用的是头插法,扩容之后链表的顺序为倒序,这也是导致多线程扩容时出现环路导致线程不安全的原因 5、hashMap的get原理 1)把key值通过hash函数计算一个位置index 6、hashMap的加载因子 1

Leet Code 3.无重复字符的最长子串

梦想与她 提交于 2020-02-06 19:51:33
给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。 题解 提交代码 public static int lengthOfLongestSubstring(String s) { int n = s.length(), ans = 0; Map<Character, Integer> map = new HashMap<>(); for(int j = 0, i = 0; j < n; j++){ if (map.containsKey(s.charAt(j))) { i = Math.max(i, map.get(s.charAt(j))); } ans = Math.max( j - i + 1 , ans); map.put(s.charAt(j), j + 1); } return ans; } 提交代码的思路:以一个滑动窗口来判断最长子串,用HashMap判断是否子串有重复字符,若有,则改变左窗口。以O(n)的时间复杂度和O(n)的空间复杂度得出结果。 其中HashMap为<Character,Integer> 来源: https://www.cnblogs.com/chenshaowei/p/12269976.html

集合套集合

我们两清 提交于 2020-02-06 18:25:37
import java.util.*; public class Practice_1 { public static <K, V> void main(String[] args) { HashMap<Integer,String> hm = new HashMap<Integer,String>(); hm.put(101,"java001"); hm.put(102,"java002"); hm.put(103,"java003"); hm.put(104,"java004"); HashMap<Integer,String> hh = new HashMap<Integer,String>(); hh.put(101,"python001"); hh.put(102,"python002"); hh.put(103,"python003"); hh.put(104,"python004"); HashMap<String,HashMap<Integer,String>> qq = new HashMap<String,HashMap<Integer,String>>(); qq.put("gaoxiaoban",hm); qq.put("shaonianban",hh); Set<String> keySet = qq.keySet(); Iterator<String>

HashMap源码分析

一个人想着一个人 提交于 2020-02-06 17:12:08
概述 HashMap实现了Map<K, V>接口,通过键-值(key-value)的方式存取数据。内部的数据结构是数组+链表(或者Tree),插入时通过key的hash值,映射((n - 1) & hash,其中n为数组的长度)到数组中的位置,如果hash值重复,则在链表的末端插入(当一个链表中的数据大于等于8个时,就将链表转变为Tree),而当数组达到一定值时,会resize,重新创建一个数组,大小是之前的两倍;取出时,也是通过key的hash值,映射到数组的位置,如果刚好是第一个,则返回,否则一直查找到key相等的value并返回,如果还是没找到则分会null。 本文的目标是带着学习的态度,查看HashMap的源码,从put,get,resize三个方法分析它的内部实现。 HashMap数据结构 HashMap继承自AbstractMap<K,V>,实现了Map<K, V>接口(AbstractMap<K,V>也实现了这个接口,为什么没有冲突呢?): Map接口有一个Entry接口,HashMap中内部类Node实现了Entry接口,数据就存放在: Node < K , V > [ ] table ; HashMap内部定义了几个重要参数: // 加载因子默认是0.75,取值越小,hash冲突概率越低,插入和查找速度愈快,但是占用的空间更多 final float

save data to SQLite from json object using Hashmap in Android

大憨熊 提交于 2020-02-06 07:59:33
问题 Hello Everyone I am newbie in Android, I need to parse json object and display it in listView and at the same time to save those data in SQLite, but whenever I run the project exception is caught ... the database is created without any data or value in it. here is the code by which I am trying: Bundle bundle = getIntent().getExtras(); String rfiItems = bundle.getString("allData"); final ArrayList<HashMap<String, String>> mylist4 = new ArrayList<HashMap<String, String>>(); try{ JSONObject jObj

save data to SQLite from json object using Hashmap in Android

会有一股神秘感。 提交于 2020-02-06 07:58:38
问题 Hello Everyone I am newbie in Android, I need to parse json object and display it in listView and at the same time to save those data in SQLite, but whenever I run the project exception is caught ... the database is created without any data or value in it. here is the code by which I am trying: Bundle bundle = getIntent().getExtras(); String rfiItems = bundle.getString("allData"); final ArrayList<HashMap<String, String>> mylist4 = new ArrayList<HashMap<String, String>>(); try{ JSONObject jObj

LinedHashMap

两盒软妹~` 提交于 2020-02-05 23:52:02
大多数情况下,只要不涉及线程安全问题,Map基本都可以使用HashMap,不过HashMap有一个问题,就是迭代HashMap的顺序并不是HashMap放置的顺序,也就是无序。HashMap的这一缺点往往会带来困扰,因为有些场景,我们期待一个有序的Map。 这个时候,LinkedHashMap就闪亮登场了,它虽然增加了时间和空间上的开销,但是通过维护一个运行于所有条目的双向链表,LinkedHashMap保证了元素迭代的顺序。该迭代顺序可以是插入顺序或者是访问顺序。 1. LinkedHashMap基本结构 LinkedHashMap可以认为是HashMap+LinkedList,即它既使用HashMap操作数据结构,又使用LinkedList维护插入元素的先后顺序。 LinkedHashMap是HashMap的子类,自然LinkedHashMap也就继承了HashMap中所有非private的方法。 相比HashMap,LinkedHashMap多实现了两个属性: /** * The head of the doubly linked list. * 双向链表的头节点 */ private transient Entry<K,V> header; /** * The iteration ordering method for this linked hash map: true

JDK8 HashMap源码 clone解析

我只是一个虾纸丫 提交于 2020-02-05 06:02:18
分析源码 Returns a shallow copy of this HashMap instance: the keys and values themselves are not cloned. 英文注释已经说了这个一个浅拷贝操作,但到底浅到什么程度呢,接下来本文将进行详细分析。 public Object clone ( ) { HashMap < K , V > result ; try { result = ( HashMap < K , V > ) super . clone ( ) ; //.的优先级高,之后再强转。这个result确实是新创建的 } catch ( CloneNotSupportedException e ) { // this shouldn't happen, since we are Cloneable throw new InternalError ( e ) ; } result . reinitialize ( ) ; result . putMapEntries ( this , false ) ; return result ; } super.clone() 这句会调用到AbstractMap的clone方法: protected Object clone ( ) throws CloneNotSupportedException

HashMap之java.util.ConcurrentModificationException问题原因及解决办法

两盒软妹~` 提交于 2020-02-05 06:00:21
Map<Warn,Object> map = new HashMap<>(); for(Entry<Warn,Object> entry : map.entrySet()){ ... ... map.remove(entry.getKey()); ... } 报错:java.util.ConcurrentModificationException异常。 后经查询,在进行迭代时,同时对其进行remove().操作会影响迭代。原因在于: 迭代器的modCount和expectedModCount的值不一致. 没有源码照片了。如果remove()后源码会判断值不一致,然后在hashMap中抛出java.util.ConcurrentModificationException异常. 这个问题需要了解一点:HashMap不是线程安全的,ConcurrentHashMap是线程安全的。 因此,解决这个问题就有一个了简单粗暴的方法,使用ConcurrentHashMap代替HashMap。亲测可用。 另外,还有一个方法,在修改HashMap的上下文进行加锁操作。但是效率太差或者占用内存太高。ConcurrentHashMap效率感觉快赶上不同步的速度。推荐。 List和Map等集合类都存在上述问题,还请注意 -------------------- 以下为补充内容。方便以后学习。为转载文章。

Map集合相关

前提是你 提交于 2020-02-05 02:38:14
F:\IdeaProjects\baisc-codeII\day04-code Map集合概述 Map集合是一个双列集合,一个集合包含两个值,Key和Value; key不能重复,一个key对应一个value; 常用的有HashMap集合和LinkedHashMap集合。 HashMap<K,V>:存储数据采用的是哈希表结构,元素存取顺序不一致。 LinkedHashMap<K,V>:是HashMap的子类,存储数据采用的是哈希表+链表,链表保证了元素存取数据顺序一致。 二者都重写了hashCode()和equals()方法,来保证key的唯一性,区别是有序和无序,本篇所有示例均为HashMap集合。 常用方法 put(key,value):如果key不重复,返回值V是null;如果重复,会使用新的value替换重复的value,并返回旧value; remove(key):如果key存在,返回被删除的value,如果不存在,返回null; get(key):如果key存在,返回对应的值,不存在返回null; containsKey(key):包含返回true,不包含返回false; Map集合遍历 主要有两种遍历方式 方式1:通过键找值的方式 1.使用map集合中的方法keySet(),把Map集合中所有的key取出来,存储到一个set集合中 2.遍历set集合,获取每一个键 3