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 
目录
相关文章
|
2月前
|
Java
Java运算符
Java运算符
49 12
|
3月前
|
Java 测试技术 数据处理
Java零基础教学(17):Java运算符详解
【8月更文挑战第17天】Java零基础教学篇,手把手实践教学!
64 4
|
1月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
67 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
25天前
|
算法 Java 测试技术
🌟Java 零基础 | 详解 单目运算符
【10月更文挑战第14天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
33 7
|
26天前
|
Java 测试技术 开发者
🌟Java 零基础 | 深入理解三目运算符
【10月更文挑战第13天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
18 3
|
27天前
|
Java 测试技术 开发者
🌟Java零基础-Lambda运算符详解 🌟
【10月更文挑战第12天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
22 1
|
1月前
|
Java
JAVA易错点详解(数据类型转换、字符串与运算符)
JAVA易错点详解(数据类型转换、字符串与运算符)
50 4
|
1月前
|
安全 Java 测试技术
🌟 Java 零基础 | 详解 instanceof 运算符
【10月更文挑战第1天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
30 1
|
1月前
|
存储 Java C语言
【一步一步了解Java系列】:了解Java与C语言的运算符的“大同小异”
【一步一步了解Java系列】:了解Java与C语言的运算符的“大同小异”
39 3
|
2月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)