基本类型转化
取值范围小的数据类型与取值范围大的数据类型进行运算,会先把小的数据类型转化成大的数据类型再运算。
byte, short, char 类型混合运算时都会转成int类型。
有隐式转化和显式转化之分
字符
在ASCII编码种,一个英文字符需要1个字节
在GB2312编码或者GBK编码中,一个汉字字符需要2个字节
UTF-8编码,汉子需要3-4个字节
使用char来定义字符类型,可以直接用ascii表的数字来赋值,也可以计算两个字符之间的距离。
char c = 'a';
char c = 97;
char在ascii编码中占一个字节,取值 0-127
char在unicode编码中占两个字节,取值 0-65535
重点:java语言采用unicode编码,所以可以一个char表示一个中文汉字
面试题:
看下面代码是否有问题?
short s = 1; s = s + 1;
short s = 1; s += 1;
对于第一行是错的,s = s + 1; 会令s 强制转化成int型变量。short与int进行运算,会把short转成int,两个int相加返回int。
对于第二行,+=会自动转化,相当于添加了强制转化符。
逻辑运算符
&: 逻辑与,有false则false
|: 逻辑或,有true则true
^: 逻辑异或,相同为false,相异为true
!: 逻辑非,true和false对换
&&:短路,两者都true为true
||:短路,只要有true则true
面试题:&& 和 & 的区别
&& 可以逻辑短路,也就说当前面为false时,后面则不进行操作了。
& 则不论前面true 或者 false,都会操作后一步。
测验: 如下代码分别输出什么?
public void test2() {
int a = 9, b = 10;
if(++a == 10)
System.out.println("a先自增再比较大小");
if(++a == 11 && b++ == 10)
System.out.println("b先和10比较大小,再自增");
if(!(++a == 11 && ++b == 11))
System.out.println("b : " + b + ";表明++b没被执行");
System.out.println("a: " + a);
System.out.println("b: " + b);
}
答案输出如下:
a先自增再比较大小
b先和10比较大小,再自增
b : 11;表明++b没被执行
a: 12
b: 11
通过上述例子可以很好了解 ++ 和 — 区别;以及 && 造成短路现象。
位运算符的基本用法
^ 按位异或 相同则0,不同则1
例如:
0000 0001
0000 0100
按位异或后的结果为
0000 0101
一个数异或同一个数两次后,会变回原来的值。
<< 按位左移 左移,右边补0,最高位不变
>> 按位右移动 右移,左边补0,最高位不变
>>> 无符号右移
面试题:
实现两个整数变量的交换(不使用额外空间开销)
^ 的特点就是:一个数对另一个数异或两次,该数本身不变。
int a = 2, b = 5;
a = a ^ b;
b = a ^ b;
a = a ^ b;
仔细观察发现,b本质上 = a ^ b ^ b = a,同理a。
Scanner类键盘录入
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
Switch 语句
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
switch (x) {
case 1:
System.out.println("1");
break;
case 2:
System.out.println("2");
break;
default:
break;
}
switch 语句中的变量类型可以是:byte,short,int或者char。从Java SE7之后,支持String类型。同时case标签必须为字符串常量或字面量。
switch 语句可以拥有多个case语句,每个case语句后面跟一个要比较的值和冒号。
当变量的值与case语句的值相等时,执行case语句之后的内容,直到break。
switch 语句可以包含一个default分支,该分支必须是switch语句的最后一个分支。在没有case语句的值与之相匹配的时候或者case中没有break的时候执行default,default语句不需要break语句。
面试题:
long 不可以作为switch表达式
short可以作为switch表达式