数据类型
Java 中,数据分为 基本数据类型 与 引用数据类型
基本数据类型
一共有八种基本数据类型
数据类型 | 关键字 | 大小(字节) | 取值范围 | 封装类 |
---|---|---|---|---|
字节型 | byte | 1 | -128 ~ 127 | Byte |
短整型 | short | 2 | -32768 ~ 32767 | Short |
整型 | int(默认) | 4 | -2^31 ~ 2^31-1 | Integer |
长整型 | long | 8 | -2^63 ~ 2^63-1 | Long |
单精度浮点数 | float | 4 | 1.4013E-45 ~ 3.4028E+38 | Float |
双精度浮点数 | double(默认) | 8 | 4.9E-324 ~ 1.7977E+308 | Double |
字符型 | char | 2 | 0 ~ 65535 | Character |
布尔类型 | boolean | 1 / 4 | ture / false | Boolean |
使用注意事项:
- 在使用 float 类型定义数据时,需要在数据后加上 f 或者 F
- 在使用 long 类型定义数据时,需要在数据后加上 l 或者 L
类型转换
不同数据类型之间可以相互转换
小类型赋值给大类型:小转大,自动转换
double num = 1.1f
大类型赋值给小类型:大转小,强制转换(因为可能导致计算的精度下降、数据溢出)
int num = (int)100L
char 类型的转换
char 在计算时会自动转为 short
转换规则
- 当有多种数据类型转换时,将所有数据类型转换为 精度最大 的那个
- (byte、short )和 char 之间不会相互自动转换
- byte、short、char 三者可以计算,在计算时首先转换为 int 类型
byte a = 1;
short b = 1;
short c = a + b;
// 错误,byte + short 在进行计算时,会自动转换为 int,int 赋值给 short需要进行强制转换
short d = 1;
short e = b + d;
// 错误,short + short 在进行运算时,自动转为int
精度大小顺序:
- char < int < long < float < double
- byte < short < int < long < float < double
String 与 基本类型的互换
基本类型 转 字符串:
String s = 1 + "";
字符串 转 基本类型:
Integer.parseInt("123");
引用数据类型
引用数据类型包括:类、数组、接口、字符串、枚举
包装类型
八个基本类型,每一个都对应一个包装类型
为什么使用包装类型
Java 可以直接处理基本数据类型,但有时候需要将其视为对象来处理,所以需要为每个基本类型提供包装类型,就可以把基本类型转换为对象来处理
基本类型与包装类型的区别
- 基本类型为值传递,包装类型为引用传递
- 基本类型在栈中创建,包装类型在堆中创建
自动装箱/自动拆箱
装箱:将基本类型包装成包装类型
new Integer 或者 Integer.valueOf
Integer num = 1; // 自动装箱
拆箱:将包装类型转为基本类型
new Integer(num).intValue()
int n = new Integer(100); // 自动拆箱
String 与 包装类型的互换
包装类转 String:valueof
String 转包装类型:…parst***(String)
包装类 转 字符串
Integer i = 100;
String s1 = i + "";
String s2 = i.toString();
String s3 = String.valueOf(i);
字符串 转 包装类
String s = "123";
Integer i1 = Integer.parseInt(s);
Integer i2 = new Integer(s);
常见面试题
Integer i = new Integer(1);
Integer j = new Integer(1);
System.out.println(i == j);
输出:false
i 和 j 是对象,这里使用 == 判断,判断的是 地址,这是两个不同的对象,所以结果为 false
Integer i = 1
Integer j = 2
System.out.println(i == j);
这里直接赋值,自动装箱底层是 Integer.valueOf(int i)
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
底层维护了一个静态内部类 IntegerCache,用来做数据缓存,内部类中维护了一个 Integer cache[] 数组,该数组在类加载时创建并初始化
当使用 valueOf 自动装箱传入一个 int 时,如果传入的值大小在 -128 ~ 127 之间,则不会创建对象,直接在 cache 数组中获取数据
所以这里输出:true
Integer i = 128
Integer j = 128
System.out.println(i == j);
这里因为数值为128,所以是创建对象的方式,输出 false
Integer i = 127;
int j = 127;
System.out.println(i == j);
输出:true
其中有一个是基本数据类型,当 == 双方有一方是基本数据类型的时候,比较的就是值
常见 ASCII 码
- a-z:97-122
- A-Z:65-90
- 0-9:48-57
常量与变量
在 Java 中,变量必须先声明,再使用
变量分为:局部变量与成员变量
- 局部变量:方法中的变量,存于栈内存,无默认值,先定义再使用,不可以加修饰符
- 成员变量:方法外,类内的变量,有 static 修饰的为类变量,否则为对象变量
常量分为:普通常量与标识符常量(final)
- 普通常量:整型、浮点型、字符、字符串、布尔、空常量 null
- 标识符常量:当定义的 final 变量属于成员变量时,必须在定义时就设定初值
整型
整型包括:byte、short、int(默认)、long
表达方式
自 JDK 1.7 开始,,int 和 long 常量支持下划线分割,以及二进制字面量的表示方法
- 八进制:以 0 开头,如 0123
- 十六进制:以 0x 或 0X 开头,如 0x25
- 下划线分割:int n = 1_234_5678
- 二进制字面量:int n = 0b1001_1001_1011_1111
浮点数
- 小数形式:12.37F、-0.5234D、.123(0可以省略)
- 指数形式:2.5e4(2.5乘10的四次方)、2.1E-7
浮点数的运算存在 误差,比较两个浮点数是否相等 常常会出现错误的结果
double num = 8.1 / 3;
这里会输出一个接近 2.7 的数字,而不是 2.7,所以如果想要相等比较的话,会产生错误
正确的比较方式:浮点数相减,当绝对值小于一个很小的数时,说明相等
if (Math.abs(x - y) < 0.000001) {
// 可以认为相等
} else {
// 不相等
}
浮点数的四舍五入运算:加 0.5
double d = 2.6;
int n = (int) (d + 0.5);