基本数据类型
基本数据类型 | 字节 | 备注 |
---|---|---|
boolean | 1/8 字节 | 默认值是 false, 只能用 true 、false,不能用 0、1 代替 |
byte | 1 字节 | 范围:-128 - 127, 默认值是 0 |
short | 2 字节 | 默认值是 0 |
char | 2 字节 | 默认值是 \u0000, 最大值 65535, 存储 unicode 字符 |
int | 4 字节 | 默认值是 0 |
float | 4 字节 | 单精度,默认值是 0.0f, 不能表示精确的值,如货币 |
long | 8 字节 | 默认值是 0L |
double | 8 字节 | 双精度,默认值是 0.0d, 不能表示精确的值,如货币 |
笔记
给 Integer 赋值 int 时,会调用 Integer.valueOf() , 如果 int 的值在 -128 ~ 127 之间,不会直接 new 一个新的对象,而是直接引用常量池中的对象。
基本数据类型的常量池的范围是 - 128 ~ 127 ,
在这个范围基本数据类型的包装类可以自动拆箱,比较时直接比较大小。
超出该范围的两个 Integer 比较 == 返回 false
1.
浮点型默认是 double 类型
boolean:1/8 字节,布尔型默认是 false,不是 true。不能使用 0/1 表示
自动拆箱: 编译器将包装类型转换为基本类型
面试题
浮点
float f = 3.4; (X)
因为浮点型默认是 double , double 转为 float 为向下转型,会丢失精度
正确写法:
float f = 3.4f
float f = (float)3.4
byte
byte b = (byte)128; // b = -128
short
short s = 1; ( 正确) // 为什么正确? 数字类型默认是 int 类型,int 转 short 应该丢失精度,为什么在这里可以
short s2 = 1 + s1; (错误) // 1 是int ,int 和 short 做运算,short 会自动转化为 int , 1 + s1 结果为int , int 赋值给short 会丢失精度
s += 1; (正确) // += 相当于 (short)(1 + s)
int
Integer a = 1, b = 1, c = 129, d = 129;
a == b // true
c == d // false int 自动装箱时在-128 ~ 127 之间直接使用
常量池中的对象,否则创建新对象
Integer a = new Integer(3); // 手动创建对象,不会引用常量池中的对象
Integer b = 3; // 将3自动装箱成Integer类型
int c = 3;
System.out.println(a == b); // false 两个引用没有引用同一对象
System.out.println(a == c); // true a自动拆箱成int类型再和c比较(易错)
int i = 3.5 // 报错
double d = 1; // d = 1.0
char a = '2' + 2 ; // 4
ASCII 、Unicode、UTF-8
TODO
引用数据类型
类、接口、数组
值传递和引用传递
基本数据类型的变量作为方法的参数传递时,形参对应的值改变不会影响实参的值,
基本数据类型是值传递
引用数据类型的变量作为方法的参数传递时,形参指向的地址的值改变会影响实参的值;
引用数据类型的变量作为方法的参数传递时,形参指向的地址改变后会影响实参的值;
引用数据类型是传递的是地址
值传递
image.png
image.png
引用传递不改变形参地址
image.png
image.png
引用传递改变形参地址
image.png
image.png