原生数据类型
Java共有八个原生数据类型,按各自类型分类如下:
整型:byte, short, int, long;
浮点型:double, float;
字符型:char;
布尔型:boolean
变量定义
在定义变量时,整型默认为 int,浮点型默认为 double。因此,在定义较大long类型变量时应在数据末尾+L
long a = 1; //编译正常
long a = 5,000,000,000; //编译报错,The literal 50000000000 of type int is out of range
long a = 5,000,000,000L; //编译正常
同时,在定义带小数的 float 类型变量时应在数据末尾+F
float a = 1; //编译正常
float a = 1.0; //编译报错,Type mismatch: cannot convert from double to float
float a = 1.0F; //编译正常
类型转换
原生数据类型有两种转换方式,自动类型转换和强制类型转换。
自动类型转换由编译器自动完成,不需要添加代码,也称隐式类型转换。此种转换方式只使用于变量由存储范围小的类型转换向存储范围大的类型转换,即 byte → short(char)→ int → long → float → double,如果想要由大至小的转换则需使用强制类型转换,否则报错,如在定义 float 类型变量时数据末尾未+F。
强制类型转换需要添加代码实现,也称显式类型转换。此种转换方式一般用于对变量进行由大至小的转换,因此存在数据精度丢失的问题,需要谨慎使用,在转换前必须确认这一丢失是可以接受的。
double i = 1.3;
System.out.println((int)i); //由double类型转换为int类型,输出结果为1,小数部分丢失
short i = 200;
System.out.println((byte)i); //由int类型转换为byte类型,输出结果为-56
如上例,由 double 类型转换为 int 类型可完成对浮点型数据的取整。而在第二例中,原 int 变量值为200,在内存中存储为0000,0000,1100,1000,在转换为 byte 类型时丢失高八位的0后,将低八位首位的1当做符号位处理,因此计算机判断为该值负数,1100,1000为其补码,将其转换为原码1011,1000,而后输出相应的十进制数字-56。
包装类
Java中万物皆对象,而其提供的原生数据类型并非对象,因此 Java.lang 包提供了包装类。
原生数据类型 | 包装类 | 存储大小 | 最小值 | 最大值 |
---|---|---|---|---|
byte | Byte | 8bit | -128 | 127 |
short | Short | 16bit | -32768 | 32767 |
char | Character | 16bit | ‘\u0000’ | ‘\uFFFF’ |
int | Integer | 32bit | -2147483648 | 2147483647 |
long | Long | 64bit | -9223372036854775808 | 9223372036854775807 |
float | Float | 32bit | 1.4E-45 | 3.4028235E38 |
double | Double | 64bit | 4.9E-324 | 1.7976931348623157E308 |
boolean | Boolean | - | - | - |
以Integer类为例,Integer类继承了java.lang.Number类,在对象中包装了一个基本类型 int 的值并提供了多个方法。
字段摘要:
前缀 | 变量名 | 变量含义 |
---|---|---|
static int | MAX_VALUE | 值为2^31-1的常量,它表示int类型能够表示的最大值 |
static int | MIN_VALUE | 值为-2^31的常量,它表示int类型能够表示的最小值 |
static int | SIZE | 用来以二进制补码形式表示int值的比特位数 |
static Class < Integer > | TYPE | 表示基本类型int的Class实例 |
方法摘要
前缀 | 方法名 | 方法作用 |
---|---|---|
byte | byteValue() | 以byte类型返回该Integer的值 |
int | compareTo(Integer anotherInteger) | 在数字上比较两个 Integer 对象 |
static int | parseInt(String s) | 将字符串参数作为有符号的十进制整数进行解析 |
static Integer | valueOf(int i) | 返回一个表示指定的 int 值的 Integer 实例 |
自动装箱与拆箱
自动装箱:Java SE5开始提供自动装箱功能,允许隐式地将原始数据类型转换为类对象
拆箱:将类对象转换为对应的原始数据类型,必须显式
Integer obj = 1;
/*
* 自动装箱
* 实际执行了Integer obj = Integer.valueOf(1);
*/
int i = (int)obj;
/*
* 拆箱
* 实际执行了int i = obj.intValue();
*/
注:上例中自动装箱生成对象调用了方法valueOf(),因此会出现由此方式生成的同一数值对象内存地址相同的情况
Integer i1 = 1;
Integer i2 = 1;
System.out.println(i1 == i2); //输出true
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i3 == i4); //输出false
这一情况由valueOf()方法导致,当Integer对象数值在-128~127间时,valueOf()方法只返回对应值的缓存对象而非建立新对象,valueOf()方法源码如下
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
其中IntegerCache.low与IntegerCache.high为IntegerCache类的静态成员常量,low值为-128,high值为127