hashmap

How to split an HashMap in Java

蹲街弑〆低调 提交于 2020-02-01 20:19:12
问题 I was wondering if it is possible to split a HashMap into smaller sub-maps. In my case I have a HashMap of 100 elements and I would like to create 2 (or more) smaller HashMaps from the original one, the first containing the Entries from 0 to 49, the second containing the Entries from 50 to 99. Map <Integer, Integer> bigMap = new HashMap <Integer, Integer>(); //should contains entries from 0 to 49 of 'bigMap' Map <Integer, Integer> smallMap1 = new HashMap <Integer, Integer>(); //should

Java提高篇——equals()与hashCode()方法详解

末鹿安然 提交于 2020-02-01 13:16:32
阅读目录 equals()方法详解 hashcode() 方法详解 Hashset、Hashmap、Hashtable与hashcode()和Equals()的密切关系 java.lang.Object类中有两个非常重要的方法: public boolean equals(Object obj) public int hashCode() Object类是类继承结构的基础,所以是每一个类的父类。所有的对象,包括数组,都实现了在Object类中定义的方法。 equals()方法详解 equals()方法是用来判断其他的对象是否和该对象相等. equals()方法在object类中定义如下: public boolean equals(Object obj) { return (this == obj); } 很明显是对两个对象的地址值进行的比较(即比较引用是否相同)。但是我们知道,String 、Math、Integer、Double等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法。 比如在String类中如下: public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) {

HashMap底层实现原理分析

浪尽此生 提交于 2020-02-01 10:11:41
HashMap底层实现JDK1.7&JDK1.8 Map结构 HashMap的底层实现原理 HashMap在JDK1.7中的实现 HashMap在JDK1.8中的实现 HashMap1.7与1.8中底层实现的不同 有关HashMap的面试题 Map结构 Map中的key是无序的、不能重复的,使用set可以存储所有的key; key所在的类要重写equals()和hashcode()方法 Map中的value是无序的、可以重复的,使用Collection可以存储所有的value; value所在的类要重写equals key和value组成了entry对象,该对象是无序的、不可重复的,可以使用set来存储 HashMap的底层实现原理 HashMap创建的流程示意图(以jdk1.7为例) 扩容问题 在添加数据的过程中,随着数据量的不断增加,就会涉及到扩容问题,默认的扩容方式:扩容为原来容量的两倍,并将原有的数据复制过来. HashMap在JDK1.7中的实现 //调用hashmap的有参构造 public HashMap ( int initialCapacity , float loadFactor ) { //初始化长度initialCapacity:16;加载因子loadFactor:0.75 if ( initialCapacity < 0 ) throw new

LinkedHashMap及其源码分析

孤者浪人 提交于 2020-02-01 01:01:44
以下内容基于jdk1.7.0_79源码; 什么是LinkedHashMap 继承自HashMap,一个有序的Map接口实现,这里的有序指的是元素可以按插入顺序或访问顺序排列; LinkedHashMap补充说明 与HashMap的异同:同样是基于散列表实现,区别是,LinkedHashMap内部多了一个双向循环链表的维护,该链表是有序的,可以按元素插入顺序或元素最近访问顺序(LRU)排列, 简单地说: LinkedHashMap=散列表+循环双向链表 LinkedHashMap的数组结构 用画图工具简单画了下散列表和循环双向链表,如下图,简单说明下: 第一张图是LinkedHashMap的全部数据结构,包含散列表和循环双向链表,由于循环双向链表线条太多了,不好画,简单的画了一个节点(黄色圈出来的)示意一下,注意左边的红色箭头引用为Entry节点对象的next引用(散列表中的单链表),绿色线条为Entry节点对象的before, after引用(循环双向链表的前后引用); 第二张图专门把循环双向链表抽取出来,直观一点,注意该循环双向链表的头部存放的是最久访问的节点或最先插入的节点,尾部为最近访问的或最近插入的节点,迭代器遍历方向是从链表的头部开始到链表尾部结束,在链表尾部有一个空的header节点,该节点不存放key-value内容,为LinkedHashMap类的成员属性

Java HashMap详解

久未见 提交于 2020-02-01 00:53:40
Java HashMap详解 什么是Map? 什么是HashMap? HashMap初始化 HashMap原理 HashMap扩容 HashMap面试题 什么是Map? 要理解hashMap,首先你要知道什么是map,map是用于存储键值对(<key,value>)的集合类。在java中map是一个接口,是和collection接口同一等级的集合根接口。 map的特点:1、key是无序、唯一的; 2、value是无序不唯一的。 什么是HashMap? HashMap是用哈希表(数组+单链表)+红黑树实现的map类(JDK1.8之前是数组+单链表,JDK1.8加入了红黑树)。 红黑树实际上就是一个二叉树,只是每个节点都被标记为黑色或者红色。 HashMap初始化 Map map = new HashMap(); HashMap默认初始大小为16。大小只能是2的n次方,若强行给初始大小为非2的n次方,HashMap会自动调整为2的n次方。 HashMap的最大容量为2的30次方,传入容量过大将被这个值替换: static final int MAXIMUM_CAPACITY = 1 << 30("<<"为左移运算符,1表示十进制中的“1”,30表示十进制数字1转化为二进制后向左移动30位。在数值上等同于2的30次幂) 详解:java中int类型的长度为32位,即2的31次方

集合知识汇总

。_饼干妹妹 提交于 2020-01-31 11:03:42
实际开发中,经常用到的 ArrayList、LinkedList、HashMap、LinkedHashMap 等集合类,其实涵盖了很多数据结构和算法,每个类可以说都是精华,今天和大家一起来梳理一下! 一、摘要 在 Java 中,集合大致可以分为两大体系,一个是 Collection,另一个是 Map,都位于java.util包下。 Collection :主要由 List、Set、Queue 接口组成,List 代表有序、重复的集合;其中 Set 代表无序、不可重复的集合;Java 5 又增加了 Queue 体系集合,代表队列集合。 Map:则代表具有映射关系的键值对集合。 很多书籍将 List、Set、Queue、Map 等能存放元素的接口体系,也归纳为容器,因为他们可以存放元素! 集合和容器,这两者只是在概念上定义不同,比如ArrayList是一个存放数组的对象,真正用起来并不会去关心这个东西到底是集合还是容器,把东西用好才是关键! java.util.Collection下的接口和继承类关系简易结构图: https://imgconvert.csdnimg.cn

Java List/HashSet/HashMap的排序

冷暖自知 提交于 2020-01-31 09:18:39
在对 Java 无序类集合,如List(ArrayList/LinkedList)、HashSet(TreeSet有序)、HashMap等排序时,Java中一个公共的类Collections,提供了对Java集合排序等很好的方法sort。 但是有一个要求是sort方法的参数为<List list> 或<List list, Comparator<? super T> c>,即排序对象要求必须是List类型。 sort 方法的参数必须为List 的原因是,只有List可以定义排序的方法,让List中的元素改变在构建List时原始的相对位置(初始构建时,元素相对位置即为元素初始加入顺序)。HashSet、HashMap 在构建时,初始加入的元素已经按照元素的hashCode()方法的定义排好序。所以这里所说的 HashSet 排序 和 HashMap 排序是指:将其中的元素导出到另一个集合中,对该载体集合排序。排序之后,原HashSet 和 HashMap 中元素顺序没有变。 故而对Java无序类集合的排序问题,基本思路就是:将HashSet 或 HashMap 中的元素取出放入 List 中,对List 用 Collections.sort() 方法排序,之后输出排序后List中的元素,即为对Set/Map 中元素排序后的结果。 注意HashSet、HashMap 中元素位置没有改变

JAVA基础——集合——HashMap

点点圈 提交于 2020-01-31 07:52:25
HashMap集合: 常用方法(JDK1.8): 从此映射中移除所有映射关系(元素): public void clear () 返回此 HashMap 实例的浅表副本:并不复制键和值本身: public Object clone () 如果此映射包含指定键的映射,则返回 true : public boolean containsKey (Object key) 如果此映射里有一个或多个键映射到指定值,则返回 true : public boolean containsValue (Object value) 可以理解为这个set就是你放入的所有<K,V>对的集合,因为HashMap要确保key值的唯一性,所以用set: public Set<Map.Entry<K,V>> entrySet () 根据键key从映射中取出对应的值value: public V get (Object key) 判断映射内容是否为空: public boolean isEmpty () { return size == 0; } 返回此映射中所有键key的set集合: public Set<K> keySet () 根据键向映射中存进值, 如果key存在,则覆盖之前的value,返回之前的value; 如果key不存在,存进此value,返回null: public V put (K key, V

How do I convert an array to a hash in Perl?

╄→гoц情女王★ 提交于 2020-01-31 06:59:13
问题 I have an array and tried to convert the array contents to a hash with keys and values. Index 0 is a key, index 1 is a value, index 2 is a key, index 3 is a value, etc. But it is not producing the expected result. The code is below: open (FILE, "message.xml") || die "Cannot open\n"; $var = <FILE>; while ($var ne "") { chomp ($var); @temp = split (/[\s\t]\s*/,$var); push(@array,@temp); $var = <FILE>; } $i = 0; $num = @array; while ($i < $num) { if (($array[$i] =~ /^\w+/i) || ($array[$i] =~ /\d

Java Hashmap:如何从价值中获取关键?

生来就可爱ヽ(ⅴ<●) 提交于 2020-01-30 16:12:34
如果我的值是 "foo" ,并且 ftw.containsValue("foo") 返回 true 的 HashMap <String> ftw ,如何获得相应的键? 我是否必须遍历哈希图? 最好的方法是什么? #1楼 import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Set; public class M{ public static void main(String[] args) { HashMap<String, List<String>> resultHashMap = new HashMap<String, List<String>>(); Set<String> newKeyList = resultHashMap.keySet(); for (Iterator<String> iterator = originalHashMap.keySet().iterator(); iterator.hasNext();) { String hashKey = (String) iterator.next(); if (!newKeyList.contains