Bootstrap

Java菜鸟养成计划(java基础)--java运算符

1、java中的运算符

  • 最小单位是int

1.1 、+ 、-、 * 、/ 、 %

  • +运算

    • 算数加法
      • 在基本数据类型使用时做加法
      • 运算结果如果赋值给取值范围小于int的数据类型时,注意强转
       int x = 10;
       char c1 = 'c'+x; //注意此时需要强转,因为此时已经声明变量x为int 
    
    • 追加连接
      • String + String
  • -运算

    • 算数减法
  • *运算
    - 防止计算过程越界=>及时更换取值范围大的类型

  • /运算

    • 除法运算过程中不要出现0
  • %【模运算】

    • 运算结果的符号取决于参与运算的第一个数字的符号【%运算符左侧的数字】
	System.out.println(5%2);//1
	System.out.println(-5%2);//-1
	System.out.println(5%-2);//1
	System.out.println(-5%-2);//-1

1.2 、+=、-=、 *=、/=、%=

  • 这一组运算符保证左侧类型不变 ----- 底层可能隐式强转
	short x = 45;
	x = x + 10;// 报错 int => short
	// 解决:x = (short)(x+10);
	
	short y = 45;
	y += 10; // 底层隐式强转
	
	
	int x = 45;// 【*】 类似
	// x = x + 10; 
	x+=10;
	// x = 10 + x;// 变成x=x+10
	x+=10;
	
	int y = 55;// 【/类似】
	y = y - 10;
	y -= 10;
	
	/**
		y = 10-y;
		不能改写 y-=10;
	*/

1.3 、++、–【自增\自减运算符】

	x++:先取值 再运算
	++x:先运算 再取值

	x--:先取值 在运算
	--x:先运算 再取值

1.4、>、 <、 >= 、<= 、== 、!= 、! =

  • 成立/不成立
  • !=
    • 判断左右两侧的数据是否不相等
  • = 和 == 有什么区别
    • =:赋值运算符,将符号右侧的内容交给左侧变量保存
    • == :条件判断 判断左右两侧的内容是否一致
      • 在进行基本数据类型的比较时比较的是内容
      • 引用数据类型的比较时比较的是地址
  • !取反运算符【用在boolean】
    • !true => false
    • !false => true

1.5、&&、||、|、&

面试题:&&和&的区别
相同点:都是逻辑与
不同点:&&又叫“短路与”,具有短路特性,当&&左侧运行结果为false时,右侧不在执行;&不具备短路特性,当左侧为false时,右侧依然执行

||和|的区别
相同点:都是逻辑或
不同点:||又叫短路或,具有短路特性,当||左侧的结果为true时,右侧不在执行;|不具备短路特性,左侧为true右侧仍然执行

1.6、&、|、~、^


&按位与【逢009&5
    00001001
    00000101 &
    00000000 => 1

|按位或【逢119|5
    00001001
    00000101 |
    00001101
~按位取反 【1->0 0->1~9
    ~00001001
     11110110
^按位异或【想通为0 不同为100001001
    00000101^
    00001100 => 12

  • 在某种情况下&可以取代%运算
%2 %4 %8 %16 ... %2(n)
&1 &3 &7 &15 ... &2(n)-1
如果(num&num-1) == 0 就表示num是2的n次方
  • 交换两个变量的内容
    • 开辟第三块空间
int x = 10;
int y = 1;
int temp = x;
x = y;
y = temp;
  • 不开辟第三块空间
//使用三次异或
int x = 10;
int y = 1;
x = x ^ y;
y = x ^ y;
x = x ^ y;

1.7、>> 、 <<、>>>位运算

byte x = 10;
x >> 2
00001010 >> 2
00000010
    
byte y = 7;
y << 2
00000111 << 2
00011100
    
** 效率取代[* /]
    << 取代 *
    *2 *4 *8 ... *2(n)
    <<1 <<2 <<3 .. <n
    
    00001010 << 1
    00010100 => 4+16 = 20
	
    >> 取代 /
    /2 /4 /8 ... /2(n)
    >>1 >>2 >>3 ... >>n
	10/2=5
    00001010 >> 1
    00000101 => 5
  • 效率取代
num%2(n) => num&2(n)-1
num*2(n) => num<<2(n)-1
num/2(n) => num>>2(n)-1

1.8、?:三目运算符

  • boolean?2:3
    • 第一部分肯定为boolean类型
    • 如果第一部分为true执行2
    • 如果第一部分为false执行3

boolean?2:3
    2/3有数字有char
    检验数字有没有在char范围内
    在char范围内 2/3char类型转
    不在char分为内 将数字直接理解为int 2/3int转【char类型变成对应的ASCII
;