数据类型
--------------------------------------------------------------------------------
java语言是强类型语言
对于每一种数据都定义了明确的具体数据类型, 在内存中分配了不同大小的存储空间
8种基本数据类型+3种引用数据类型 -> 共11种数据类型.
|-数据类型
|-基本数据类型 primitive type
|-数值型
|-整数类型 -> byte, short, int, long
|-浮点类型 -> float, double
|-字符型 -> char
|-布尔型 -> boolean
|-引用数据类型 reference type
|-类 -> class(包括 enum)
|-接口 -> interface(包括 @interface)
|-数组 ->[]
说明: 整数默认 int, 小数默认 double
自jdk1.1版本就有了基本数据类型的包装类
Byte, Short, Integer, Long, Float, Double, Character, Boolean
但是, 从jdk5.0起才有 auto boxing/unboxing 特性
--------------------------------------------------------------------------------
1. 整数类型
byte 1*8 bit -2^7~2^7-1 即 -128~+127
short 2*8 bit -2^15~2^15-1 即 -32768~32767
int 4*8 bit -2^31~2^31-1 约 ±21 亿
long 8*8 bit -2^63~2^63-1 数值后+l或L, 如 long num = 32L;
建议+L, 因+l和数值1实在太像了, 易混淆
注意:
java中没有无符号整形. 最高位为符号位, 0为非负, 1 为负数
int 和 byte 较常用, 整数类型默认为 int.
***虽然 long 占 8 字节, float 占 4字节,
但由于整数和浮点数在计算机中存储方式的不同, float 取值范围比 long 大!!!
byte 和 short 类型主要用于特定的应用场合.
如底层的文件处理(IO流)或者需要控制占用存储空间量的大数组
byte, short 型基本不用于算术运算, 因为会被自动提升为 int 类型
开发中: 尽量避免使用 int 以下的数据类型来定义变量
int age = 20; // 定义年龄
注意各整数类型的范围, 当运算溢出时, 丢失精度!!!
如 long height = 8848 * 1000 * 1000;
// 右边的运算结果为 int 型, 但是运算结果为 88 亿, 已经超过 int 取值范围, 将溢出, 丢失精度!!!
// 应修改为 long height = 8848 * 1000 * 1000L;
----------------------------------------
//java.net 包中 InetAddress 对象常用 byte
如 byte[] ip = {(byte)192,(byte)168,(byte)0,(byte)254,};
for (byte b : ip )
{
System.out.println(b); //-64, -88, 0, -2
}
----------------------------------------
// 面试题
System.out.println(12345 + 5432l);
/*
结果是 long 型的 17777.
注意, 而不是int 型的 66666, 因为 5432l 实际上是 5432L.
***是, l(L) 和 1(数值) 实在太像了
*/
--------------------------------------------------------------------------------
2. 浮点类型
float 和 double 主要差异在精度的不同.
float 4*8 bit 单精度浮点数, 有效数字6~7位, 取值范围±3.4E38F
其数值后+f或F, 如 float num = 34.5F; 建议+F
double 8*8 bit 双精度浮点数, 有效数字15位, 取值范围±1.7E308
其数值后+d或D, 但一般不加.
还可以使用科学计数法表示小数: 如 1.1E2(110.0), -1.1E2F(110.0F).
其中,
小数部分(尾数部分) 可以为 (-10, 10)范围内的取值;
指数部分, ??? 需要看浮点数在计算机中的存储?
小数默认为 double
只有很少的情况适合使用 float.
如, 需要快速地处理单精度数据, 或者需要存储大量的数据.
***虽然 long 占 8 字节, float 占 4字节,
但由于整数和浮点数在计算机中存储方式的不同, float 取值范围比 long 大!!!
/*
* 由于整数和浮点数在内存中存储方式的不同,
* 虽然 float 占 4 个字节, 而 long 占 8 个字节, 但 float 可表示的数值范围比 long 大
* 所以, long -> float 可以自动类型提升
*/
System.out.println(Float.MAX_VALUE > Long.MAX_VALUE); // true
System.out.println(Float.MIN_VALUE > Long.MIN_VALUE); // true
System.out.println(Float.MAX_VALUE); // 3.4028235E38
System.out.println(Float.MIN_VALUE); // 1.4E-45
System.out.println(Double.MAX_VALUE); // 1.7976931348623157E308
System.out.println(Double.MIN_VALUE); // 4.9E-324
--------------------------------------------------------------------------------
3. 字符型
char 2*8 bit 0~2^16-1 即 0~65535, 也即'\u0000'~'\uFFFF'
取值范围为0~65535
(1) 能将[0, 65535] 范围内的整数值或整型常量直接赋值给 char 常量/变量
如 char ch = 65535;
/*
注意是整数值或整型常量, 而不是整型变量(对整数值);
编译时, 编译器知道整数值和整型常量是否在 char 的取值范围内, 所以可以;
但不知道整型变量的值是否在 char 取值范围内
ch = 1L; // incompatible types: possible lossy conversion from long to char
*/
(2) *** 自动类型转换时, char 可自动转换为 int/long/float/double
(3) 没有任何数据类型能自动转换为 char, 即使 byte/short 都不行(byte/short 存在负值, 而 char 没负值);
(4) 注意: char 可以装中文, 都为2个字节. 如, char ch = '你';
中文在内存中, 也是以2个字节存储的.
(5) char 常量中只能是单个字符, 不可以多余一个也不可以没有
char ch = '10'; // 编译错误. 包含的是2个字符, 而不是1个.
char ch = ''; // 编译错误. 包含的是0个字符, 而不是1个.
(6) 常见 ASCII 码
'0' ---> 48 // 其他数字类推
'a' ---> 65 // 其他小写字母类推
'A' ---> 97 // 其他大写字母类推
'\n'---> 10 // 换行
'\r'---> 13 // 回车
--------------------------------------------------------------------------------
4. 布尔型
boolean 没说明占几个字节 true 和 false
***整型值和 boolean 值之间不能进行相互转换.
--------------------------------------------------------------------------------
|
|