带你领略Java运算符之美 | 带你学《Java编程入门》之四

简介: 所有的程序开发都是一种数字的处理游戏,那么对于数字的处理一定会有所谓的操作模式,而这些操作模式就称为运算符。例如:如果要进行加法运算肯定使用的“+”这样的运算符来完成,而对于运算符而言,也是存在先后的关系,像小学学习四则运算,采用先乘除后加减的顺序完成。当然,程序开发也会有这些运算符。

上一篇:带你学《Java编程入门》之三:火眼金睛看Java基本类型(下)
【本节目标】
学完本章你需要了解Java运算符有哪些以及它们的优先级,本节通过案例分析了数学运算符、关系运算符、三目(赋值)运算符以及位运算符,希望学有所获。

4.1 Java运算符

首先对于程序开发而言,里面会提供大量的基础运算符,那么这些运算符也都会提供有各自的优先顺序,但是一般不建议去记这些运算符的优先级。

image.png图一 运算符优先级

关键性的问题是,对于程序开发而言,强烈不建议编写很复杂的计算。
范例:以一个程序为例

public class JavaDemo {
    public static void main(String args[]) {
        int x = 10 ;
        int y = 20 ;
        int result = x -- + y++ * -- y / x / y * ++ x - --y + y ++ ;
        System.out.println(result) ; //执行结果为30
    }
}

对于程序代码而言,实际上已经告别了复杂程序逻辑时代,更多情况下是希望大家编写一些简单易懂的代码。

4.2 数学运算符

在Java中数学运算都提供了一个标准的支持。包括四则运算都是支持的。
范例:实现一个简单的四则运算

public class JavaDemo {
    public static void main(String args[]) {
        int result = 890234890 * ( 2902390 + 100 ) * 2 ;
        System.out.println(result) ; //执行结果为886891784
    }
}

在进行计算的时候,编程语言一般也都会提供有简化(+=、*=、-=、/=、%=)的运算符支持。
范例:简化运算符

public class JavaDemo {
    public static void main(String args[]) {
        int num = 10 ;
              //num =num +20;
        num += 20 ;
        System.out.println(num) ;  //执行结果:30
    }
}

对于以上"num =num +20;"代码,在内存小的时代就不适合了,所以才提供有一系列的简化运算。
范例:求模

public class JavaDemo {
    public static void main(String args[]) {
        int num = 10 ;
        num %= 3;
        System.out.println(num) ;  //执行结果:1
    }
}

在数学计算里面最头疼的是“++”、“--”,因为这两种运算符有两类使用方法:

  • ++变量、--变量:先进行变量的自增或自减,而后在进行数字的计算;
  • 变量++、变量--:先使用变量进行计算,而后再进行自增或自减。

范例:实现自增与自减

public class JavaDemo {
    public static void main(String args[]) {
        int x = 10 ;
        int y = 20 ;
        // 1、++ x:首先x的内容要先自增1,为11;
        // 2、y --:先进行计算,使用的内容是20,计算完成后自减
        int result = ++ x - y -- ;
        System.out.println("计算结果:" + result) ;     // -9
        System.out.println("x = " + x) ;    // 11
        System.out.println("y = " + y) ;    // 19
    }
}

这些代码程序都是在当初内存不大的情况下提供的处理方式,但是现在来看,这种计算就较为繁琐,尤其是在硬件成本降低的今天,这类操作如果不是必须的情况下,不建议这样使用。

public class JavaDemo {
    public static void main(String args[]) {
        int x = 10 ;
        int y = 20 ;
        ++ x ;
        int result = x - y;
        y -- ;
        System.out.println("计算结果:" + result) ;     // -9
        System.out.println("x = " + x) ;    // 11
        System.out.println("y = " + y) ;    // 19
    }
}

4.3 关系运算符

关系运算符只要特征进行大小的比较处理,包括:大于(>)、小于(<)、大于等于(>=)、小于等于(<=)、不等(!=)、相等(==)。所有的关系运算返回值类型为布尔型。
范例:做一个大小关系的判断

public class JavaDemo {
public static void main(String args[]) {
int x = 10 ;
int y = 20 ;
boolean flag = x > y ; // false
System.out.println(flag) ;
   }
}

在进行关系判断的时候需要注意的是相等的判断问题。在Java里面“=”表示赋值运算,“==”是内容相同的比较。
范例:判断相等

public class JavaDemo {
public static void main(String args[]) {
int x = 10 ;
int y = 10 ;
boolean flag = x == y ; // true
System.out.println(flag) ;
    }
}

在进行关系运算的时候可以针对所有的基本数据类型,例如:也可以直接使用字符来处理。
范例:在字符处理上使用关系运算

public class JavaDemo {
  public static void main(String args[]) {
    char c = '建' ;
    boolean flag = 24314 == c ; // true
    System.out.println(flag) ;
  }
}

数据类型之间提供有转型支持,所以在进行判断的时候字符会自动转为int而后进行数字的比较。

4.4 三目(赋值)运算符

在进行程序开发的时候三目运算符使用的非常多,合理利用三目运算可以避免一些大范围的程序编写。三目运算符是所谓的赋值运算处理。它是需要设置一个逻辑关系的判断以后才可以进行的赋值操作,基本语法如下:
关系运算?关系满足时的内容:关系不满足时的内容。
范例:判断两个数字的大小,将最大值保存

public class JavaDemo {
  public static void main(String args[]) {
    int x = 10 ;
    int y = 20 ;
// 判断x与y的大小关系来决定最终max变量的内容
    int max = x > y ? x : y ;
    System.out.println(max) ;  //执行结果:20
   }
}

不用三目运算符去编写同样的程序

public class JavaDemo {
  public static void main(String args[]) {
    int x = 10 ;
    int y = 20 ;
// 判断x与y的大小关系来决定最终max变量的内容
    int max = 0 ;
    if (x > y) {
       max = x ;
    } else {
       max = y ;
    }
   System.out.println(max) ;  //执行结果:20
  }
}

三目运算本身也可以进行嵌套处理,也就是说在赋值语句位置上可以进一步吧编写三目运算符。
范例:三目运算嵌套,将三个数字的最大值保存下来

public class JavaDemo {
  public static void main(String args[]) {
    int x = 10 ;
    int y = 20 ;
    int z = 15 ;
    int max = x > y ? (x > z ? x : z) : (y > z ? y : z) ;
    System.out.println(max) ;  //执行结果:20
  }
}

虽然允许进行嵌套处理,但是程序的可读性变得很差,根据实际情况判断是否使用三目运算。

4.5 位运算符

位运算指的是可以直接进行二进制数据的计算处理,主要有:与(&)、或(|)、异或(^)、反码(~)、移位处理。
如果要想理解位操作,则一定要清楚十进制与二进制之间的转换处理逻辑:数字除2取余。
你所不知道的13的二进制表示法
范例:观察与操作,如果两位都是1结果才是1,有一位是0,结果就是0。

public class JavaDemo {
  public static void main(String args[]) {
    int x = 13 ;
    int y = 7 ;
  System.out.println(x & y) ;//执行结果:5
  }
}

13的二进制:00000000000000000000000000001101
7的二进制:00000000000000000000000000000111
&计算:00000000000000000000000000000101
范例:观察或运算,有1位是1结果就是1,2位都是0的结果才是0

public class JavaDemo {
  public static void main(String args[]) {
    int x = 13 ;
    int y = 7 ;
  System.out.println(x | y) ;//执行结果:15
   }
}

13的二进制:00000000000000000000000000001101
7的二进制:00000000000000000000000000000111
|计算:00000000000000000000000000001111
在进行位运算处理的时候还可以进行移位的计算。例如:以2的3次方计算为例。
范例:移位处理

public class JavaDemo {
  public static void main(String args[]) {
    int x = 2 ;
  System.out.println(x << 2) ;
  System.out.println(x) ;
  }
}

2的二进制:
00000000000000000000000000000010
向左移2位:
00000000000000000000000000001000
面试题:请解释&和&&、|和||的区别?
&和|两个运算符可以进行关系运算与逻辑运算;

  • 在进行逻辑运算的时候所有的判断条件都要执行;
  • 在进行位运算的时候只是针对于当前的数据进行与和或处理;

在逻辑运算上还可以使用&&、||;

  • &&:在若干个条件判断的时候,如果前面的条件返回了false,后续的所有条件不再判断最终的结果就是false;
  • ||:在若干个条件判断的时候,如果前面的条件返回了true,后续条件不再执行最终的结果就是true;

想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学
下一篇:带你学《Java编程入门》之五:“直线、分叉、圆圈”--程序逻辑之争
更多Java入门编程文章查看此处

相关文章
|
2月前
|
Java 程序员
Java编程中的异常处理:从基础到高级
在Java的世界中,异常处理是代码健壮性的守护神。本文将带你从异常的基本概念出发,逐步深入到高级用法,探索如何优雅地处理程序中的错误和异常情况。通过实际案例,我们将一起学习如何编写更可靠、更易于维护的Java代码。准备好了吗?让我们一起踏上这段旅程,解锁Java异常处理的秘密!
|
1月前
|
自然语言处理 Java
Java中的字符集编码入门-增补字符(转载)
本文探讨Java对Unicode的支持及其发展历程。文章详细解析了Unicode字符集的结构,包括基本多语言面(BMP)和增补字符的表示方法,以及UTF-16编码中surrogate pair的使用。同时介绍了代码点和代码单元的概念,并解释了UTF-8的编码规则及其兼容性。
104 60
|
2月前
|
存储 Java
java中的常见运算符的计算方式
本文介绍了计算机中二进制数的原码、反码和补码的概念及其转换方式。原码是符号位加真值的绝对值;反码中正数不变,负数其余位取反;补码在反码基础上加1。文章还详细解释了Java中的常见运算符(如按位与、或、异或、移位等)如何基于二进制进行计算,并探讨了使用补码的原因,包括统一符号位处理和扩展表示范围。通过具体代码示例帮助理解这些概念。
java中的常见运算符的计算方式
|
2月前
|
存储 缓存 Java
Java 并发编程——volatile 关键字解析
本文介绍了Java线程中的`volatile`关键字及其与`synchronized`锁的区别。`volatile`保证了变量的可见性和一定的有序性,但不能保证原子性。它通过内存屏障实现,避免指令重排序,确保线程间数据一致。相比`synchronized`,`volatile`性能更优,适用于简单状态标记和某些特定场景,如单例模式中的双重检查锁定。文中还解释了Java内存模型的基本概念,包括主内存、工作内存及并发编程中的原子性、可见性和有序性。
Java 并发编程——volatile 关键字解析
|
2月前
|
算法 Java 调度
java并发编程中Monitor里的waitSet和EntryList都是做什么的
在Java并发编程中,Monitor内部包含两个重要队列:等待集(Wait Set)和入口列表(Entry List)。Wait Set用于线程的条件等待和协作,线程调用`wait()`后进入此集合,通过`notify()`或`notifyAll()`唤醒。Entry List则管理锁的竞争,未能获取锁的线程在此排队,等待锁释放后重新竞争。理解两者区别有助于设计高效的多线程程序。 - **Wait Set**:线程调用`wait()`后进入,等待条件满足被唤醒,需重新竞争锁。 - **Entry List**:多个线程竞争锁时,未获锁的线程在此排队,等待锁释放后获取锁继续执行。
77 12
|
2月前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
93 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
2月前
|
存储 安全 Java
Java多线程编程秘籍:各种方案一网打尽,不要错过!
Java 中实现多线程的方式主要有四种:继承 Thread 类、实现 Runnable 接口、实现 Callable 接口和使用线程池。每种方式各有优缺点,适用于不同的场景。继承 Thread 类最简单,实现 Runnable 接口更灵活,Callable 接口支持返回结果,线程池则便于管理和复用线程。实际应用中可根据需求选择合适的方式。此外,还介绍了多线程相关的常见面试问题及答案,涵盖线程概念、线程安全、线程池等知识点。
207 2
|
3月前
|
设计模式 Java 开发者
Java多线程编程的陷阱与解决方案####
本文深入探讨了Java多线程编程中常见的问题及其解决策略。通过分析竞态条件、死锁、活锁等典型场景,并结合代码示例和实用技巧,帮助开发者有效避免这些陷阱,提升并发程序的稳定性和性能。 ####
|
3月前
|
缓存 Java 开发者
Java多线程编程的陷阱与最佳实践####
本文深入探讨了Java多线程编程中常见的陷阱,如竞态条件、死锁和内存一致性错误,并提供了实用的避免策略。通过分析典型错误案例,本文旨在帮助开发者更好地理解和掌握多线程环境下的编程技巧,从而提升并发程序的稳定性和性能。 ####
|
2月前
|
监控 架构师 Java
Java虚拟机调优的艺术:从入门到精通####
本文作为一篇深入浅出的技术指南,旨在为Java开发者揭示JVM调优的神秘面纱,通过剖析其背后的原理、分享实战经验与最佳实践,引领读者踏上从调优新手到高手的进阶之路。不同于传统的摘要概述,本文将以一场虚拟的对话形式,模拟一位经验丰富的架构师向初学者传授JVM调优的心法,激发学习兴趣,同时概括性地介绍文章将探讨的核心议题——性能监控、垃圾回收优化、内存管理及常见问题解决策略。 ####