Java基础复习(一、数据类型)

目录

一、数据类型

本章主要介绍了基本类型、包装类型以及相关的缓存池的内容,涉及到基本的存储空间、自动装箱拆箱、编译反编译操作等。

基本类型

Java有八种基本类型:

类型名称 字节空间 使用场景
byte 1字节(8 bit) 存储字节数据(较常用)
short 2字节(16 bit) 兼容性考虑(很少使用)
int 4字节(32 bit) 存储普通整数(常用)
long 8字节(64 bit) 存储长整数(常用)
float 4字节(32 bit) 存储浮点数(不常用)
double 8字节(64 bit) 存储双精度浮点数(常用)
char 2字节(16 bit) 存储一个字符(常用)
boolean 1/4字节(8/32 bit) 存储逻辑变量(true、false)(常用)
  • byte: byte 又称字节,为最小的基本类型,取值范围-27~27-1,赋值方式也有两种,一种直接整数,一种以2进制形式。
  • short: 为2字节16位,但是用的比较少,一般直接用 int 类型。一般只有在使用大数组的时候,为了节约空间使用 short 代替 int。
  • int: int 是最常用的整型类型,一个 int 变量占4个字节32位,最大表示范围:-231~231-1,赋值方式可以是一般的十进制整数或者是16进制形式(0x或者0X开头),也可以是8进制形式(0开头)。
  • long:如果 int 类型表示范围不够,可以使用 long 类型,占8字节64位,最大表示范围:-263~263-1,但是使用时需要以小写l或者大写L做结尾,否则会有编译错误。常用于存储时间及日期,jdk中的方法 System.currentTimeMills() 。
  • float:又称为浮点类型,即小数类型,4字节32位运用方式和 double 类型相似,但是使用时需要在最后加上 f 或者大写 F ,一般情况用 double 即可。
  • double:也叫作双精度浮点类型,8字节64位精度是 float 的两倍,大多数场合使用 double 来表示浮点数即小数,浮点数具有两种写法,一般写法和科学计数法。
  • char:char类型实际上叫做字符类型,是一个16位无符号整数,这个值是对应字符的编码,采用 unicode 字符集编码。char类型变量赋值可以采用三种形式:字符直接量,整型直接量以及 unicode 编码赋值。同时 char 类型中有不方便输出的字符,需要进行转义。
  • boolean: boolean 类型的变量一般用于关系运算中,只有两个值 true 和 false ,表示条件成立或者不成立。

包装类型

Java自动装箱拆箱详解

基本类型 包装类型
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

缓存池

缓存池的内容在上面包装类型的博客里面有提及,这里再来讲一下,作为数据类型的收尾。
这边有一段代码:

    Integer x1 = 100;
    Integer y1 = 100;
    Integer x2 = 130;
    Integer y2 = 130;
    System.out.println(x1 == y1);    // true
    System.out.println(x2 == y2);    // flase

上面的比较都是基于 Integer 类型的比较,因此不会自动拆包使用 int 值而是比较两个示例是否是同一个。出现这个输出结果原因,就在于缓存池。
上面代码前四行会触发自动装箱,调用 Integer.valueOf() 方法,我们再来看看这个方法:

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

可以看到,返回的内容跟缓存池有关。当参数 i 在缓存池范围内,则返回缓存池内的实例。参数 i 不在缓存池范围内,则返回新建对象。
查看静态内部类 IntegerCache 的静态变量和方法:

static final int low = -128;
static final int high;
static final Integer cache[];
static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                try {
                    int i = parseInt(integerCacheHighPropValue);
                    i = Math.max(i, 127);
                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                } catch( NumberFormatException nfe) {
                    // If the property cannot be parsed into an int, ignore it.
                }
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);

            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        }

可以看到下限是 -128定死了,上限由虚拟机定,否则为127。值得一提的是,在所有包装类中,只有 Integer 的缓存池上限可以由虚拟机指定。在启动 jvm 的时候,通过 -XX:AutoBoxCacheMax=<size> 来指定这个缓冲池的大小,该选项在 JVM 初始化的时候会设定一个名为 java.lang.IntegerCache.high 系统属性,然后 IntegerCache 初始化的时候就会读取该系统属性来决定上界。
基本类型对应的缓冲池如下:

  • boolean values true and false
  • all byte values
  • short values between -128 and 127
  • int values between -128 and 127
  • char in the range \u0000 to \u007F
    在使用这些基本类型对应的包装类型时,如果该数值范围在缓冲池范围内,就可以直接使用缓冲池中的对象。
posted @ 2020-04-29 14:51  LewisYoung  阅读(138)  评论(0编辑  收藏  举报