在程序语言中,大致可以分为强类型、弱类型2类,Java 和许多语言一样,如 C、C++、C#等,是一种强类型语言。也就是说,在 Java 中每一个变量都必须有一种类型。
在 Java 中,包含 8 种基础类型,分别为:
- 整型:byte、short、int、long
- 浮点型:float、double
- 字符型:char
- 真值型:boolean
一、整型
整数类型包括:正整数、零、负整数,但是不能包含小数,在Java中整型包括4类,分别为:
- byte, 占用 1 个字节,取值范围为:[-128,127]
- short,占用 2 个字节,取值范围为:[-32768,32767]
- int ,占用 4 个字节,取值范围为:[-2^31,2^31-1]
- long, 占用 8 个字节,取值范围为:[-2^63,2^63-1]
如果你是一个 C/C++ 开发者,或许会思考一个问题,这些类型是否会受到目标平台影响?在32位、64位系统上运行结果会不会不同?值得庆幸的是:Java 中,基础类型占用的字节数与平台无关。也就是说,当你将编写好的Java代码从一个平台移植的另一个平台,它们运行的结果是一样的。
举个例子:
// PrimitiveType.java
public class PrimitiveType {
public static void main(String[] args) {
// byte 类型
byte b1 = 100;
// byte b2 = 129; // 编译时会错误:不兼容的类型:从int转换到byte可能有损失
System.out.println (b1); // 输出 100
System.out.println ("========");
// short 类型
short s1 = 100;
short s2 = 98;
System.out.println(s1 - s2); // 输出:2
System.out.println ("========");
// int 类型
int i1 = 1;
int i2 = 2;
System.out.println(i1 + i2); // 输出:3
System.out.println ("========");
// long 类型
long a1 = 1;
long a2 = 2;
long a3 = 3L; // 以大写 L 结尾
long a4 = 4l; // 以小写 l 结尾
long a5 = 0x5; // 0x 开头,表示 16 进制
long a6 = 0X6; // 0X开头,表示 16 进制
long a7 = 0b0111; // 0b开头,表示二进制
long a159 = 0b1001_1111; // 0b开头+下划线,表示二进制
System.out.println(a1); // 1
System.out.println(a2); // 2
System.out.println(a3); // 3
System.out.println(a4); // 4
System.out.println(a5); // 5
System.out.println(a6); // 6
System.out.println(a7); // 7
System.out.println(a159); // 159
}
}
二、浮点型
浮点,包含整数和小数两个部分组成,在Java 中,浮点类型包括2类,分别为:
- float,占用 4 个字节
- double(常用),占用 8 个字节
除非你需要大量存储 float(单精度)的数据,否则我强烈建议大家使用 double(双精度),避免给计算带来不必要的麻烦。
在使用 float 类型时,需要在后面添加一个后缀 f 或者 F,例如:float f1 = 1.23f。
没有后缀的浮点数,例如 1.23,默认为 double 类型!
三、字符型
字符型(char),可以表示单个字符,也可以表示 Unicode 字符。
- char,占用 2 个字符,取值范围为: \u0000~\uffff
其中,\u 为转义字符,表示 unicode 字符,除了 \u 还有一些其它转义字符:
- \b 退格
- \t 制表符
- \n 换行
- \r 回车
- \" 双引号
- \' 单引号
- \\ 反斜杠
举个例子:
char c1 = 'A'; // 字符 A
char c2 = '\u0022'; // 单引号
char c3 = '\''; // 单引号
char c4 = '\n'; // 换行
char c5 = '中'; // 汉字 “中”
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
System.out.print(c4);
System.out.println(c5);
四、真值型
真值 boolean 类型的取值只有两个:true、false
值得注意的是,在某些语言中 1 和 true 等效。在 Java 中,不可以这么做,类型之间不能相互转换。
附录:常见面试题
下面整理一些关于Java 基础类型相关的面试题,希望对于你有所帮助
1)字符类型 char 占用几个字符?
答案:2 个
2)在32位,64位系统中,int 类型分别占用几个字符?
答案:4个字符,在Java中,基础数据类型占用了字节数,与平台无关。
3)String 是基础数据类型吗?
答案:不是,基础类型只有8种,分别为:byte、short、int、long、float、double、char、boolean。
4)Integer 是基础数据类型吗?
答案:不是。Integer 是 int 对应的包装类型(wrapper class)。从 Java7 开始,int 和 Integer 可以通过自动装箱/拆箱,进行互换,但是 Integer 并不是基础数据类型。
另外其他基础类型对应的包装类型如下所示:
- byte ---> Byte
- short ---> Short
- int ---> Integer
- long ---> Long
- float ---> Float
- double ---> Double
- char ---> Character
- boolean ---> Boolean
5) 下列代码是否能够正常运行?
float f1 = 3.5;
float f2 = 3;
System.out.println(f1 + f2);
答案:不能,编译时会报错,需要在 float f1 = 3.5f ,float f2 = 3f。
6)请解释下列计算结果
System.out.print ((2.0 - 1.1) == 1.9); // 输出为 false
答案:因为在计算机中,浮点值使用二进制来表示的,存在舍入误差,会丢失一定精度。如果在计算中,不允许有这样的舍入,那么可以使用 BigDecimal 类来代替。