目录
一、数据类型的转换
1. 前情提要
只有相同数据类型之间可以相互转换。数值型之间的转化。
不互相干的两个类型不能相互转换
2. int<=>long
public class note {
public static void main(String[] args) {
int a = 10;
long b = 20;//隐藏的类型提升:int->long
a = b;//error
b = a; //可运行
}
}
解释:上述代码中20默认是int类型,但用long存放它,包含了隐藏的类型提升。
不类型转换:long b = 20L;
大类型转换为小类型,会导致报错,范围不一样。
public class note {
public static void main(String[] args) {
int a = Integer.MAX_VALUE;
long b = a + 1;
//修改后 long b = a + 1L;
System.out.println(b);
}
}
结果:-2147483648
原因:程序的执行都是从右向左执行。a + 1运行时已经溢出
long + int => long + long
public class note {
//数据丢失
public static void main(String[] args) {
int a = Integer.MAX_VALUE;
long b = a + 1L;
int c = (int)b;
System.out.println(b);
}
}
原因:大类型强制类型转换时会造成精度丢失。b为long类型,变为int型,范围变小,精度丢失。
3.int <=>double
public class note {
public static void main(String[] args) {
int a = 1;
double b = 2;
double c = a / b;
int d = (int) c;
System.out.println(a/b);
System.out.println(d);
}
}
结果:0.5
0
解释:两次类型提升。
- 2是一个整型,将int-> double
- a/b:大类型和小类型进行数学运算时,会将小类型自动提升为大类型,a提升为double型。double/double
- double型强制变为int型,造成精度丢失,小数部分没有了
4. int <=> byte
public class note {
public static void main(String[] args) {
byte a = 120;
byte b = 130;//error
int c = 120;
byte d = c;//error
System.out.println(a);
System.out.println(b);
}
}
结果:java: 不兼容的类型: 从int转换到byte可能会有损失
原因:对于数值型和字符型来说,小于4字节的数据类型,在存储时会转为4字节。
当byte保存的数据赋值给byte,超出byte的范围仍需强制类型转换
当把一个int变量赋值给byte时,无论是否超出保存范围,都需要强转。
public static void main(String[] args) {
final byte a = 10;
final byte b = 20;
byte c = a + b;
System.out.println(c);
}
}
结果:30
解释:被final修饰的变量数据值不能改、类型不能提升。所以上述代码依旧是byte型
5. int <=> char
public class note {
public static void main(String[] args) {
char a = 'a';
int b = a;
int c = 97;
char d = (char) c;
System.out.println(b);
System.out.println(d);
}
}
结果:97
'a'
原因:1. char->int自动提升,97
- int ->char 强转
- 在计算机内部,char字符会按照不同的编码规则转为int存储
6. int <=>string
public class note {
public static void main(String[] args) {
int num = 10;
String str1 = String.valueOf(num);
String str2 = "" + num;
System.out.println(str1);
System.out.println(str2);
String str ="123";
// 把str这个字符串变量转为int
int a = Integer.parseInt(str);
System.out.println(a);
}
}
结果:10
10
123
- 直接使用String对象 +
- 使用string的valueOf方法
- 当字符串包含非数字,string转换为int会出错
7. 数据类型的默认值
数据类型 | 默认值 |
---|---|
byte/short/int/long | 0 |
float/double | 0.0 |
char | \u0000 |
boolean | false |
引用数据类型 | null |
在java中,所有数据类型都有默认值。只存在于类变量中,方法中的局部变量不存在默认值
二、运算符
1. 算术运算符
常用:+ - * / %
- 0不能作为除数
- % --求余数—可用于整数与小数
public class note {
public static void main(String[] args) {
double a = 11.5;
int b = 2;
System.out.println(a % b);
}
}
结果:1.5
2. 自增自减运算符
a++:先取a的值后自增
++a:先自增在运算
3. 关系运算符
== != < > <= >=
关系运算符的输出结果都是布尔值
4.逻辑运算符
&&:逻辑与:两个操作数都是true返回true,有一个为false返回false
||: 逻辑或:两个操作数都为false返回false,有一个为ture返回true
上面两个为短路操作符
!:逻辑非:false返回true;true返回false
5. 位运算符
&:按位与:全1出1
|:按位或:有1出1
!:按取反:!1=0 !0=1
^:按位异或:相同为0,不同为1
题目:一组数中,只有一个数出现一次,其余的数都出现两次,如何快速找到这个数字
答:全部异或,剩下的那个数字就是出现一次的。
6.移位运算符
<< >>
>>>:无符号右移:右侧舍弃, 左侧补 0
举例:10 << 1 => 20--------左移一位相当于 * 2
10 >> 1 => 5---------右移一位相当于 / 2
7. 条件(三目)运算符
表达式1 ?表达式2:表达式3
理解:表达式1为真,取表达式2的值;表达式1为假,取表达式3的值