0%

Java基础--02变量和运算符

基本数据类型

  • byte、short、int、long
  • float、double
  • chat
  • boolean

引用数据类型

  • 类、数组、接口、枚举、注释、记录

基本数据类型变量间的自动提升和强制类型转化

  • 自动提升:(byte —> short) byte、short、char —> int —> long —> float —> double
1
2
3
4
5
6
7
byte a =1; short b = a;
int c = a + b; // byte、short、char 之间两两运算,最低转化为int
float d = c; double e = d;
char f = 'a'; int g = a + f; // byte、short、char 之间两两运算,最低转化为int
long h = 123; // 整形常量默认int,自动类型提升,int ---> long
// 不满足示例
float = 12.3; // 浮点常量默认double,double ---> float 无法自动提升
  • 强制类型转化:无法自动提升的可进行强制类型转化,有可能发生数据丢失或者精度丢失(高位截断(抛弃))。
1
2
float g = (float) 12.3;
int g = (int) 12.3; // error
  • 引用类型强制转化:父类向子类强制转换,如果成功不会有任何数据丢失,如果不是子类,那么会报错。

String 引用类型

String 可通过运算符”+”与任意基本类型拼接,最终是String。

1
String str = 1 + "aaa" + true; // 结果为"1aaatrue"
  • 运算是从左到右的(同级,无括号)
  • ()最优先,接下来看运算符优先级
1
String str = 1 + true + "aaa"; // error:运算符 '+' 不能应用于 'int'、'boolean'
1
2
3
4
System.out.println(3 + 4 + "Hello"); // 输出:"7Hello"
System.out.println("Hello" + 3 + 4); // 输出:"Hello34"
System.out.println('a' + 1 + "Hello"); // 输出:"98Hello"
System.out.println("Hello" + 'a' + 1); // 输出:"Helloa1"

计算机底层如何存储数据–二进制

为什么int 的128 强转为byte 是-128?

int 的128:**0000 0000 0000 0000 0000 0000 1000 0000**;

强制转换为byte,仅保留 1000 0000,即-128。

补码存储 1000 0000,反码:1111 1111,原码:1000 0000

  • 计算机底层是使用二进制 补码 的形式存储的
  • 高位截断

面试题:

  1. 高效计算 2 * 8 的值,2 << 3。因为计算机底层是二进制的,左右移是对二进制数进行操作,更高效。

  2. & 和 && 的区别?

    • 同,都表示且运算,两边都满足才为true;

    • 异,& 不论左右 true 或 false,都会继续运算,&& 左右为false,停止运算。

  3. Java 的基本数据类型:整:byte、short、int、long;浮:float、double;布:boolean;字:char。String 不是基本数据类型。

  4. 实际应用中计算金额使用BigDecimal ,更高的精度,不失真。float 和 double 精度不高,易失真。

  5. char 变量类型能存储中文汉字,是因为char 使用的是Unicode 字符集,基本包含了世界上所有的字符。

  6. 替换两个变量的值使用一个临时变量。

1
2
int i = 0; i = i++; // i = 0
int i = 0; i++;

在JLS(Java® Language Specification - Oracle)中对求值顺序的规定,后缀增量运算符是优于普通赋值运算符的

简单地说,i = i++ 的执行过程是这样的:

  1. 首先,i++ 会被执行。在执行的过程中,i 的值会被临时存储在操作数栈(在这里是0),然后 i 的值会增加 1。
  2. 接着,i = 的赋值操作会执行,把 i++ 的结果(即临时存储的值,也就是 i 在增加之前的值0)赋给 i

因此,即使 i 的值在 i++ 的过程中增加了,但最后 i 的值还是被 i++ 的结果(即 i 在增加之前的值)覆盖了,所以最终 i 的值还是 0。

  1. 为什么float 和 double 会造成精度丢失?

    IEEE 754标准。

    • 整数变为二进制,能够做到“每个十进制数都有对应的二进制数”
    • 小数无法做到“每个小数都有对应的二进制数”。二进制小数0.0010表示十进制小数0.125,二进制小数0.0011表示十进制小数0.1875,所以无法使用二进制小数的形式表示0.125~0.1875之间的十进制小数。

    实际开发中建议使用BigDecimal,也可以采用四舍五入或者同乘同除方法。

运算符

  • 算术运算符:+-*/%++--
  • 复制运算符:=
  • 比较运算符:><>=<===!=
  • 逻辑运算符:&|!&&||^(异或)
  • 位运算符:>><<>>>(无符号右移)&|^~(取反)
  • 条件运算符:(条件表达式)?yes:no