java开发手册——13问

文章探讨了Java中三目运算符可能导致的空指针异常,特别是在自动装箱和拆箱过程中的陷阱,并给出了避免NPE的建议。同时,文章详细解释了HashMap的容量、装载因子和扩容机制,建议初始化HashMap容量的原因在于优化性能和避免不必要的扩容操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

🥲 🥸 🤌 🫀 🫁 🥷 🐻‍❄️🦤 🪶 🦭 🪲 🪳 🪰 🪱 🪴 🫐 🫒 🫑 🫓 🫔 🫕 🦤 🪶 🦭 🪲 🪳 🪰 🪱 🐻‍❄️ 🫐 🫒 🫑 🫓 🫔 🫕
♔博主昵称:�欢快↑㎡
🕍博客主页:�欢快↑㎡的博客_CSDN博客-学习注意点杂记,BUG集,安装教程领域博主
⚇很方便的在线编辑器:Lightly
🥗感谢点赞🤞🏻评论🤞🏻收藏
相信吧!🤜🏻我们很优秀,还可以更加优秀,加油!🌼让我们一起在写作中记录巩固学习吧!

1.三目运算符空指针问题?

三目运算符condition? 表达式1:表达式2中,表达式1和表达式2在类型对齐时,可能会出现自动拆箱导致NPE异常。

触发自动拆箱的两种场景:

1)表达式1 或者表达式2的值只有一个原始类型。

2)表达式1 或者表达式2的值的类型不一样,会强制拆箱升级成表示范围更大的那个类型。

例子:

Integer a = 1;

Integer b = 2;

Integer c = null;

Integer result = (flag ? a*b : c);

多个 Integer 相乘的结果是 int。

a*b 的结果是int 类型,c会强制拆箱成int类型,会抛出NPE异常。

回顾:

a?b:c?d:e 将按a?b:(c?d:e)执行。

自动装箱与自动拆箱

java中的8种基本数据类型,是存储在栈内存中,不会在堆上分配内存,使用起来更加高效。

但是基本数据类型不是对象,在实际使用中会有诸多不便,如集合类要求元素必须是Object类型,基本数据类型无法使用。

自动装箱 :就是将基本数据类型自动转换成对应的包装类。

自动拆箱:就是将包装类自动转换成对应的基本数据类型。

自动装箱都是通过包装类的valueOf()方法来实现的 。 自动拆箱都是通过包装类对象的xxxValue()来实现的(如 booleanValue()、longValue() 等)。

案列复现:

boolean flag = true; // 设置成 true,保证条件表达式的表达式二一定可以执行
// 如果表达式1为true则表达式2不会执行
boolean simpleBoolean = false; // 定义一个基本数据类型的 boolean 变量
Boolean nullBoolean = null;// 定义一个包装类对象类型的 Boolean 变量,值为 null
boolean x = flag ? nullBoolean : simpleBoolean; // 使用三目运算符并给 x 变量赋值

最后一行代码会进行自动拆箱,导致NPE

当第二位和第三位表达式都是包装类型的时候,该表达式的结果才是该包装类型,否则,只要有一个表达式的类型是基本数据类型,则表达式得到的结果都是基本数据类型。如果结果不符合预期,那么编译器就会进行自动拆箱。

避免方法:

        涉及三目运算符,最好保持第二位和第三位表达式的类型一致,并且如果
要把三目运算符表达式给变量赋值的时候,也尽量保持变量的类型和他们保持一致。
并且,做好单元测试!!!

2.为什么建议初始化HashMap的容量大小?

        HashMap中定义的成员变量:size、loadFactor、threshold、DEFAULT_LOAD_FACTOR 和 DEFAULT_INITIAL_CAPACITY等。

        ● transient int size;
                ○ 记录了 Map 中 KV 对的个数
        ● loadFactor
                ○ 装载因子,用来衡量 HashMap 满的程度。loadFactor 的默认值为 0.75f(static final         float DEFAULT_LOAD_FACTOR = 0.75f;)。
        ● int threshold;
                ○ 临 界 值, 当 实 际 KV 个 数 超 过 threshold 时,HashMap 会 将 容 量 扩 容,
        threshold =容量 * 加载因子
        ● 除了以上这些重要成员变量外,HashMap 中还有一个和他们紧密相关的概念:capacity
                ○ 容量,如果不指定,默认容量是 16(static final int DEFAULT_INI-TIAL_CAPACITY = 1         <<    4;)

        size 和 capacity

                size是已经装了多少元素

                capacity是当前最多可以装下多少个元素

HashMap是有扩容机制的,默认容量是16,当达到扩容条件的时候,就会进行扩容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

�欢快↑㎡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值