tech-daily-questions
tech-daily-questions copied to clipboard
「小马哥每日一问」2019.08.13 期
问题描述
public class MyMap {
public static void main(String[] args) {
Map map = new IdentityHashMap<>();
map.put(1, "Hello");
map.putIfAbsent(1, "World");
print(map.get(1));
print(map.size());
map.put(1024, "A");
map.putIfAbsent(1024, "B");
print(map.get(1024));
print(map.size());
}
private static void print(Object object) {
System.out.print(object + " ");
}
}
以上程序输出内容是?
(a) Hello 1 null 3 (b) World 1 null 2 (c) Hello 2 null 2 (d) 以上答案都不是
请小伙伴们在评论区直接作答,谢谢~
注:请关注小马哥微信公众号【次灵均阁】,后续将有解答视频推送:
(a) Hello 1 null 3
C
选a,这题利用了IdentityHashMap集合的特性,判断key是否相等,是通过=,而不是equals
a
A
A 实际上考察 integer 对象是否相等 map.putIfAbsent(1024, "B") 由于 1024!=1024 set null 进去
首先IdentityHashMap不同于其他的map,他判断key是否相同是 类似于 == 的操作,不是equals方法,其次这里的put是个int对象,会被装箱到Integer类型,他是有个缓存区间-127-128好像,然后put(1,"")的时候肯定是存在的,返回null, 在put 1024的时候超出Integer缓存范围需要new 一个,所以 == 的判断就不是一个了,就被被put进去。最后map的size是3
A
IntegerCache java.lang.System#identityHashCode
putIfAbsent 这个方法是 jdk1.8 开始才有的,不过其实考察重点是 "小整数缓存" IntegerCache,Java 语言设计者认为 -128~127 范围的整数比较常用,没必要每次都创建对象,Integer 本身又是不可变对象,线程安全。IntegerCache 下限不可配置,上限可通过 java.lang.Integer.IntegerCache.high 配置。 所以默认情况下,答案是(a)。 1 每次装箱后是同一个Integer对象,1024 装箱后是3个不同对象
这个方法是 jdk1.8 开始才有的,不过其实考察重点是 "小整数缓存" IntegerCache,Java 语言设计者认为 -128~127 范围的整数比较常用,没必要每次都创建对象,Integer 本身又是不可变对象,线程安全。IntegerCache 下限不可配置,上限可通过 java.lang.Integer.IntegerCache.high 配置。 所以默认情况下,答案是(a)。 1 每次装箱后是同一个Integer对象,1024 装箱后是3个不同对象
哦对 -128-127 哈哈哈记错了
这个不好说吧 不是可以通过-XX:AutoBoxCacheMax 进行控制么 一般的情况下答案应该是选项A吧
A 实际上考察 integer 对象是否相等 map.putIfAbsent(1024, "B") 由于 1024!=1024 set null 进去
并不是set null进去,而是get(1024)的时候,又产生了一个对象new Integer(1024),所以获取到null
按照惯例先选D 我猜小马哥说答案是不一定,所以选d
跟着大神学知识,每日签到