版权声明:转载原创博客请附上原文链接 https://blog.csdn.net/weixin_43495590/article/details/88718300
一:基本类型
名称 | byte | short | int | long | float | double | boolean | char |
---|---|---|---|---|---|---|---|---|
占用内存 | 1 | 2 | 4 | 8 | 4 | 8 | 1 | 2 |
数据范围 | -128 - 127 |
如上表所示呈现了八种基本类型的名称、内存占用、以及需要关注的-128 - 127
的数据范围,补充一点就是int类型的21亿
范围
public static void main(String[] args){
//二进制
System.out.println(0b10); //2
//八进制
System.out.println(010); //8
//十六进制
System.out.println(0x10); //16
//下划线分隔
int i = 100_111_111;
}
- byte、short、int、long为整数型数据,
默认数据类型为int
,创建long类型数据需要在后面加L
- float、double为浮点型数据,float单精度、double双精度,
默认数据类型为double
,创建float数据需要在后面加f/F
- char类型必须严格区分String,char是
单引号
- boolean只有两个值,true与false
- 二进制数据表示前缀0b/0B、八进制前缀0、十六进制前缀0X/0x,数据之间可以使用_隔开
关于数据类型转换八种基本类型支持从小到大的转换行为,即byte --> short --> int --> long --> float --> double
,当然这是自动转换
的顺序。强制转换则没有限制,请注意每个类型数据范围,避免精度丢失
二:包装类
2.1 对应关系表
基本类型 | 包装类型 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Charecter |
boolean | Boolean |
2.2 栈上分配范围
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
用Integer为例,创建对象调用valueOf()方法都会首先查询值是否在-128 -127
之间,不在返回新对象,在引用栈空间缓存对象地址
。当然这一特点就引发了有关下面会讲到的Integer数据比较问题
Integer栈上缓存是平时遇到比较多且面试管比较青睐的问题,那么其它七中包装类进行了栈上缓存么?缓存的数据值在多少范围,如下表所示:
类型 | 范围 |
---|---|
Byte、Short、Integer | -128 - 127 |
Charecter | 0 - 127 |
2.3 详解栈上分配类型比较
接下来还是根据Integer进行描述,其余数据类型规则一致。==比较就是对内存地址比较,搞清楚栈空间地址与堆空间地址就很好区别
new关键字创建的对象一定不相等
栈上分配数据范围内所有比较除new关键字创建对象情况外都相等
int i1 = 127;
Integer i2 = 127;
Integer i3 = 127;
Integer i4 = 128;
Integer i5 = 128;
Integer i6 = new Integer(127);
System.out.println(i1 == i2);
System.out.println(i2 == i3);
System.out.println(i4 == i5);
System.out.println(i3 == i6);