Java的数据类型是最基础基础的类型,在很多大厂的面试中几乎不会出现,但是在笔试中出现可能会给我们带来困扰(其中还是有很多挖坑的地方的)。并且对于一些刚接触Java的学生党Java基本数据类型也是很重要的一个考试考察点。今天整理JAVA的基本数据类型以及其包装类的知识内容,并结合一些常见的经典面试题进行说明,希望能帮助大家。把也和咧!
引用JAVA编程思想第四版: 2.2.2节关于Java基本数据类型的描述。
Java要确定每种基本数据所占存储空间的大小。它们的大小并不像其他大多数语言那样随机器硬件架构的变化而变化。这种所占存储空间大小 的不变性是Java程序比用其他大多数语言编写的程序更具可移植性的原因之一。
基本数据类型 | 大小 | 最小值 | 最大值 | 包装器类型 |
---|---|---|---|---|
boolean | - | - | - | Boolean |
char | 16-bit | Unicode 0 | Unicode 2 16 − 1 2^{16}-1 216−1 | Character |
byte | 8 bits | -128 | +127 | Btye |
short | 16 bits | − 2 15 − 1 -2^{15}-1 −215−1 | + 2 15 − 1 +2^{15}-1 +215−1 | Short |
int | 32 bits | − 2 31 − 1 -2^{31}-1 −231−1 | + 2 31 − 1 +2^{31}-1 +231−1 | Integer |
long | 64 bits | − 2 63 − 1 -2^{63}-1 −263−1 | + 2 63 − 1 +2^{63}-1 +263−1 | Long |
float | 32 bits | IEEE754 | IEEE754 | Float |
double | 64 bits | IEEE754 | IEEE754 | Double |
上表就是java中全部的8种基本数据类型了,其他所有的类型都属于引用类型了(包括枚举类型在内)。其中需要注意的几个点是
然后就可以利用你所学的计算机组成原理知识进行记忆了,掌握规律后还是很好记忆的。**建议可以熟记int类型的大小为4字节,然后就可以很轻松的推出btye,short,long.然后就是我再实际面试中被问到过的问题
千万不要小瞧这个问题,你在面试的时候真的很容易忘!!!如果没打上来会让你非常的荒。首先一定记住一共有8种,千万别忘了还有byte最后千万要记住,String不属于基本数据类型!String不属于基本数据类型!String不属于基本数据类型!
// 语句一
short s1 = 1;
s1 = s1 + 1;
//语句二
short s1 = 1;
s1 +=1;
答案: 第一个赋值语句会报编译错误,因为 1 是int类型的数,执行s1 = s1 + 1 时,式子右部已经自动转化为int类型,在将它赋给左部就会出现类型转换错误。而+=是java语言规定的运算符,java编译器会对它进行特殊处理(实际就是内部做了类型转化short s1 = 1; s1 +=1等价于short s1 = 1; s1=(short)s1+1),因此可以正确编译。
相似的题还有
float f = 3.4
也不正确,因为浮点数的默认类型时double,这个赋值需要进行强制类型转化。
答案: switch支持int类型,不支持浮点类型float,double,因此如果可以自动转化成int类型的都可以,比如btye,short,但是不能支持long.并且在java 1.7以后也可以将switch作用在String上。
答案: fasle, 浮点数不能精确的表示出来,因此造成不等,浮点数比较大小应该采用范围的形式,比如:
1.0 - 0.9< 0.00001
Java 设计当初就提供了 8 种 基本数据类型及对应的 8 种包装数据类型。我们知道 Java 是一种面向对象编程的高级语言,所以包装类型正是为了解决基本数据类型无法面向对象编程所提供的. 包装类允许有空值null , 并且集合类ArrayList,HashMap等的泛型只接受包装类。面试中和笔试中经常出现的除了包装类的一些成员变量和方法,关键就是自动装箱和拆箱机制。
就是自动将基本数据类型转换成包装类型。
Integer i = 8; //自动装箱
//编译结果等价于
Integer i = Integer.valueOf(8);
自动拆箱即自动将包装类型转换成基本数据类型,与自动装箱相反,有装就有拆,很好理解。
int j = i; // 自动拆箱
//编译结果等价于
int j = i.intValue();
先来看一段小程序,你认为会输出什么结果?
public class Test {
public static void main(String[] args) {
Integer n1 = 123;
Integer n2 = 123;
Integer n3 = 128;
Integer n4 = 128;
Integer n5 = new Integer(123);
Integer n6 = new Integer(123);
System.out.println(n1 == n2);
System.out.println(n3 == n4);
System.out.println(n5 == n6);
}
}
运行结果是 :
true
false
false
是不是有点出乎意料,我们知道==比较的是对象的引用,那这里为什么会这出这种情况呢?
原理
这是因为JVM将-128~127的数字(一个字节)缓存起来了,因为这个范围的数字最长被使用。用于提升性能和节省内存。所以这个范围内的自动装箱(相当于调用valueOf(int i)方法)的数字都会从缓存中获取,返回同一个数字。因此第一个比较会是true。而128不在这个范围内,因此数字不会被缓存,所以会new出新的对象,所以比较结果为false.
同理我们通过new Integer(123)的方法就不会从缓存中获取,因为他是直接new出来的会重新创建对象,所以返回false,大家可以自行测试。
也因此在我们使用中Integer时应该通过equals()方法去比较而不是==