hashmap

JAVA面试题及参考分析-JAVA基础篇-2

浪子不回头ぞ 提交于 2020-02-25 19:25:52
13.构造器(constructor)是否可被重写(override)? 构造方法是不能被子类重写的,但是构造方法可以重载 简单的讲,就是说一个类可以有多个构造方法。 String, StringBuffer StringBuilder的区别 String 的长度是不可变的;StringBuffer的长度是可变的,线程安全;如果对一个字符串要经常改变的话,就一定不要用String,否则会创建许多无用的对象出来.15.HashMap的工作原理是什么? HashMap内部是通过一个数组实现的,只是这个数组比较特殊,数组里存储的元素是一个Entry实体(在JAVA8中为Node),这个Entry实体主要包含key、value以及一个指向自身的next指针。 HashMap是基于hashing实现的,当进行put操作时,根据传递的key值得到它的hashcode,然后再用这个hashcode与数组的长度进行模运算,得到一个int值,就是Entry要存储在数组的位置(下标);当通过get方法获取指定key的值时,会根据这个key算出它的hash值(数组下标),根据这个hash值获取数组下标对应的Entry,然后判断Entry里的key,hash值或者通过equals()比较是否与要查找的相同,如果相同,返回value,否则的话,遍历该链表(有可能就只有一个Entry,此时直接返回null)

java源码学习---HashMap

橙三吉。 提交于 2020-02-25 19:07:46
开门见山,直接干 HashMap是java常用的一个集合,每个元素的key经过哈希算法后储存在链表或红黑树的一种键值对数据集合(JDK1.8) 从HashMap新增元素说起 map.put( "key" , "value" ); 这是我们日常向HashMap插入元素的其中一种方式,put(k,v)的源码 public V put( K key, V value) { return putVal( hash (key), key, value, false , true ); } put()会再调用一个putVal(),但是在这之前key会通过hash()计算出对应位置的值,真正的put操作,就是从这里开始 final V putVal( int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { Node< K , V >[] tab; Node< K , V > p; int n, i; if ((tab = table ) == null || (n = tab. length ) == 0 ) n = (tab = resize()). length ; if ((p = tab[i = (n - 1 ) & hash]) == null ) tab[i] = newNode(hash, key,

java基础-004

和自甴很熟 提交于 2020-02-25 15:46:57
---恢复内容开始--- 14.Java集合类框架的基本接口    集合类接口指定了一组叫做元素的对象.集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序.有的集合类允许重复的键,有的不允许.   Java集合提供了一套设计良好的支持对一组对象进行操作的接口和类.Java集合类里面最基本的接口有:   I> Collection:代表一组对象,每一个对象都是它的子元素   II> Set:不包含重复元素的Cllection   III> List:有顺序的Collection,并且可以包含重复元素   IV> Map:可以把键(key)映射到值(value)的对象,键不能重复   集合类没有实现cloneable和serializable接口:   克隆(cloning)或者是序列化(serialization)的语义和含义是根据具体的实现相关的.因此,应该由集合类的具体实现来决定如何被克隆或者序列化. 15.迭代器(iterator)   iterator接口提供了很多岁集合元素进行迭代方法.每一个集合类都包含了可以返回迭代器实例的迭代方法.迭代器可以在迭代的过程中删除底层集合的元素,但是不可以直接调用集合的remove(Object obj)删除,可以通过迭代器的remove()方法删除.   Iterator和ListIterator的区比别:   I

HashMap为什么是线程不安全的

北战南征 提交于 2020-02-25 14:51:14
jdk1.7中HashMap的transfer函数如下: void transfer(Entry[] newTable, boolean rehash) { int newCapacity = newTable.length; for (Entry<K,V> e : table) { while(null != e) { Entry<K,V> next = e.next; if (rehash) { e.hash = null == e.key ? 0 : hash(e.key); } int i = indexFor(e.hash, newCapacity); e.next = newTable[i]; newTable[i] = e; e = next; } } } 此函数transfer是在检查到数组需要扩容后,把原先table里的数据重新计算下标后放到newtable里并且覆盖老的数组元素的过程,在jdk1.7中由于采用的是头插法的倒序排列,所以很容易形成环型链表的死循环和数据丢失的情况,而在jdk1.8中由于采用的是尾插法,所以避免了出现死循环的现象。 总结: 首先HashMap是线程不安全的,其主要体现: #1.在jdk1.7中,在多线程环境下,扩容时会造成环形链或数据丢失。 #2.在jdk1.8中,在多线程环境下,会发生数据覆盖的情况。 参考文章: https:/

about HashMap

感情迁移 提交于 2020-02-25 14:08:13
今天试了一下HahsMap, 采用如下形似定义 (这个下面是用了csdn的一位同仁的文章,仅作为讲解参考,请见谅) HashMap<int,String> map=new HashMap<int,String>(); map.put( 1 , "a" ); map.put( 2 , "b" ); map.put( 1 , "aq" ); System.out.println(map.get( 0 )); System.out.println(map.get( 1 )); System.out.println(map.get( 2 )); 报错:Syntax error on token "int", Dimensions expected after this token 原因: 引用类型 和 原始类型 没有搞清楚! Java 提供两种不同的类型: 引用类型 和 原始类型(或内置类型) 。 Int 是 java 的原始数据类型, Integer 是 java 为 int 提供的封装类。 Java 为每个原始类型提供了封装类。 原始类型 封装类 boolean Boolean char Character byte Byte short Short int Integer long Long float Float double Double 引用类型和原始类型的行为完全不同

JAVA Hashmap不能用基本的数据类型

自古美人都是妖i 提交于 2020-02-25 14:07:20
今天开始学习Java。。。 转载:http://moto0421.iteye.com/blog/1143777 今天试了一下HahsMap, 采用如下形似定义 (这个下面是用了csdn的一位同仁的文章,仅作为讲解参考,请见谅) HashMap<int,String> map=new HashMap<int,String>(); map.put( 1 , "a" ); map.put( 2 , "b" ); map.put( 1 , "aq" ); System.out.println(map.get( 0 )); System.out.println(map.get( 1 )); System.out.println(map.get( 2 )); 报错:Syntax error on token "int", Dimensions expected after this token 原因: 引用类型 和 原始类型 没有搞清楚! Java 提供两种不同的类型: 引用类型 和 原始类型(或内置类型) 。 Int 是 java 的原始数据类型, Integer 是 java 为 int 提供的封装类。 Java 为每个原始类型提供了封装类。 原始类型 封装类 boolean Boolean char Character byte Byte short Short int Integer

关于map 的几种方式

*爱你&永不变心* 提交于 2020-02-25 13:04:21
java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是 HashMap Hashtable LinkedHashMap 和TreeMap. Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复。 Hashmap 是一个最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。 HashMap最多只允许一条记录的键为Null(如果建是null存在数组的第一个位置);允许多条记录的值为Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致 。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。 默认初始化的时候是16个数组的大小,而且增长是成倍的增长。 Hashtable 与 HashMap类似,它继承自Dictionary类,不同的是: 它不允许记录的键或者值为空;它支持线程的同步 ,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。 默认初始化的时候是11个数组的大小,而且增长是old*2+1 public Hashtable() {

sort HashMap in reverse? [duplicate]

左心房为你撑大大i 提交于 2020-02-24 12:09:07
问题 This question already has answers here : How to use a Java8 lambda to sort a stream in reverse order? (7 answers) Comparator.reversed() does not compile using lambda (2 answers) Closed 2 years ago . So I came across this method which is able to sort HashMaps by value. public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) { return map.entrySet() .stream() .sorted(Map.Entry.comparingByValue()) .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue,

How to create an associative list in Java?

非 Y 不嫁゛ 提交于 2020-02-24 09:07:15
问题 I am trying to have a user enter a String to search for a value in a list. This works fine, but I also want the String to have a numeric value. This way I can get the certain item in the lists price. I tried: public List<String, double> However this always gives me an error. How can I store strings and their corresponding numeric value? 回答1: Are you only storing a String and a Double , or will you eventually need to store more information about each object? For example, you're talking about

HashMaps with Comparable keys not working as expected

寵の児 提交于 2020-02-23 06:20:03
问题 We're facing weird issues with how HashMap behaves. When HashMap keys implement Comparable interface but compareTo implementation is inconsistent with equals then HashMaps: grow much larger then they are supposed to grow they contain several instances of equal elements values attached to those elements might differ get(key) result depends on which key is used (even if the keys are equal according to equals method). I've created a small test to reproduce the problem (see below). import java