hashmap

Java集合框架——Map

江枫思渺然 提交于 2020-03-17 08:09:30
Map hashMap:存放键值对的容器 ConcurrentHashMap(1.7) 1.8中ConcurrentHashMap SynchronizedMap&HashTable hashMap:存放键值对的容器 1、数据结构: 1.7:数组+链表 1.8:数组+链表+红黑树 (1.7Entry类;1.8Node类。本质一样) 内部包含了一个 Entry 类型的数组 table。Entry 存储着键值对,又存放了下一个Entry。所以Entry其实是一个链表。即数组中的每个位置被当成一个桶,一个桶存放一个链表。HashMap 使用拉链法来解决冲突,同一个链表中存放哈希值和散列桶取模运算结果相同的 Entry。 1.8较1.7引入了红黑树对hashMap数据结构进行优化; 引入原因:提高性能 当链表过长导致索引效率慢,利用红黑树快速增删改查优点,将时间复杂度由O(n)–>O(log(n)) 应用场景:链表长度 >8,转化为红黑树 2、主要使用API: 1.7与1.8基本相同 V get ( Object key ) ; // 获得指定键的值 V put ( K key , V value ) ; // 添加键值对 void putAll ( Map < ? extends K , ? extends V > m ) ; // 将指定Map中的键值对 复制到 此Map中 V

Java 集合

你。 提交于 2020-03-17 01:16:34
1、说说List,Set,Map三者的区别? List:有序、元素可重复 Set:元素不能重复 Map: 一个元素即一个键值对,key唯一标识一个键值对,key不能重复,元素可以重复,key、value均可以是任意类型。 2、Arraylist 与 LinkedList 区别? 1. 是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是都不保证线程安全; 2. 底层数据结构: Arraylist 底层使用数组; LinkedList 底层使用双向链表(JDK1.6之前为循环链表,JDK1.7取消了循环。注意双向链表和双向循环链表的区别,下面有介绍到!) 3. 插入和删除是否受元素位置的影响: ① ArrayList 采用数组存储,插入和删除元素的时间复杂度受元素位置的影响。 比如:执行 add(E e) 方法的时候, ArrayList 会默认在将指定的元素追加到此列表的末尾,这种情况时间复杂度就是O(1)。但是如果要在指定位置 i 插入和删除元素的话( add(int index, E element) )时间复杂度就为 O(n-i)。因为在进行上述操作的时候集合中第 i 和第 i 个元素之后的(n-i)个元素都要执行向后位/向前移一位的操作。 ② LinkedList 采用链表存储,所以对于 add(E e) 方法的插入

关于HashMap的一些知识点整理

只愿长相守 提交于 2020-03-17 01:11:17
本文来自网上各个知识点的整理 HashMap采用Entry数组(Java8叫Node)来存储key-value对,每一个键值对组成了一个Entry实体,Entry类实际上是一个单向的链表结构,它具有Next指针,可以连接下一个Entry实体,以此来解决Hash冲突的问题。 但链表的查询复杂度大,一但链表过长,查询的效率下降。 在Jdk1.8中HashMap的实现方式做了一些改变,数据结构的存储由数组+链表的方式,变化为数组+链表+红黑树的存储方式,当链表长度超过阈值(8)时,将链表转换为红黑树。在性能上进一步得到提升。但每次插入新的数据,都得维护红黑树的结构,复杂度为O(logn)。 链表:插入复杂度O(1),查找复杂度O(n) 红黑树:插入复杂度O(logn),查找复杂度O(logn) 但既然红黑树这么棒,那为什么HashMap为什么不直接就用红黑树呢? 因为树节点所占空间是普通节点的两倍,所以只有当节点足够多的时候,才会使用树节点。也就是说,节点少的时候,尽管时间复杂度上,红黑树比链表好一点,但是红黑树所占空间比较大,综合考虑,认为只能在节点太多的时候,红黑树占空间大这一劣势不太明显的时候,才会舍弃链表,使用红黑树。 那为什么链表长度为8时才会选择使用红黑树呢? 为了配合使用分布良好的HashCode,树节点很少使用。并且在理想状态下,受随机分布的HashCode影响

java集合类

天涯浪子 提交于 2020-03-16 20:10:55
Java集合类 1.简介: java集合类包含在java.util包下 集合类存放的是对象的引用,而非对象本身。 集合类型主要分为Set(集),List(列表),Map(映射)。 1.1 java集合类图 从上述类图,自己整理出主要内容是如下: 2.集合详解 2.1 HashSet HashSet是Set接口的一个子类 主要的特点是: 里面不能存放重复元素,元素的插入顺序与输出顺序不一致 采用散列的存储方法,所以没有顺序。 代码实例:HashSetTest package cn.swum; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.Set; public class HashSetTest { public static void main(String[] args) { Set set = new HashSet(); set.add("a"); set.add("b"); set.add("c"); set.add("d"); set.add("f"); //插入重复元素,测试set是否可以存放重复元素 set.add("a"); set.add(null); //插入重复null,看结果是否可以存放两个null

Java8 HashMap实现原理探究

。_饼干妹妹 提交于 2020-03-16 18:34:12
某厂面试归来,发现自己落伍了!>>> 前言:Java8之后新增挺多新东西,在网上找了些相关资料,关于HashMap在自己被血虐之后痛定思痛决定整理一下相关知识方便自己看。图和有些内容参考的这个文章:http://www.importnew.com/16599.html HashMap的存储结构如图: 一个桶( bucket )上的节点多于8个则存储结构是红黑树,小于8个是单向链表。 1:HashMap的一些属性 public class HashMap<k,v> extends AbstractMap<k,v> implements Map<k,v>, Cloneable, Serializable { private static final long serialVersionUID = 362498820763181265L; // 默认的初始容量是16 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // 最大容量 static final int MAXIMUM_CAPACITY = 1 << 30; // 默认的填充因子(以前的版本也有叫加载因子的) static final float DEFAULT_LOAD_FACTOR = 0.75f; // 这是一个阈值,当桶(bucket

Map集合面试题

自闭症网瘾萝莉.ら 提交于 2020-03-16 18:30:51
有可能问道你都知道哪些常用的Map集合?   HashMap、HashTable、LinkedHashMap、ConcurrentHashMap。 Collection集合接口和Map接口有什么关系?   没关系,Collection是List、Set父接口不是Map父接口。 HashMap是线程安全的吗?线程安全的Map都有哪些?性能最好的是哪个?   HashMap不是线程安全的。线程安全的有HashTable、ConcurrentHashMap、SynchronizedMap,性能最好的是ConcurrentHashMap。 使用HashMap有什么性能问题吗?   使用HashMap要注意避免集合的扩容,它会很耗性能,根据元素的数量给它一个初始大小的值。 HashMap的数据结构是怎样的?默认大小是多少?内部是怎么扩容的?   HashMap是数组和链表组成的,默认大小为16,当hashmap中的元素个数超过数组大小*loadFactor(默认值为0.75)时就会把数组的大小扩展为原来的两倍大小,然后重新计算每个元素在数组中的位置。 怎么按添加顺序存储元素?怎么按A-Z自然顺序存储元素?怎么自定义排序?   按添加顺序使用LinkedHashMap,按自然顺序使用TreeMap,自定义排序TreeMap(Comparetor c)。

基础知识-HashMap知识点

天大地大妈咪最大 提交于 2020-03-16 18:01:16
某厂面试归来,发现自己落伍了!>>> key值为null时的存取 我们知道HashMap允许插入元素的key值为null,我们看下这部分的源代码: private V putForNullKey(V value) { for (Entry<K,V> e = table[0]; e != null; e = e.next) { if (e.key == null) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; addEntry(0, null, value, 0); return null; } 可以看出,key=null时,对应的数据是保存在内部数组第一个位置的链表中。知道了它是如何保存的,那么获取也就简单了:编译内部数组第一个位置的列表,找到key=null的数据项,返回该数据项中的value即可。 private V getForNullKey() { for (Entry<K,V> e = table[0]; e != null; e = e.next) { if (e.key == null) return e.value; } return null; } hashCode和equals方法 在上一篇博文:《 基础知识

How to print keys with duplicate values in a hashmap?

狂风中的少年 提交于 2020-03-16 08:01:11
问题 I have a hashmap with some keys pointing to same values. I want to find all the values that are equal and print the corresponding keys. This is the current code that I have: Map<String, String> map = new HashMap<>(); map.put("hello", "0123"); map.put("hola", "0123"); map.put("kosta", "0123"); map.put("da", "03"); map.put("notda", "013"); map.put("twins2", "01"); map.put("twins22", "01"); List<String> myList = new ArrayList<>(); for (Map.Entry<String, String> entry : map.entrySet()) { for (Map

HashMap实现原理分析

三世轮回 提交于 2020-03-16 04:07:43
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、108以及140都存储在数组下标为12的位置。   HashMap其实也是一个线性的数组实现的,所以可以理解为其存储数据的容器就是一个线性数组。这可能让我们很不解,一个线性的数组怎么实现按键值对来存取数据呢

hasSet,TreeSet,ArrayList,LinkedList,Vector,HashMap,HashTable,TreeMap利用Iterator进行输出

旧时模样 提交于 2020-03-14 11:52:39
基础类,没有重写hashCode()和equals()方法: package niukewang; import java.util.Objects; public class setClass { String a; String b; public setClass(String a, String b) { this.a=a; this.b=b; } } 测试类: package niukewang; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Hashtable; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; import java.util.Vector; public class test1 { public static void main(String args[]