++i与i++
i++;
++i;
单独的一条语句++i,i++没有区别
int i=1;
System.out.println(i++);
int i=1;
System.out.println(++i);
i++; 先取值,再运算
++i; 先运算,再取值
int i=1;
int j=++i + i++ + ++i + ++i + i++;
/*2+2+4+5+5*/
System.out.println(j);
==是值相等还是地址
==运算符表示指向字符串的引用是否相同
基本数据类型,存储直接是值, 不存地址,所以==是比较值;
而java中字符串的值是不可改变的,相同的字符串在内存中只会存一份,i,j指向的是同一对象
String i="hello";
String j="hello";
int a=1;
int b=1;
System.out.println(a==b);
System.out.println(i==j);
而new了一个新的String对象后i,j的地址就不同了
String i="hello";
String j=new String("hello");
System.out.println(i==j);
所以比较字符串的内容是否相等还是用equals
String i="hello";
String j=new String("hello");
System.out.println(i==j);
System.out.println(i.equals(j));
注:对于基础类型,==相对宽松,不同的基础数据类型允许类型转换,而 === 相对严格,与 ==的区别在与不运行类型转换(js)
int a=1;
float b=1;
System.out.println(a==b);
& 和 &&(与),| 和 | | (或)
&&是逻辑与运算符,&是位运算符与,&&又叫短路运算符
按位与:a&b是把a和b都转换成二进制数然后再进行与的运算
逻辑与:a&&b就是当且仅当两个操作数均为true时,其结果才为true;只要有一个为false,a&&b就为false
& 不管前面的条件是否正确,后面都执行
&& 前面条件正确时,才执行后面,不正确时,就不执行(所以称为短路运算符)
int i=1;
System.out.println(i==2 & i++ ==2);
System.out.println(i);
i==2为false,继续执行了i++ == 2;
int i=1;
System.out.println(i==2 && i++ ==2);
System.out.println(i);
i==2为false,直接结束不运行后面的运算单元
||是逻辑或运算符,|是按位或操作,||也称为短路或
与&,&&类似
按位或:a | b是把a和b都转换成二进制数然后再进行或的运算
逻辑或:a | | b就是当且仅当两个操作数均为false时,其结果才为false;只要有一个为true,a | | b就为true
| 不管前面的条件是否正确,后面都执行
| | 前面条件正确时,不执行后面
int i=1;
int j=1;
System.out.println(i==1 || i++ ==2);
System.out.println("i="+i);
System.out.println(j==1 | j++ ==2);
System.out.println("j=="+j);
就效率来说&&和||更好一些
位操作符<<、>>、>>>
<<表示左移移,不分正负数,低位补0;
>>表示右移,如果该数为正,则高位补0,若为负数,则高位补1;
>>>表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0
int i=8;
int j=-7;
//8的二进制表示1000,-7二进制表示为补码
System.out.println(Integer.toBinaryString(i)+","+Integer.toBinaryString(j));
//8,-7左移两位
System.out.println("8左移两位:"+(i<<2)+" 二进制表示:"+Integer.toBinaryString(i<<2));
System.out.println("-7左移两位:"+(j<<2)+" 二进制表示:"+Integer.toBinaryString(j<<2));
//8,-7右移两位
System.out.println("8右移两位:"+(i>>2)+" 二进制表示:"+Integer.toBinaryString(i>>2));
System.out.println("-7右移两位:"+(j>>2)+" 二进制表示:"+Integer.toBinaryString(j>>2)+"长度:"+Integer.toBinaryString(j>>2).length());
//>>>无符号右移
System.out.println("-7无符号右移两位:"+(j>>>2)+"二进制表示:"+Integer.toBinaryString(j>>>2)+"长度:"+Integer.toBinaryString(j>>>2).length());
三元操作符 - 表达式?值1 :值2
表达式?值1:值2
如果表达式为真 返回值1
如果表达式为假 返回值2
int i=1;
int j= i==1 ? 2 : 3;
System.out.println(j);
可以用三元操作符替代简单的if-else语句,明显简洁多了
运算符优先级
在运算过程中,需要注意运算符优先级
百度:运算符优先级