目录
2.1、&&短路与:如果第一个条件为false,则第二个条件不会判断,最终结果为false,效率高;
2.2、&逻辑与:不管第一个条件是否为false,第二个条件都要判断,效率低;
3.1、||短路或:如果第一个条件为true,则第二个条件不会判断,最终结果为true,效率高;
3.2、|逻辑或:不管第一个条件是否为true,第二个条件都要判断,效率低;
5、一道很有陷阱的面试题:(注意=和==,++z和z++的区别)
1.2、复合赋值运算符: += ;-=;*=;/=;%=等(如a += b即为a = a + b,其它同理);
1、表达式1 和 表达式2 要为可以赋给接收变量的类型(或可以自动转换),否则必须强转;
3.负数的反码=它的原码符号位不变,其它位取反(0->1,1->0);
6、 java没有无符号数,换言之,java中的数都是有符号的;
1、算术右移(>>):低位溢出,符号位不变,用符号位补溢出的高位;
3、逻辑右移(>>>):也叫无符号右移,低位溢出,高位补0;
一、算术运算符
//特别注意:java中 / 向下取整;% 取余运算,结果正负号与被余数一致;
10 / 3 = 3;
-10 / 3 = -3;
10 % 3 = 1;
-10 % 3 = -1;
10 % -3 = 1;
-10 % -3 = -1;
二、关系运算符(比较运算符)
三、逻辑运算符
1、所及运算符类别:
1.1、a&b :
&叫逻辑与:规则:当a和b同时为true ,则结果为true,否则为false;
1.2、a&&b :
&&叫短路与:规则:当a和b同时为true ,则结果为true,否则为false;
1.3、a|b:
|叫逻辑或,规则:当a和b,有一个为true ,则结果为true,否则为false;
1.4、a||b:
||叫短路或,规则:当a和b,有一个为true ,则结果为true,否则为false;
1.5、!a:
叫取反,或者非运算。当a为true,则结果为false,当a为false是,结果为true;
1.6、a^b:
叫逻辑异或,当a和b不同时,则结果为true,否则为false。
2、&& 和 & 的区别:
2.1、&&短路与:如果第一个条件为false,则第二个条件不会判断,最终结果为false,效率高;
2.2、&逻辑与:不管第一个条件是否为false,第二个条件都要判断,效率低;
2.3、开发中,我们使用的基本是短路与&&,效率高;
3、|| 和 | 的区别:
3.1、||短路或:如果第一个条件为true,则第二个条件不会判断,最终结果为true,效率高;
3.2、|逻辑或:不管第一个条件是否为true,第二个条件都要判断,效率低;
3.3、开发中,我们基本使用 || ;
4、! 和 ^:
System.out.println(5 < 10);//true
System.out.println(!(5 < 10));//false
System.out.println((5 < 10)^(3 > 2));//false
System.out.println((5 < 10)^(3 < 2));//true
5、一道很有陷阱的面试题:(注意=和==,++z和z++的区别)
public class Test {
public static void main(String[] args) {
boolean x = true;
boolean y = false;
short z = 46;
if((z++==46) && (y=true)) z++;
if((x=false) || (++z==49)) z++;
System.out.println(z);
}
}
四、赋值运算符
1、赋值运算符的分类:
1.1、基本赋值运算符:=;
1.2、复合赋值运算符: += ;-=;*=;/=;%=等(如a += b即为a = a + b,其它同理);
1.3、复合赋值运算符会进行类型转换;
byte b = 3;
b += 2;//等价 b = (byte)(b + 2);
b++;//等价 b = (byte)(b + 1);
五、三元运算符
public class Test01 {
public static void main(String[] args) {
int a = 10;
int b = 99;
int result = a < b ? a++ : b++;
System.out.println("result="+result);
}
}
形如 int result = a < b ? a++ : b++;
若条件为true,则执行第一个运算;若条件为false,则执行第二个运算;(有点类似于python 的if else)
三元运算符使用细节:
1、表达式1 和 表达式2 要为可以赋给接收变量的类型(或可以自动转换),否则必须强转;
int a = 3;
int b = 8;
int c = a < b ? (int)1.1 : (int)3.4;//使用强转可以
double d = a > b ? a : b + 3;//这种也可以,因为double 比 int精度高
2、三元运算符可以转换成 if else 语句;
int res = a > b ? a++ : --b;
if (a >b ) res = a++;
else res = --b;
六、运算符的优先级
七、标识符的命名规则和规范
标识符命名规范[更加专业]
1、包名:
多单词组成时所有字母都小写: aaa.bbb.ccc //比如com.hsp.crm;
2、类名、接口名:
多单词组成时,所有单词的首字母大写:XxxYyyZzz[大驼峰];
比如:TankShotGame;
3、变量名、方法名:
多单词组成时,第一个单词首字母小写,第二个单词开始每个
单词首字母大写:xxxYyyZzz[小驼峰,简称驼峰法];
比如:tankShotGame;
4、常量名:
所有字母都大写。多单词时每个单词用下划线连度:XXm_u;
比如:定义一个所得税率TAX_RATE;
5、后面我们学习到类,包,接口,等时:
我们的命名规范要这样遵守,更加详细的看文档。
八、键盘输入
import java.util.Scanner;//导入Scanner这个包
public class Input {
public static void main(String[] args) {
//演示接受用户的输入
//1、引入scanner 这个包
//Scanner类表示 简单文本扫描器,
//在java.util包
//2、创建Scanner 对象,new 创建一个对象,
// myScanner 就是 Scanner类的对象
Scanner myScanner = new Scanner(System.in);
//3、接受用户的输入
System.out.println("请输入你的名字");
String name = myScanner.next();//next()方法
System.out.println("请输入你的年龄");
int age = myScanner.nextInt();//next()方法
System.out.println("请输入你的薪水");
double salary = myScanner.nextDouble();
System.out.println("名字是:"+name+'\n'+
"年龄是:"+age+'\n'+
"薪水是:"+salary);
}
}
九、进制
1、四种进制:
int n1 = 0b1010;//二进制以 0b 或 0B 开头
int n2 = 1010;//十进制
int n3 = 01010;//八进制以 0 开头
int n4 = 0x1010;//十六进制以 0x 或 0X 开头,A~F不区分大小写
2、进制的转换(基本功):
略(太基础)
十、原码、反码、补码(重点!!!)
1、二进制的最高位是符号位:0表示 正数,1表示 负数;
2、正数的原码,反码,补码都一样(三码合一);
3.负数的反码=它的原码符号位不变,其它位取反(0->1,1->0);
4、负数的补码=它的反码+1,负数的反码=负数的补码-1;
5、0的反码,补码都是0;
6、 java没有无符号数,换言之,java中的数都是有符号的;
7、在计算机运算的时候,都是以补码的方式来运算的;
8、当我们看运算结果的时候,要看他的原码。
十一、位运算
1、实例1(2&3)
//位运算
public class BitOperator {
public static void main(String[] args) {
//按位与 &
// 1、先得到2的补码:2的原码为
// 00000000 00000000 00000000 00000010
// 2、2为正数,所以补码与原码相同
// 3、3的原码为
// 00000000 00000000 00000000 00000011
// 4、3为正数所以3的补码与原码相同
// 按位与计算,则结果为(补码)
// 00000000 00000000 00000000 00000010
// 结果应以原码展示,所以为
// 00000000 00000000 00000000 00000010
// 所以结果为2
System.out.println(2&3);
}
}
2、实例2(~-2)
//位运算
public class BitOperator02 {
public static void main(String[] args) {
//按位与 &
// 1、先得到-2的反码:-2的原码为
// 10000000 00000000 00000000 00000010
// 2、-2的反码为符号位不变,其它位取反
// 11111111 11111111 11111111 11111101
// 3、-2的补码为反码+1
// 11111111 11111111 11111111 11111110
// 4、~-2的补码为
// 00000000 00000000 00000000 00000001
// 5、~-2的结果以原码展示
// 00000000 00000000 00000000 00000001
// 结果为1
System.out.println(~-2);
}
}
3、实例3(~2)
//位运算
public class BitOperator03 {
public static void main(String[] args) {
//按位与 &
// 1、先得到2的补码:2的补码为
// 00000000 00000000 00000000 00000010
// 2、~2的补码为
// 11111111 11111111 11111111 11111101
// 3、~2的反码为
// 11111111 11111111 11111111 11111100
// 4、~2的原码展示
// 10000000 00000000 00000000 00000011
// 结果为-3
System.out.println(~2);
}
}
4、实例4(2|3)
public class BitOperator04 {
public static void main(String[] args) {
// 1、2的补码
// 00000000 00000000 00000000 00000010
// 2、3的补码
// 00000000 00000000 00000000 00000011
// 3、2|3的补码运算
// 00000000 00000000 00000000 00000011
// 4、2|3的结果原码
// 00000000 00000000 00000000 00000011
// 结果为3
System.out.println(2|3);
}
}
5、实例5(2^3)
public class BitOperator05 {
public static void main(String[] args) {
// 1、2的补码
// 00000000 00000000 00000000 00000010
// 2、3的补码
// 00000000 00000000 00000000 00000011
// 3、2^3的补码运算
// 00000000 00000000 00000000 00000001
// 4、2|3的结果原码
// 00000000 00000000 00000000 00000011
// 结果为1
System.out.println(2^3);
}
}
十一、位运算符补充
1、算术右移(>>):低位溢出,符号位不变,用符号位补溢出的高位;
public class BitOperator06 {
public static void main(String[] args) {
// 00000000 00000000 00000000 00000001
// 00000000 00000000 00000000 00000000
// 00000000 00000000 00000000 00000100
System.out.println(1>>2);//即1/2/2
System.out.println(1<<2);//即1*2*2
}
}