简介
本人最近找工作,在面试javase基础这里,有很多公司还是喜欢考察基本数据类型和包装类型的使用情况,重点就是考察日常生活中对数据类型的选定还有使用场景做考察,比如问基本数据类型的占几个字节,取值范围多少、基本数据类型默认以及数据类型隐式转化等问题。
基本数据类型
java是一种强类型语言,所以定义一个变量需要声明变量的数据类型,java一共提供了8种数据类型,其中整数类型有byte
、short
、int
、long
,以及2种浮点类型:float
与double
,Unicode编码的字符单元类型char
,以及表示真假的boolean
类型。
- 整数类型
类型 | 存储字节 |
---|---|
byte | 1个字节 |
short | 2个字节 |
int | 4个字节 |
long | 8个字节 |
需要注意的是如果没有制定类型整数类型默认值类型是int。
- 浮点型
类型 | 存储字节 |
---|---|
float | 4个字节 |
double | 8个字节 |
默认情况下浮点型默认是double类型,因为double的数值精度是float的两倍。
- char类型
char类型表示单个字符,通常用来表示字符常量。 - boolean类型
boolean类型有两个值,false和true。
面试题
- int的最大值加1会发送什么结果?
这个是遇到很有意思的面试题,最开始我回答了一个可能会造成溢出,报错什么的。很遗憾面试官说不对,所以面试后特地写个测试方法看看到底会发送什么?
运行结果是true。
这大概是我遇到最有意思的面试题了,因为当时对这块最大值溢出这块并不是很熟悉。所以这道题也并没有回答好。
包装类型
由于基本数据类型属于局部变量表,也就是存储在方法区上。而在java5后引入了包装对象,即基本数据类型有着对应的包装对象类型。包装对象是不可变的,一旦构造了包装对象,就不能改变包装的值,同时包装类对象还是final修饰
的,所以这些包括类没有子类。
类型 | 对应包装对象 |
---|---|
int | Integer |
long | Long |
float | Float |
double | Double |
short | Short |
byte | Byte |
char | Character |
boolean | Boolean |
面试题
包装类型最常见就是考察Integer的一个位于-128和127的一个缓存,通过源码我们可以清晰看到这一点,
一个就是int类型到Integer转变其实是调用了Integer.valueOf
这个方法。
可以清晰看到当值范围在IntegerCache.low与IntegerCache.high也就是-127到128之前,新建的Integer对象都是从缓存里面取的。
@Test
public void testInteger() {
Integer i = 130;
Integer j = new Integer(100);
Integer x = 100;
Integer z = 130;
System.out.println((i == z) + "\n" + (x == j));
}
所以上面输出是false、false。至于为什么要引入包装类,我想应该可以这么理解:java是面向对象的一种语言,将基本类型包装成对象就可以让有对象类的一些操作,虽然包装类对象是不能被继承。(因为被final修饰),但是我们应用对象,正是因为面向对象的几个特征:封装
、继承
、多态
、抽象
。这也是面向对象的核心吧。