Java 三目运算符细节详解「建议收藏」

Java 三目运算符细节详解「建议收藏」Java三目运算符细节详解@author:Jingdai@date:2020.09.24看到标题你肯定觉得三目运算符有什么好讲的,不是很简单嘛。我之前也是这么认为的,直到今天刷LeetCode遇到了一点问题,发现还是有些细节自己不知道的,现总结一下。短路问题首先我们都知道Java中&&和||的运算是具有短路效果的,如果逻辑运算符的第一部分能确定运算的结果,就不会再去计算逻辑运算符的第二部分,比如下面的代码,输出的i仍然是1,因为后面的运算短路了,没有计算。in

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

Java 三目运算符细节详解

@author:Jingdai
@date:2020.09.24

看到标题你肯定觉得三目运算符有什么好讲的,不是很简单嘛。我之前也是这么认为的,直到今天刷LeetCode遇到了一点问题,发现还是有些细节自己不知道的,现总结一下。

短路问题

首先我们都知道Java中 &&|| 的运算是具有短路效果的,如果逻辑运算符的第一部分能确定运算的结果,就不会再去计算逻辑运算符的第二部分,比如下面的代码,输出的 i 仍然是1,因为后面的运算短路了,没有计算。

int i = 1;
if (true || (i++) > 5) { 
    
   System.out.println("test");
}
System.out.println(i);   // 1

Jetbrains全家桶1年46,售后保障稳定

回到三目运算符,三目运算符也会有短路效果吗?看下面的代码。

int i = 5;
int j = true ? 1 : ++i;
System.out.println(i);  // 5

结果输出是 5 ,说明三目运算符也有类似逻辑运算符的短路问题,直接去 truefalse 对应的地方取结果,不会计算另一部分,即使把代码写成下面这样结果一样,输出结果还是 5 ,不会因为顺序而改变。

int i = 5;
int j = false ? ++i : 1;
System.out.println(i);  // 5

运算顺序问题

先看下面的代码。

int[] array = new int[5];
int i = 4;
boolean flag = i++ > 4 ?  true : false;
System.out.println(flag);          // false
i = 4;
int b = i++ > 3 ?  array[i] : array[i];

我们知道 i++ 是先赋值再进行自加,所以 flag 的结果是 false 很好理解,但是下面 b 的结果会是多少呢?直接看运行结果。

false
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
        at A.main(A.java:16)

结果是抛出数组越界异常,结果说明在比较结束的时候,i 的值已经加了,即此时 i = 5 ,再去取数组的值的时候就会抛出数组越界异常,所以千万不要认为 i 值在整个表达式结束后才会增加。

包装类问题

在使用三目运算符处理包装类时,要注意 NPE 问题,看下面的代码。

int a = 5;
Integer b = null;

int c = true ? a : b;
System.out.println(c);    // 5

在这个例子中,会输出 5 ,没有什么问题,但是把代码稍微变一点,看下面的代码。

int a = 5;
Integer b = null;

int c = true ? b : a;
System.out.println(c);

仅仅是将 ab 交换了一下位置,运行就会报 NullPointerException ,这是为什么的。这也很好理解,当为 true 时,会选 b ,因为前面 c 是基本数据类型,所以这时包装类会自动拆箱,变成下面这样的代码,而 bnull ,所以会抛出 NullPointerException 异常。

int a = 5;
Integer b = null;

int c = true ? b.intValue() : a;
System.out.println(c);

但是,将代码变成下面这样,按理说应该不会有什么问题,因为 c 是包装类型,可以接收 null ,但是运行时还是会发生 NullPointerException 异常。其实,当三目运算符的第二、第三个操作数分别为基本类型的包装类和基本数据类型时,并且选择了包装类那一项,则包装类会自动进行拆箱操作。即代码还是会进行拆箱操作,所以会发生 NullPointerException 异常,这点非常容易使人弄错。

int a = 5;
Integer b = null;

Integer c = true ? b : a;
// 还是会变成Integer c = true ? b.intValue() : a;
System.out.println(c);
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/226781.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • android学习笔记之ImageView的scaleType属性

    android学习笔记之ImageView的scaleType属性我们知道,ImageView有一个属性叫做scaleType,它的取值一共有八种,分别是:matrix,fitXY,fitStart,fitCenter,fitEnd,center,centerCrop,centerInside。那我们下面一起来看看这八种取值分别代表什么意思。我用两张图片来做demo,这两张图片的分辨率一大一小,图片分别叫做big和small。原图如下:big:small:OK,

    2022年6月15日
    27
  • SQL SERVER 2019安装教程-最全安装步骤[通俗易懂]

    SQL SERVER 2019安装教程-最全安装步骤[通俗易懂]SqlServer2019安装教程-自定义安装:转载https://blog.csdn.net/qq_33556442/article/details/100885939下载SQLServer2019ReleaseCandidatehttps://www.microsoft.com/en-us/evalcenter/evaluate-sql-server-2019-rc/1.点击【Continue】2.填写资料再点击【Continue】3.静静地等待文件下载完成4.找到文件下载的

    2022年6月23日
    36
  • 微信公众账号开发

    微信公众账号开发微信开发微信公众平台开发(82)天气预报摘要:在这篇教程中,我们将介绍如何在微信公众平台上开发天气预报功能。我们将使用中国天气网的气象数据接口来获取天气信息。这篇教程将介绍以下内容:获取中国天气网的气象数据在微信公众平台中回复天气一、中国天气网中国天气网提供了丰富的气象数据接口。下面我们介绍主要的几个:国家根节点接口:http://flash.weather.c

    2022年5月25日
    34
  • Eclipse背景颜色修改

    Eclipse背景颜色修改Eclipse背景颜色修改: 操作界面默认颜色为白色。对于我们长期使用电脑编程的人来说,白色很刺激我们的眼睛,所以我经常会改变workspace的背景色,使眼睛舒服一些。设置方法如下: 1、打开window->Preference,弹出Preference面板 2、展开General标签,选中Editors选项,展开。 3、选中TestEditors,右边出现Test

    2022年6月20日
    26
  • Python读取excel文件数据并插入数据库[通俗易懂]

    Python读取excel文件数据并插入数据库[通俗易懂]目的:将excel文件StudentInfo.xls的学生信息插入到test库中的student表中一、连接mysql数据库安装第三方库pymysql:pipinstallpymysql调用pymysql.connect()方法连接数据库,代码如下importpymysql#打开数据库连接conn=pymysql.connect(host=’localhost’,#MySQL服务器地址user=’root’,#MySQL服务器端口号p

    2022年9月1日
    9
  • mysql 时间戳转日期格式[通俗易懂]

    mysql 时间戳转日期格式[通俗易懂]一、MySQL日期和时间戳的转换1.日期转时间戳selectUNIX_TIMESTAMP(‘2018-12-2512:25:00’);结果:15457119002.时间戳转日期:FROM_UNIXTIME(unix_timestamp)–unix_timestamp为时间戳selectFROM_UNIXTIME(1545711900);结果:2018-12-251…

    2022年6月21日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号