Java 学习笔记(三)

· 1242 words · 7 min

数据类型

数据类型byteintlongdoublefloatcharbooleanvoid
所占空间(字节)148842true/false
int a = 127;
System.out.println((byte)(a + 1)); // -128, int 类型数据最大 127,最小 -128
double a = 0.00002;
if(Math.abs(a - 0.00002) < 0.0000000001) {
    // 小于一个足够小的数字,说明两者是相等的
    return true;
}
byte e = (byte)(126); // 使用类型转换的例子
int d = 1000000;
int g = 0x12377; // 16 进制
int h = 0b1010011; // 2 进制
long a = 1000000000000L; // 末尾使用大写的 L
float b = 0.1f;
double c = 1e-7d; // e 代表 10 次方

类型转换

int a = 3;
int b = 2;

System.out.println(a / b); // 1.0,向下取整
System.out.println((double) a / b); // 1.5

装箱类型

// js
const obj1 = {};
const obj2 = new Object();
const num1 = 1;
const num2 = new Number(1);
// java
int i = 1;
Integer i = new Integer(1);
// 错误的使用原生类型
List<int> arr = new ArrayList<>();
// 正确的使用装箱类型
List<Integer> arr = new ArrayList<>();
boolean flag = true;
flag = false;
flag = null; // error, 原生数据类型不允许赋值为 null

Boolean flag = null;
flag = true;
flag = false;

但是对装箱类型赋值 null 的时候,存在一个隐患:当我们将一个装箱的数据赋值给一个原生类型的数据时,java 会进行拆箱操作,拆箱可能会出现空指针异常报错(NullPointerException,NPE),比如:

Integer i = null;
int j = i; // NPE error

相等比较

int a = 1000;
int b = 1000;
System.out.println(a == b); // true

Integer i = new Integer(1000);
Integer j = new Integer(1000);

System.out.println(i == j); // false
System.out.println(i.equals(j)); // true, 使用 equals 得到正确的结果
Integer i = new Integer(1);
Integer j = new Integer(1);

System.out.println(i == j); // true

其原因是:Integer 创建的引用类型数据占用的空间大小远远比 int 占用的 4 byte 要大,因此 java 为了优化节省内存,将 -128 ~ 127 范围内的 Integer 数据进行了缓存,因此 i 和 j 指向的都是同一处堆内存,导致了使用 == 进行比较的时候得到的结果为 true,可以在 JDK 的代码中查看查看注释。

完。

Java