运算符

运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。

  • 算术运算符

  • 赋值运算符

  • 比较运算符(关系运算符)

  • 逻辑运算符

  • 位运算符

  • 三元运算符

算术运算符

  1. class AriTest{
  2. public static void main(String[] args){
  3. //除号
  4. int num1 = 12;
  5. int num2 = 5;
  6. int result1 = num1/num2;
  7. System.out.println(result1);//2
  8. int result2 = num1 / num2 * num2;
  9. System.out.println(result2);//10
  10. double result3 = num1 / num2;//先运算为int型,值为2,在自动转换成double
  11. System.out.println(result3);//2.0
  12. double result4 = num1 / num2 + 0.0;//2.0
  13. double result5 = num1 / (num2 + 0.0);//2.4
  14. double result6 = (double)num1 / num2;//2.4
  15. double result7 = (double)(num1 / num2);//2.0
  16. System.out.println(result5);
  17. System.out.println(result6);
  18. //%取余运算
  19. //结果的符号与被模数的符号相同,被模数是12或-12
  20. //开发中经常使用%来判断能否被除尽的情况
  21. int m1 = 12;
  22. int n1 = 5;
  23. System.out.println("m1 % n1 = " + m1 % n1);//2
  24. int m2 = -12;
  25. int n2 = 5;
  26. System.out.println("m2 % n2 = " + m2 % n2);//-2
  27. int m3 = 12;
  28. int n3 = -5;
  29. System.out.println("m3 % n3 = " + m3 % n3);//2
  30. int m4 = -12;
  31. int n4 = -5;
  32. System.out.println("m4 % n4 = " + m4 % n4);//-2
  33. //++(A):先自增1,后运算
  34. //(A)++:先运算,后自增1
  35. int a1 = 10;
  36. int b1 = ++a1;
  37. System.out.println("a1= " + a1 + ",b1 = " + b1);//11 11
  38. int a2 = 10;
  39. int b2 = a2++;
  40. System.out.println("a2= " + a2 + ",b2 = " + b2);//11 10
  41. //注意点
  42. short s1 = 10;
  43. //s1 = s1 + 1;//编译失败
  44. //s1 = (short)(s1 + 1 );//正确的
  45. s1++;//自增1不会改变变量类型
  46. System.out.println(s1);
  47. //问题
  48. byte bb1 = 127;
  49. bb1++;
  50. System.out.println("bb1 = " + bb1);
  51. //(前)--:先自减1,后运算
  52. //(后)--:先运算,后自减1
  53. }
  54. }

赋值运算符

符号:=

  • 当“=”两侧数据类型不一致时,可以使用自动类型转换或使用强制类型转换原则进行处理

  • 支持连续赋值

  • 扩展赋值运算符: +=, -=, *=, /=, %=

    1. /*
    2. 运算符之二: 赋值运算符
    3. = += -= *= /= %=
    4. */
    5. class SetValueTest {
    6. public static void main(String[] args) {
    7. //赋值符号: =
    8. int i1 = 10;
    9. int j1 = 10;
    10. //连续赋值
    11. int i2,j2;
    12. i2 = j2 = 10;
    13. int i3 = 10,j3 = 20;
    14. //***************
    15. int num1 = 10;
    16. num1 += 2;//num1 = num1 + 2;
    17. System.out.println(num1);//12
    18. int num2 = 10;
    19. num2 %= 5;//num2 = num2 % 5;
    20. System.out.println(num2);//0
    21. short s1 = 10;
    22. //s1 = s1 + 2;//编译失败
    23. s1 += 2;//不会改变变量本身的数据类型
    24. System.out.println(s1);
    25. //开发中,如果希望变量实现+2的操作,有几种方法?(前提int num = 10;)
    26. //方式1: num = num + 1;
    27. //方式2:num += 2;(推荐)
    28. //开发中,如果希望变量实现+1的操作,有几种方法?(前提int num = 10;)
    29. //方式1: num = num + 1;
    30. //方式2:num += 1;
    31. //方式3:num ++;(推荐)
    32. //练习1
    33. int i = 1;
    34. i *= 0.1;//不改变数据类型
    35. System.out.println(i);//0
    36. i++;
    37. System.out.println(i);//1
    38. //练习2
    39. int m = 2;
    40. int n = 3;
    41. n *= m++;//n = n * m++;
    42. System.out.println("m=" + m);//3
    43. System.out.println("n=" + n);//6
    44. //练习3
    45. int n3 = 10;
    46. n3 += (n3++) + (++n3);//n3 = n3 + (n3++) + (++n3);
    47. System.out.println(n3);//32
    48. }
    49. }

比较运算符

  • 比较运算符的结果都是boolean型,也就是要么是true,要么是false。

  • 比较运算符“==”不能误写成“=”

    • 1.> < >= <=:只能使用在数值类型的数据之间

    • == 和 !=:不仅可以使用在数值类型的数据之间,还可以使用在其他引用类型变量之间

      1. Account acct1 = new Account(1000);
      2. Account acct2 = new Account(1000);
      3. acct1 == acct2;//比较两个Account是否是同一个账户
      4. boolean b2 = (acct1 != acct2);//
  1. /*
  2. 运算符之三:比较运算符
  3. == != > < >= <= instanceof
  4. 结论:
  5. 1.比较运算符的结果是boolean类型
  6. 2.区分 == 和 =
  7. */
  8. class CompareTest {
  9. public static void main(String[] args) {
  10. int i = 10;
  11. int j = 20;
  12. System.out.println(i == j);//false
  13. System.out.println(i = j);//20
  14. boolean b1 = true;
  15. boolean b2 = false;
  16. System.out.println(b2 == b1);//false
  17. System.out.println(b2 = b1);//true
  18. }
  19. }

逻辑运算符

  • &—逻辑与 | —逻辑或 !—逻辑非 && —短路与 || —短路或 ^ —逻辑异或

  • 逻辑运算符用于连接布尔型表达式,在Java中不可以写成33 & x<6 。

  • “&”和“&&”的区别:

    • 单&时,左边无论真假,右边都进行运算;

    • 双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。
      “|”和“||”的区别同理,||表示:当左边为真,右边不参与运算。
      理解:异或,追求的是“异”!

  1. class LogicTest {
  2. public static void main(String[] args) {
  3. //& 和 &&
  4. //相同点1:& 与 && 的运算结果相同
  5. //相同点2:当符号左边是true时,二者都会执行符号右边的运算
  6. //不同点3:当符号左边是false时,&继续执行符号右边的运算。&&不在执行(短路)
  7. //推荐使用&&
  8. boolean b1 = false;
  9. int num1 = 10;
  10. if(b1 & (num1++ > 0)){
  11. System.out.println("我现在在北京");
  12. }else {
  13. System.out.println("我现在在南京");
  14. }
  15. System.out.println("num1 = " + num1);
  16. boolean b2 = false;
  17. int num2 = 10;
  18. if(b2 && (num2++ > 0)){
  19. System.out.println("我现在在北京");
  20. }else {
  21. System.out.println("我现在在南京");
  22. }
  23. System.out.println("num2 = " + num2);
  24. //区分: |与||
  25. //相同点1:& 与 && 的运算结果相同
  26. //相同点2:当符号左边是false时,二者都会执行符号右边的运算
  27. //不同点3:当符号左边是true时,|继续执行符号右边的运算。||不在执行(短路)
  28. //推荐使用||
  29. boolean b1 = false;
  30. boolean b3 = false;
  31. b3 = true;
  32. int num3 = 10;
  33. if(b3 || (num3++ > 0)){
  34. System.out.println("我现在在北京");
  35. }else {
  36. System.out.println("我现在在南京");
  37. }
  38. System.out.println("num3 = " + num3);
  39. boolean b4 = false;
  40. b4 = true;
  41. int num4 = 10;
  42. if(b4 | (num4++ > 0)){
  43. System.out.println("我现在在北京");
  44. }else {
  45. System.out.println("我现在在南京");
  46. }
  47. System.out.println("num4 = " + num4);
  48. }
  49. }

特别说明:

  • 逻辑运算符操作的都是boolean类型的变量,而且结果也是boolean类型

位运算符

运算符之五:位运算符(了解)

结论:

  1. 位运算符操作的都是整型的数据
  2. <<:在一定范围内,每向左移1位,相当于*2;
    <<:在一定范围内,每向右移1位,相当于/2;

面试题:最高效的方式计算2*8? 2 << 3 或 8 <<1

  1. /*
  2. 运算符之五:位运算符(了解)
  3. 结论:
  4. 1.位运算符操作的都是整型的数据
  5. 2.<<:在一定范围内,每向左移1位,相当于*2;
  6. <<:在一定范围内,每向右移1位,相当于/2;
  7. 面试题:最高效的方式计算2*8? 2 << 3 或 8 <<1
  8. */
  9. class BitTest {
  10. public static void main(String[] args) {
  11. int i = 21;
  12. i = -21;
  13. System.out.println("i << 2 :" + (i << 2));
  14. System.out.println("i << 3 :" + (i << 3));
  15. //练习:交换两个变量的值
  16. int num1 = 10;
  17. int num2 = 20;
  18. System.out.println("num1 = " + num1 + ",num2 = " + num2);
  19. //方式一:定义临时变量的方式
  20. //int temp = num1;
  21. //num1 = num2;
  22. //num2 = temp;
  23. //方式二:好处:不用定义临时变量
  24. //弊端:1.相加操作可能超出存储范围 2.有局限性,只能适用于数值类型
  25. //num1 = num1 + num2;//和
  26. //num2 = num1 - num2;//原来num1的值
  27. //num1 = num1 - num2;//和 - 原来num1的值
  28. //方式三:使用位运算符
  29. //2.有局限性,只能适用于数值类型
  30. num1 = num1 ^ num2;
  31. num2 = num1 ^ num2;//原来num1的值
  32. num1 = num1 ^ num2;
  33. System.out.println("num1 = " + num1 + ",num2 = " + num2);
  34. }
  35. }

三元运算符

运算符之六:三元运算符

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

  2. 说明

    • 条件表达式的结果为boolean类型
    • 根据条件表达式的真或假,决定执行表达式1,还是表达式2
      如果表达式为true,则执行表达式1
      如果表达式为false,则执行表达式2
    • 表达式1和表达式2要求是一致的
    • 三元运算符可以嵌套使用
  3. 凡是可以使用三元运算符的地方,都可以改写成if-else,反之,不成立

  4. 如果程序既可以使用三元运算符又可以使用if-else语句,使用三元运算符,执行效率高,简洁

  1. /*
  2. 运算符之六:三元运算符
  3. 1.结构:(条件表达式)?表达式1:表达式2
  4. 2.说明
  5. ①条件表达式的结果为boolean类型
  6. ②根据条件表达式的真或假,决定执行表达式1,还是表达式2
  7. 如果表达式为true,则执行表达式1
  8. 如果表达式为false,则执行表达式2
  9. ③表达式1和表达式2要求是一致的
  10. ④三元运算符可以嵌套使用
  11. 3.
  12. 凡是可以使用三元运算符的地方,都可以改写成if-else
  13. 反之,不成立
  14. 4.如果程序既可以使用三元运算符又可以使用if-else语句,使用三元运算符,执行效率高,简洁
  15. */
  16. class SanYuanTest {
  17. public static void main(String[] args) {
  18. //获取两个整数的较大值
  19. int m = 12;
  20. int n = 5;
  21. int max = (m > n)?m : n;
  22. System.out.println(max);
  23. double num = (m > n)?2 : 1.0;
  24. //表达式1和表达式2没有统一类型,编译错误
  25. //(m > n)? 2 : "n大";
  26. //***********************
  27. String maxStr = (m > n)? "m大" : "n大";
  28. String maxStr1 = (m > n)? "m大" : ((m == n)? "m和n相等" : "n大");
  29. System.out.println(maxStr);
  30. //***********************
  31. //获取三个数的最大值
  32. int n1 = 12;
  33. int n2 = 30;
  34. int n3 = -42;
  35. int max1 = (n1 > n2)? n1 : n2;
  36. int max2 = (n3 > max1)? n3 : max1;
  37. System.out.println("三个数的最大值为:" + max2);
  38. }
  39. }