ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC] # 变量 Java中基本类型一共4类,把这4类展开后共8种基本类型。我们今后编写程序时使用的是这8种基本类型而不是4类,这8种基本类型指定了范围。 ![](https://box.kancloud.cn/dedae88a344aab9395bf948fde7fed92_941x342.png) # 常量 前面我们说过100是整数常量,但它是byte、short、int、long中的哪一种呢?下面我们来聊聊这一常量类型的问题。 整数常量可以根据所在范围来确定类型,例如100在-128~127之间,所以他是byte类型;500在-32768~32767之间,所以它是short类型;100000在-2147483648~2147483648之间,所以它是int类型。java中默认的整数类型是int类型 你可能会认为12345678901在-263~263-1之间,所以它是long类型。注意了,这是错误的!!!在Java中整数常量如果不在-2147483648~2147483648之间就必须添加“L”后缀(小写的也可以,但建议使用大写),在-2147483648~2147483648之间的也可以添加“L”后缀。也就是说12345678901不在-2147483648~2147483648之间,所以它在Java中是错误的常量,你必须这样写:12345678901L,这才是正确的常量。所以添加了“L”后缀的整数常量都是long类型的,例如:100L、12345678901L都是long类型的常量。 浮点类型的常量也可使用后缀,在Java中所有没有后缀以及使用“D”后缀(小写也可以,但建议使用大写)的小数都是double类型;float类型常量必须添加“F”后缀(小写也可以,但建议使用大写)java中默认的浮点类型是double类型 * 3.14没有后缀,所以它是double类型; * 5.28D为double类型; * 1.26F为float类型。 # 类型转换 关于数据类型转换有两种方式,我们来学习一下: * 自动类型转换 表示范围小的数据类型转换成范围大的数据类型,这种方式称为自动类型转换 自动类型转换格式: 范围大的数据类型 变量 = 范围小的数据类型值; ~~~ 如: double d = 1000; 或 int i = 100; double d2 = i; ~~~ * 强制类型转换 表示范围大的数据类型转换成范围小的数据类型,这种方式称为强制类型转换 强制类型转换格式: 范围小的数据类型 变量 = (范围小的数据类型) 范围大的数据类型值; ~~~ 如: int i = (int)6.718; //i的值为6 或 double d = 3.14; int i2 = (int)d; //i2的值为3 ~~~ # 基本类型包装类的常量池 其实java中基本类型的包装类的大部分都实现了常量池技术。 对包装类进行赋值时,字面量值在`[-128,127]`间时,将使用常量池中对象,反之则创建新的对象。 * 已实现常量池的类: Byte,Short,Integer,Long, Character,Boolean * 未实现:Float,Double ~~~ public class Cache { public static void main(String[] args){ //实现常量池的包装类以Long为例 //在值小于127,可以使用常量池 Long i1 = 127L; Long i2 = 127L; System.out.println(i1 == i2);//输出true //值大于127,不会从常量池中取对象 Long i3 = 128L; Long i4 = 128L; System.out.println(i3 == i4);//输出false //Boolean类也实现了常量池技术 Boolean bool1 = true; Boolean bool2 = true; System.out.println(bool1 == bool2);//输出true //浮点类型的包装类没有实现常量池技术 Float f1 = 3.0f; Float f2 = 3.0f; System.out.println(f1 ==f 2);//输出false Double d1 = 1.0; Double d2 = 1.0; System.out.println(d1 == d2);//输出false } } ~~~ 将基本类型赋值给包装类时,实际上执行了包装类的valueOf方法。 以Long为例,看一下相关源码(其他包装类常量池实现方法类似) valueOf方法源码: ~~~ public static Long valueOf(long l) { final int offset = 128; if (l >= -128 && l <= 127) { // will cache return LongCache.cache[(int)l + offset]; } return new Long(l); } ~~~ 可以看出,当字面量值在`[-128,127]`间,返回LongCache中的值 再来看LongCache(Long常量池)源码: ~~~ private static class LongCache { private LongCache(){} static final Long cache[] = new Long[-(-128) + 127 + 1]; static { for(int i = 0; i < cache.length; i++) cache[i] = new Long(i - 128); } } ~~~ LongCache是Long的静态内部类,虚拟机加载Long类就会将`[-128,127]`的值存储在`Long cache[]`中。