tech-daily-questions icon indicating copy to clipboard operation
tech-daily-questions copied to clipboard

「小马哥每日一问」2019.08.13 期

Open mercyblitz opened this issue 5 years ago • 15 comments

问题描述

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) 以上答案都不是

请小伙伴们在评论区直接作答,谢谢~

注:请关注小马哥微信公众号【次灵均阁】,后续将有解答视频推送: 次灵均阁

mercyblitz avatar Aug 13 '19 05:08 mercyblitz

(a) Hello 1 null 3

gzdzss avatar Aug 13 '19 05:08 gzdzss

C

mark8866 avatar Aug 13 '19 05:08 mark8866

选a,这题利用了IdentityHashMap集合的特性,判断key是否相等,是通过=,而不是equals

fffighting avatar Aug 13 '19 06:08 fffighting

a

lianpeng0011 avatar Aug 13 '19 06:08 lianpeng0011

A

Dovelol avatar Aug 13 '19 06:08 Dovelol

A 实际上考察 integer 对象是否相等 map.putIfAbsent(1024, "B") 由于 1024!=1024 set null 进去

mingduo avatar Aug 13 '19 06:08 mingduo

首先IdentityHashMap不同于其他的map,他判断key是否相同是 类似于 == 的操作,不是equals方法,其次这里的put是个int对象,会被装箱到Integer类型,他是有个缓存区间-127-128好像,然后put(1,"")的时候肯定是存在的,返回null, 在put 1024的时候超出Integer缓存范围需要new 一个,所以 == 的判断就不是一个了,就被被put进去。最后map的size是3

wangjianxins avatar Aug 13 '19 06:08 wangjianxins

A

ShayneLau avatar Aug 13 '19 06:08 ShayneLau

IntegerCache java.lang.System#identityHashCode

majinkai avatar Aug 13 '19 07:08 majinkai

putIfAbsent 这个方法是 jdk1.8 开始才有的,不过其实考察重点是 "小整数缓存" IntegerCache,Java 语言设计者认为 -128~127 范围的整数比较常用,没必要每次都创建对象,Integer 本身又是不可变对象,线程安全。IntegerCache 下限不可配置,上限可通过 java.lang.Integer.IntegerCache.high 配置。 所以默认情况下,答案是(a)。 1 每次装箱后是同一个Integer对象,1024 装箱后是3个不同对象

justmehyp avatar Aug 13 '19 07:08 justmehyp

这个方法是 jdk1.8 开始才有的,不过其实考察重点是 "小整数缓存" IntegerCache,Java 语言设计者认为 -128~127 范围的整数比较常用,没必要每次都创建对象,Integer 本身又是不可变对象,线程安全。IntegerCache 下限不可配置,上限可通过 java.lang.Integer.IntegerCache.high 配置。 所以默认情况下,答案是(a)。 1 每次装箱后是同一个Integer对象,1024 装箱后是3个不同对象

哦对 -128-127 哈哈哈记错了

wangjianxins avatar Aug 13 '19 07:08 wangjianxins

这个不好说吧 不是可以通过-XX:AutoBoxCacheMax 进行控制么 一般的情况下答案应该是选项A吧

programmerCs avatar Aug 13 '19 07:08 programmerCs

A 实际上考察 integer 对象是否相等 map.putIfAbsent(1024, "B") 由于 1024!=1024 set null 进去

并不是set null进去,而是get(1024)的时候,又产生了一个对象new Integer(1024),所以获取到null

Jyub avatar Aug 13 '19 08:08 Jyub

按照惯例先选D 我猜小马哥说答案是不一定,所以选d

mayuefeng777 avatar Aug 13 '19 11:08 mayuefeng777

跟着大神学知识,每日签到

UnNous avatar Aug 23 '19 07:08 UnNous