Java三目运算符的实战案例

 更新时间:2022年09月02日 10:21:35   作者:大 以 巴 狼  
三目运算符在java中运用可以说非常的广泛,下面这篇文章主要给大家介绍了关于Java三目运算符的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

1.什么是条件分支语句?条件分支语句共有几种写法?

条件分支语句就是根据条件不同,选择执行不同代码的结构,Java中共有三种声明条件分支语句的语法,分别为:

  • if 语句
  • 三目运算符
  • switch语句

案例:判断输入的数值是奇数还是偶数,if 语句非常简单:

        System.out.println("请输入一个数字:");
        int num = sc.nextInt();
        //输出用户输入的数据是奇数还是偶数?
        //分析:通过条件分支语句进行判断!
        if (num % 2 == 0) {//证明:数值除以二等于0,是偶数
            System.out.println("偶数");
        } else {//证明:除以2不等于0,是奇数
            System.out.println("奇数");
        }

2. 三目元算符又称为三元运算符也称为条件运算符,目的就是根据条件得到数据结果,语法结构:

判断条件 ?条件成立结果 :条件不成立结果

需要注意的是,三目运算符得到的是数据结果,不是代码表达式 。

  • 优势:判断两种分支的代码非常简单
  • 劣势:不太适用于判断多中分支(可以用来判断,需要通过三目元算符嵌套完成!)
public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个数字:");
        int num = sc.nextInt();
        //输出用户输入的数据是奇数还是偶数?
        //分析:num对2取余是否等于0 ? (如果条件成立)输出偶数 :(如果不成立)输出奇数
        System.out.println(num % 2 == 0 ? "偶数" : "奇数");
    }

如果遇到判断三个数值大小,或者4个数值大小时候,就会非常麻烦

        Scanner sc = new Scanner(System.in);
        System.out.println("请输入第1个整数:");
        int a = sc.nextInt();
        System.out.println("请输入第2个整数:");
        int b = sc.nextInt();
        System.out.println("请输入第3个整数:");
        int c = sc.nextInt();
        System.out.println("请输入第4个整数:");
        int d = sc.nextInt();
        //输出三个变量的最大值!(三目运算符)
        //a > b ? a : b等价于求得了a和b中的最大值!
        System.out.println((a > b ? a : b) > c ? (a > b ? a : b) : c);
        System.out.println(a > b ? (a > c ? a : c) : (b > c ? b : c));
 
        //输出四个变量的最大值!
        System.out.println(a > b ? (a > c ? (a > d ? a : d) : (c > d ? c : d)) : (b > c ? (b > d ? b : d) : (c > d ? c : d)));

3. switch语句的语法结构如下:

switch (变量) {
        case 值1: 
            满足变量等于值1运行的代码;
            break;
        case 值2: 
            满足变量等于值2运行的代码;
            break;
        case 值3: 
            满足变量等于值3运行的代码;
            break;
        default:
            不满足以上任何情况运行的代码;
            break;
    }

break用在switch语句中表示结束当前switch语句的执行,如果省略break,那么switch语句会跳过后续所有判断继续执行,直到遇到break或者switch运行结束为止!

  • 优势:适用于判断一个数的多种分支的情况
  • 劣势:switch只能判断相等的情况
        /*
        周一:上班
        周二:上班
        周三:出差
        周四:上班
        周五:上班
        周六:睡觉
        周日:打球
        否则:日期有误
         */
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入今天周几?");
        int week = sc.nextInt();
        //根据周几输出不同的内容(switch语句)
        switch (week) {
            case 1:
            case 2://当前一个判断句没有break时,运行不会终止,(case=1245都会输出上班)
            case 4:
            case 5:
                System.out.println("上班");
                break;
            case 3:
                System.out.println("出差");
                break;
            case 6:
                System.out.println("睡觉");
                break;
            case 7:
                System.out.println("打球");
                break;
            default:
                System.out.println("日期有误");
                break;
        }

补充:Java 三目运算符细节详解

短路问题

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

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

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

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

结果输出是 5 ,说明三目运算符也有类似逻辑运算符的短路问题,直接去 true 和 false 对应的地方取结果,不会计算另一部分,即使把代码写成下面这样结果一样,输出结果还是 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);

仅仅是将 a 和 b 交换了一下位置,运行就会报 NullPointerException ,这是为什么的。这也很好理解,当为 true 时,会选 b ,因为前面 c 是基本数据类型,所以这时包装类会自动拆箱,变成下面这样的代码,而 b 是 null ,所以会抛出 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);

总结

到此这篇关于Java三目运算符的文章就介绍到这了,更多相关Java三目运算符内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringCloud Feign高级配置详解

    SpringCloud Feign高级配置详解

    这篇文章主要介绍了SpringCloud Feign高级配置,feign是netflix提供的服务间基于http的rpc调用框架,在spring cloud得到广泛应用
    2022-09-09
  • Java中的System类、BigInteger类和BigDecimal类详解

    Java中的System类、BigInteger类和BigDecimal类详解

    这篇文章主要介绍了Java中的System类、BigInteger类和BigDecimal类详解,arraycopy()方法,复制数组元素,比较适合底层调用,一般使用Arrays.copyOf()完成复制数组,需要的朋友可以参考下
    2023-09-09
  • java数据结构和算法中哈希表知识点详解

    java数据结构和算法中哈希表知识点详解

    在本篇文章里小编给大家分享了关于java数据结构和算法中哈希表的相关知识点内容,需要的朋友们学习下。
    2019-06-06
  • Mybatis中resultMap的使用总结

    Mybatis中resultMap的使用总结

    resultmap是mybatis中最复杂的元素之一,它描述如何从结果集中加载对象,主要作用是定义映射规则、级联的更新、定制类型转化器。今天通过本文给大家介绍Mybatis中resultMap的使用,感兴趣的朋友参考下吧
    2021-06-06
  • 关于@Transactional事务表被锁的问题及解决

    关于@Transactional事务表被锁的问题及解决

    这篇文章主要介绍了关于@Transactional事务表被锁的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 详解如何自定义parallelStream线程池

    详解如何自定义parallelStream线程池

    这篇文章主要为大家介绍了如何自定义parallelStream的线程池实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • 一文详解Spring任务执行和调度(小结)

    一文详解Spring任务执行和调度(小结)

    这篇文章主要介绍了一文详解Spring任务执行和调度(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Hibernate Validator实现更简洁的参数校验及一个util

    Hibernate Validator实现更简洁的参数校验及一个util

    这篇文章主要介绍了Hibernate Validator实现更简洁的参数校验及一个util,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • 深入探究Spring底层核心原理

    深入探究Spring底层核心原理

    理解IOC与AOP的实现机制,优化应用性能与可维护性。Spring通过IOC容器管理Bean,AOP实现切面编程,支持事务管理、ORM框架等。深入理解Spring原理,可以帮助我们更好地使用Spring框架,提高开发效率与质量
    2023-04-04
  • 基于多线程中join()的用法实例讲解

    基于多线程中join()的用法实例讲解

    下面小编就为大家带来一篇基于多线程中join()的用法实例讲解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10

最新评论