Java初级基础之关于运算符的一些细节

简介: Java初级基础之关于运算符的一些细节

一.关于++、–、算数运算符不改变数据类型

我们都知道在Java中byte、short、char 它们之间做数值计算的时候计算的结果都会变成int类型,如何把一个数值简单的去加一或减一结果还是原来的数据类型呢,这个时候我们会用到++或–算数运算符,例子如下:

public static void main(String[] args) {
    

        short s = 1;
        //s = s + 1; //编译报错,在Java中byte、short、char 它们之间做数值计算的时候计算的结果都会变成int类型;
        //传统方法,强制转换
        s = (short)(s +1);
        //++算数运算不改变原有变量的数据类型
        s++;
        --s;
        System.out.println(s);


        char c = 97;
        System.out.println(c);
        c++;
        System.out.println(c);

        

    }

输出结果:

2
a
b

Process finished with exit code 0

二.关于+=、-=、*=、/=、%= 、<<= 、>>=赋值运算符不改变数据类型

同上述一中所提到的,如果我们需要把某个变量的值在不改变自身数据类型的情况下加上其他的数值,我们应该如何去做呢,上面我们已经提到过了在Java中byte、short、char 它们之间做数值计算的时候计算的结果都会变成int类型,这个时候就需要用到我们的+=、-=等赋值运算符了。
关于+=、-=、*=、/=、%= 赋值运算符不改变数据类型例子如下:

public static void main(String[] args) {
      
        char c = 97;
        System.out.println(c);
        //c = c +3; //编译报错
        //传统方式
        c = (char) (c + 3);
        System.out.println(c);
        //用-=赋值运算符
        c -= 3;
        System.out.println(c);
        //用+=赋值运算符
        c += 3;
        System.out.println(c);

        //用/=赋值运算符
        c /= 2;
        System.out.println(c);
        //用*=赋值运算符
        c *= 2;
        System.out.println(c);

        //用%=赋值运算符
        c %= 52;
        System.out.println(c);
    }

输出结果:

a
d
a
d
2
d
0

Process finished with exit code 0


关于<<= 、>>=赋值运算符不改变数据类型例子如下:

byte b = 0b00000001;
System.out.println(b);
for (int i = 0; i < 9; i++) {
        
    //b = b << 1;//编译报错,b<<1运算后其结果为int类型,
    // 可以强制类型转换,写成b = (byte)(b << 1);

    //<<= 、>>=赋值运算符不改变数据类型
    b <<= 1;
    System.out.println(b);
}

输出结果:

1 2 4 8 16 32 64 -128 0 0 Process finished with exit code 0 

三.关于& 与 &&、| 与 || 逻辑运算符的区别

区分& 与 &&
相同点1:& 与 && 的运算结果相同
相同点2:当符号左边是true时,二者都会执行符号右边的运算
不同点:当符号左边是false时,&继续执行符号右边的运算。&&不再执行符号右边的运算。
开发中,推荐使用&&

区分:| 与 ||
相同点1:| 与 || 的运算结果相同
相同点2:当符号左边是false时,二者都会执行符号右边的运算
不同点3:当符号左边是true时,|继续执行符号右边的运算,而||不再执行符号右边的运算
开发中,推荐使用||

/** * @Author: YuShiwen * @Date: 2020/11/10 8:39 PM * @Version: 1.0 */ public class LogicTest {
           public static boolean printNumber(int i){
           System.out.println("第"+i+"次调用该静态方法"); return true; } public static void main(String[] args) {
           //区分& 与 && //相同点1:& 与 && 的运算结果相同 //相同点2:当符号左边是true时,二者都会执行符号右边的运算 //不同点:当符号左边是false时,&继续执行符号右边的运算。&&不再执行符号右边的运算。 //开发中,推荐使用&& if(true & printNumber(1)){
           } if(true && printNumber(2)){
           } if(false & printNumber(3)){
           } if(false && printNumber(4)){
           } // 区分:| 与 || //相同点1:| 与 || 的运算结果相同 //相同点2:当符号左边是false时,二者都会执行符号右边的运算 //不同点3:当符号左边是true时,|继续执行符号右边的运算,而||不再执行符号右边的运算 //开发中,推荐使用|| if(false | printNumber(5)){
           } if(false || printNumber(6)){
           } if(true | printNumber(7)){
           } if(true || printNumber(8)){
           } } } 

输出结果

1次调用该静态方法 第2次调用该静态方法 第3次调用该静态方法 第5次调用该静态方法 第6次调用该静态方法 第7次调用该静态方法 Process finished with exit code 0 

四.关于<<、>>位运算符

位运算符操作的都是整型的数据<< :在一定范围内,每向左移1位,相当于 * 2
>> :在一定范围内,每向右移1位,相当于 / 2
举例:
public static void main(String[] args) {
             System.out.println(8 * 2); System.out.println(8 << 1); System.out.println(8 / 2); System.out.println(8 >> 1); System.out.println(8 / 4); System.out.println(8 >> 2); } 

输出:

16 16 4 4 2 2 Process finished with exit code 0 
运用:2*8、2<<3、8<<1 哪种方式效率比较高
public static void main(String[] args) {
               int num = 0; long startTime = System.currentTimeMillis(); for(int i = 0;i<100000;i++){
               num = 2*8; } long endTime = System.currentTimeMillis(); System.out.println(endTime-startTime); startTime = System.currentTimeMillis(); for(int i = 0;i<100000;i++) {
               num = 2 << 3; } endTime = System.currentTimeMillis(); System.out.println(endTime-startTime); startTime = System.currentTimeMillis(); for(int i = 0;i<100000;i++){
               num = 8 << 1; } endTime = System.currentTimeMillis(); System.out.println(endTime-startTime); } 

第一次运行结果:

64 20 1 Process finished with exit code 0 

第二次运行结果:

34 22 2 Process finished with exit code 0 

第三次运行结果:

27 3 2 Process finished with exit code 0 

可以看到28运算的速度是最慢的,2<<3速度比28快,8<<1最快。

五.三元运算符

结构:(条件表达式)? 表达式1 : 表达式2

说明
① 条件表达式的结果为boolean类型
② 根据条件表达式真或假,决定执行表达式1,还是表达式2.
如果表达式为true,则执行表达式1。
如果表达式为false,则执行表达式2。
③ 表达式1 和表达式2要求是一致的。
④ 三元运算符可以嵌套使用

凡是可以使用三元运算符的地方,都可以改写为if-else;反之,不成立。

如果程序既可以使用三元运算符,又可以使用if-else结构,那么优先选择三元运算符。原因:简洁、执行效率高。

public class TernaryOperator {
                   public static void main(String[] args) {
                   int m = 10; int n = 20; //一般使用举例 System.out.println((m > n ) ? m:n); //编译报错 //表达式1 和表达式2要求是一致的 //String s = (m > n) ? 20:"hello"; //三元运算的嵌套使用: int t = 30; int max0 = (((m > n) ? m:n) > t) ? ((m > n) ? m:n):t; //不建议这样写,可读性太差 System.out.println(max0); //建议如下写法 int max1 = (m > n) ? m : n; int max2 = (max1 > t) ? max1 : t; System.out.println(max2); } } 

输出结果

20 30 30 Process finished with exit code 0 
目录
相关文章
|
Java 编译器 程序员
Java编程思想第五版精粹(四)-运算符
Java编程思想第五版精粹(四)-运算符
122 0
|
安全 Java 编译器
Java编程思想第五版(On Java8)(四)-运算符(下)
Java编程思想第五版(On Java8)(四)-运算符(下)
133 0
|
缓存 移动开发 Java
Java编程思想第五版(On Java8)(四)-运算符(中)
Java编程思想第五版(On Java8)(四)-运算符(中)
138 0
|
Java 编译器 程序员
Java编程思想第五版(On Java8)(四)-运算符(上)
Java编程思想第五版(On Java8)(四)-运算符(上)
101 0
|
3天前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
36 14
|
6天前
|
安全 Java 程序员
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
34 13
|
7天前
|
安全 Java 开发者
【JAVA】封装多线程原理
Java 中的多线程封装旨在简化使用、提高安全性和增强可维护性。通过抽象和隐藏底层细节,提供简洁接口。常见封装方式包括基于 Runnable 和 Callable 接口的任务封装,以及线程池的封装。Runnable 适用于无返回值任务,Callable 支持有返回值任务。线程池(如 ExecutorService)则用于管理和复用线程,减少性能开销。示例代码展示了如何实现这些封装,使多线程编程更加高效和安全。
|
1月前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
109 17
|
2月前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
1月前
|
缓存 安全 算法
Java 多线程 面试题
Java 多线程 相关基础面试题