java面试题02

来源:互联网 发布:上帝已死 知乎 编辑:程序博客网 时间:2024/06/16 22:02

一、Java中的原始数据类型都有哪些,它们的大小及对应的封装类是什么?

(1)boolean

boolean数据类型非true即false。这个数据类型表示1 bit的信息,但是它的大小并没有精确定义。

《Java虚拟机规范》中如是说:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位”。这样我们可以得出boolean类型单独使用是4个字节,在数组中又是1个字节。那虚拟机为什么要用int来代替boolean呢?为什么不用byte或short,这样不是更节省内存空间吗?实际上,使用int的原因是,对于当下32位的CPU来说,一次进行32位的数据交换更加高效。

综上,我们可以知道:官方文档对boolean类型没有给出精确的定义,《Java虚拟机规范》给出了“单独时使用4个字节,boolean数组时1个字节”的定义,具体还要看虚拟机实现是否按照规范来,所以1个字节、4个字节都是有可能的。这其实是一种时空权衡。

boolean类型的封装类是Boolean。

(2)byte——1 byte——Byte

(3)short——2 bytes——Short

(4)int——4 bytes——Integer

(5)long——8 bytes——Long

(6)float——4 bytes——Float

(7)double——8 bytes——Double

(8)char——2 bytes——Character

二、object中定义了哪些方法?

clone(), equals(), hashCode(), toString(), notify(), notifyAll(), wait(), finalize(), getClass()

三、String, StringBuilder, StringBuffer的区别是什么?

String: 不可变的字符序列,若要向其中添加新字符需要创建一个新的String对象

StringBuilder: 可变字符序列,支持向其中添加新字符(无需创建新对象)

StringBuffer: 可以看作线程安全版的StringBuilder

四、HashMap和HashTable的区别

HashTable是线程安全的,而HashMap不是

HashMap中允许存在null键和null值,而HashTable中不允许

五、Java中的异常层次结构

Java中的异常层次结构如下图所示:

我们可以看到Throwable类是异常层级中的基类。Error类表示内部错误,这类错误使我们无法控制的;Exception表示异常,RuntimeException及其子类属于未检查异常,这类异常包括

ArrayIndexOutOfBoundsException、NullPointerException等,我们应该通过条件判断等方式语句避免未检查异常的发生。IOException及其子类属于已检查异常,编译器会检查我们是否为所有可能抛出的已检查异常提供了异常处理器,若没有则会报错。对于未检查异常,我们无需捕获(当然Java也允许我们捕获,但我们应该做的事避免未检查异常的发生)。

六、Java面向对象的三个特征与含义

三大特征:封装、继承、多态。

七、简述Java中创建新线程的两种方法

继承Thread类(假设子类为MyThread),并重写run()方法,然后new一个MyThread对象并对其调用start()即可启动新线程。

实现Runnable接口(假设实现类为MyRunnable),而后将MyRunnable对象作为参数传入Thread构造器,在得到的Thread对象上调用start()方法即可。

八、反射的作用与原理

反射的作用概括地说是运行时获取类的各种定义信息,比如定义了哪些属性与方法。原理是通过类的class对象来获取它的各种信息。

九、for-each与常规for循环的效率对比

关于这个问题我们直接看《Effective Java》给我们做的解答:

for (Element e : elements) { doSomething(e);

}

for-each能够让代码更加清晰,并且减少了出错的机会。下面的惯用代码适用于集合与数组类型:

使用for-each循环与常规的for循环相比,并不存在性能损失,即使对数组进行迭代也是如此。实际上,在有些场合下它还能带来微小的性能提升,因为它只计算一次数组索引的上限。

十、注解的基本概念与使用

注解可以看作是“增强版的注释”,它可以向编译器、虚拟机说明一些事情。

注解是描述Java代码的代码,它能够被编译器解析,注解处理工具在运行时也能够解析注解。注解本身是“被动”的信息,只有主动解析它才有意义。

除了向编译器/虚拟机传递信息,我们也可以使用注解来生成一些“模板化”的代码。

原创粉丝点击