基本数据类型
- byte、short、int、long
- float、double
- chat
- boolean
引用数据类型
- 类、数组、接口、枚举、注释、记录
基本数据类型变量间的自动提升和强制类型转化
- 自动提升:(byte —> short) byte、short、char —> int —> long —> float —> double
1 | byte a =1; short b = a; |
- 强制类型转化:无法自动提升的可进行强制类型转化,有可能发生数据丢失或者精度丢失(高位截断(抛弃))。
1 | float g = (float) 12.3; |
- 引用类型强制转化:父类向子类强制转换,如果成功不会有任何数据丢失,如果不是子类,那么会报错。
String 引用类型
String 可通过运算符”+”与任意基本类型拼接,最终是String。
1 | String str = 1 + "aaa" + true; // 结果为"1aaatrue" |
- 运算是从左到右的(同级,无括号)
- ()最优先,接下来看运算符优先级
1 | String str = 1 + true + "aaa"; // error:运算符 '+' 不能应用于 'int'、'boolean' |
1 | System.out.println(3 + 4 + "Hello"); // 输出:"7Hello" |
计算机底层如何存储数据–二进制
为什么int 的128 强转为byte 是-128?
int 的128:**0000 0000 0000 0000 0000 0000 1000 0000**;
强制转换为byte,仅保留 1000 0000,即-128。
补码存储 1000 0000,反码:1111 1111,原码:1000 0000
- 计算机底层是使用二进制 补码 的形式存储的
- 高位截断
面试题:
高效计算 2 * 8 的值,2 << 3。因为计算机底层是二进制的,左右移是对二进制数进行操作,更高效。
& 和 && 的区别?
同,都表示且运算,两边都满足才为true;
异,& 不论左右 true 或 false,都会继续运算,&& 左右为false,停止运算。
Java 的基本数据类型:整:byte、short、int、long;浮:float、double;布:boolean;字:char。String 不是基本数据类型。
实际应用中计算金额使用BigDecimal ,更高的精度,不失真。float 和 double 精度不高,易失真。
char 变量类型能存储中文汉字,是因为char 使用的是Unicode 字符集,基本包含了世界上所有的字符。
替换两个变量的值使用一个临时变量。
1
2 int i = 0; i = i++; // i = 0
int i = 0; i++;在JLS(Java® Language Specification - Oracle)中对求值顺序的规定,后缀增量运算符是优于普通赋值运算符的
简单地说,
i = i++
的执行过程是这样的:
- 首先,
i++
会被执行。在执行的过程中,i
的值会被临时存储在操作数栈(在这里是0),然后i
的值会增加 1。- 接着,
i =
的赋值操作会执行,把i++
的结果(即临时存储的值,也就是i
在增加之前的值0)赋给i
因此,即使
i
的值在i++
的过程中增加了,但最后i
的值还是被i++
的结果(即i
在增加之前的值)覆盖了,所以最终i
的值还是 0。
为什么float 和 double 会造成精度丢失?
IEEE 754标准。
- 整数变为二进制,能够做到“每个十进制数都有对应的二进制数”
- 小数无法做到“每个小数都有对应的二进制数”。二进制小数0.0010表示十进制小数0.125,二进制小数0.0011表示十进制小数0.1875,所以无法使用二进制小数的形式表示0.125~0.1875之间的十进制小数。
实际开发中建议使用
BigDecimal
,也可以采用四舍五入
或者同乘同除
方法。
运算符
- 算术运算符:
+
、-
、*
、/
、%
、++
、--
- 复制运算符:
=
- 比较运算符:
>
、<
、>=
、<=
、==
、!=
- 逻辑运算符:
&
、|
、!
、&&
、||
、^(异或)
- 位运算符:
>>
、<<
、>>>(无符号右移)
、&
、|
、^
、~(取反)
- 条件运算符:(条件表达式)?yes:no