2019.03.04问题及解析
public class MapTest {
public static void main(String[] args) {
java.util.HashMap<String,String> map = new java.util.HashMap<>();
map.put("name","小刀");
map.put("name","大刀");
System.out.println(map.size());
}
}
(左右滑动可查看完整代码)
请问上述程序的输出结果是什么?为什么?
1.相关知识
这里我们用到了hashmap,我们来看一下api中对于hashmap的第一段描述
Hash table based implementation of the Map
interface. This implementation provides all of the optional map operations, and permits null
values and the null
key. (The HashMap
class is roughly equivalent to Hashtable
, except that it is unsynchronized and permits nulls.) This class makes no guarantees as to the order of the map; in particular, it does not guarantee that the order will remain constant over time.
译文:(英语水平一般,大家凑合着看哈哈)哈希表基于Map接口的实现,这个实现提供了map所有可选操作,并且允许空值和空键(哈希map类是大体上相当于是一个哈希表类,唯一的区别是hashmap不同步的并且允许空值的)这个类无法保证map的顺序,特别是无法保证它在执行一段时间后仍然保持原顺序不变。
那api中对于map的第一段又提到了什么呢?
An object that maps keys to values. A map cannot contain duplicate keys; each key can map to at most one value.
译文:一个map对象包含了键值对。一个map不能够包含重复的键,一个键最多只能映射一个值
2.答案
根据上述map的基本知识可以知道,map中一个键最多只能映射一个值,因此我们虽然put了两次“name”但是第二次其实只能去覆盖第一次存储的结果,因此当我们输出map的大小时,其实它还是只存储了一个键值对,因此输出的结果为“1”。如何把理论知识与我们的实际运用相结合也是很重要的哦!(这个分析,没基础的小伙伴们也能看懂,但想要深入了解内部原理要看下面的分析哦)
“HashMap底层实现是数组,数组中每一项又是一个链表,链表中存放:键key、值value、下一个节点next,以及hash值HashMap:key重复会被覆盖 此题答案1HashMap存储数据过程:先判断key是否为null,若为null则调用putForNullKey方法;若不为null则计算key的hash值,然后根据hash值搜索在table数组中的索引位置,如果table数组在该位置有元素,则通过比较key值是否相同(if (e.hash == hash && ((k = e.key) == key || key.equals(k)))),相同则覆盖原来key的value值”
“jdk1.8HashMap就开始采用数组+链表+红黑树实现了,static final int TREEIFY_THRESHOLD = 8; 链表长度超过8 转换为红黑树”——公众号lmbby的留言分享(这个是更深层次的代码实现,有基础的小伙伴建议走这条路学习)
希望大家多多分享,你的分享可能比我的答案还好^_^
2019.03.05问题
今天问题的形式和以往的有些不同,今天大家也要努力学习哦ヽ(゚∀゚)メ(゚∀゚)ノ
今天就来一个大家最熟悉的语句
System.out.println();
它的调用是包名点类名点方法名吗?如果不是那么是什么?
小伙伴们对题目和扩展有什么想法可以在群里分享或者公众号下方留言一起讨论哦,小刀和小伙伴在学习群里等你来一起监督学习哦,坚持!加油!进群请加小刀微信: best396975802
END
微信群请点击公众号菜单进微信群
文字|天堂
排版|花音
点个好看再走吧~(づ ̄3 ̄)づ╭❤~