Java面试复习4 Java的数据类型,简单却要注重细节
Java面试复习5 Java的数据类型
声明:本面试复习都基于一本未署名的Java面试宝典所述,根据自己的理解写出了这一专栏的复习博客
-
Java的基本数据类型都有哪些?各占多少字节?
很基础的一道题,答案如图:
注意:在Boolean这里,有些情况下不是占用1个字节,但是通常情况下是。
详情可看复习笔记1。有做相关的阐述。顺便的,我们可以借助此题完成对数据类型的复习
除了上述的基本数据类型之外,Java中还有一种引用数据类型,包括:
数组,接口,类(包括String类型)
-
String是基本数据类型吗?
并不是,String属于引用数据类型,底层是通过char数组实现的。 -
short s1 = 1; s1 = s1 +1;有错吗?short s1 = 1; s1+=1;有错吗?说出原因
从常理推断来看,这两段代码的输出结果应该是一样的,但是事实是前者不正确,后者是正确的,我们可以从根源上找问题:
两段代码无论是哪一段,s1都是属于short类型的变量,但是1属于整形,也就是int类型,
前者进行s1=s1+1的时候,s1+1运算后的结果属于整形,而short类型需要一个short类型的值,这个结果明显不匹配,因此会报错。
而第二种情况下,s1+=1中,自动对于结果进行了一个隐藏的强制类型转换,相当于s1=(short)(s1+1),故而=两边的类型一致,可以进行赋值操作。
这里我们也顺带借助此题对类型转换方面进行复习。-
自动类型转换
容量小的数据在进行运算时将自动转换为高容量的数据类型,比如上面的对s1的运算。其容量大小排序为:
但是,char,byte,short这几个数据之间不能自动转换。
在多种类型数据运算的时候,都是将数据统一转换为最大容量的数据,在进行计算。 -
强制类型转换
与之相反,大转小,使用时需要谨慎,可能会出现数据精度的丢失。
-
自动类型转换
-
int 和Integer有什么区别?
Integer属于int的包装类。这里我们需要回顾下包装类的自动拆箱/装箱机制,具体看作者的叙述: -
解答下题: (对于包装类至关重要的理解)
这道题乍一看非常简单,但是实际上玄机很深。需要对底层代码有充分的认知。我们来看一下Integer包装类底层的代码。
首先我们在进行赋值的时候坑就已经挖好了,这里我们要将一个整形的常量赋值给包装类,需要先经过类型的转换,int->Integer,需要通过valueOf方法实现转换。这也是自动拆装箱的原理。
这只是第一步,而且在比较的时候,由于是包装类,这几个变量其实都是包装类Integer对象引用,所以在比较的时候,我们将==不再比较值得大小,而是比较其引用地址 (这是非常关键的认识!!!!!必须谨记!!!!)在知道这个之后,我们还需要看一下这里的代码:
分析后也就是说,如果整形数字常量在-128——127之间的话,那么就不会new一个新的Integer对象,而是会在常量池中寻找符合的数字常量,那样就不会有全新的地址值,也就是比较的是常量的值得大小了。所以前者为true,后者为false。
-
String类的常用方法有哪些?
这一点其实在前面的API相关博客中都有写,这里粘贴作者的解答
-
String,StringBuffer/StringBuilder,三者之间的区别?
前面的API博客中也有介绍,这里来总体叙述下:
-
可变性分析
String:不可变,属于字符串常量,创建时相当于在字符串常量池中创建了一个不可变的String值,如果发生修改,先检查是否有匹配字符串,若没有,重新创建。
StringBuffer/StringBuilder:可变,每次操作都是对其自身创建对象的修改,并不会生成新的对象,要求字符串经常改变的情况下非常适合使用,主要的方法:append,insert等 -
线程安全性分析
String:安全,因为其不可变。
StringBuffer:线程安全(对调用方法加入同步锁),但执行效率较慢,适用于多线程下操作字符串缓冲区的大量数据。
StringBuilder:线程不安全,适用于单线程下操作字符串缓冲区的大量数据。 -
共同点
StringBuffer和StringBuilder都有共同的父类 AbstractStringBuilder(抽象类)
他们两个的方法都会调用父类中的公共方法,只是前者会在调用方法是加入synchronize关键字来加入同步锁,使线程更安全,最后如果程序不是多线程的,那么后者的效率要高于前者。
-
可变性分析
-
数据类型的转换。
String类型怎么转换为基本数据类型。
以int为例,调用其包装类Integer中的方法valueOf(String数据)或者parseInt(String数据),其他类型换名字即可。基本数据类型怎么转换为String类型。
同样为例,使用字符串拼接符号+将int类型的数据与""空字符串连接可以得到,
或者调用String类中的int.valueOf()数据返回String类型的数据.