JDK源码 -- 基本类型与封装类

版权声明:转载原创博客请附上原文链接 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);

猜你喜欢

转载自blog.csdn.net/weixin_43495590/article/details/88718300