精选Java面试题(二)

Java中的方法覆盖重写(Overriding)和方法重载(Overloading)是什么意思?

Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖重写是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。

 

Java的四种引用,强弱软虚,用到的场景

1.  强引用:如果一个对象具有强引用,它就不会被垃圾回收器回收。即使当前内存空间不足,JVM也不会回收它,而是抛出 OutOfMemoryError 错误,使程序异常终止。如果想中断强引用和某个对象之间的关联,可以显式地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象

2.  软引用:在使用软引用时,如果内存的空间足够,软引用就能继续被使用,而不会被垃圾回收器回收,只有在内存不足时,软引用才会被垃圾回收器回收。

3.  弱引用:具有弱引用的对象拥有的生命周期更短暂。因为当 JVM 进行垃圾回收,一旦发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收。不过由于垃圾回收器是一个优先级较低的线程,所以并不一定能迅速发现弱引用对象

4.  虚引用:顾名思义,就是形同虚设,如果一个对象仅持有虚引用,那么它相当于没有引用,在任何时候都可能被垃圾回收器回收。

使用场景:

1.  利用软引用和弱引用解决OOM问题:用一个HashMap来保存图片的路径和相应图片对象关联的软引用之间的映射关系,在内存不足时,JVM会自动回收这些缓存图片对象所占用的空间,从而有效地避免了OOM的问题

2.  通过软可及对象重获方法实现Java对象的高速缓存:比如我们创建了一Employee的类,如果每次需要查询一个雇员的信息。哪怕是几秒中之前刚刚查询过的,都要重新构建一个实例,这是需要消耗很多时间的。我们可以通过软引用和 HashMap 的结合,先是保存引用方面:以软引用的方式对一个Employee对象的实例进行引用并保存该引用到HashMap 上,key 为此雇员的id,value为这个对象的软引用,另一方面是取出引用,缓存中是否有该Employee实例的软引用,如果有,从软引用中取得。如果没有软引用,或者从软引用中得到的实例是null,重新构建一个实例,并保存对这个新建实例的软引用

 

32 位和 64 位的 JVM,int 类型变量的长度是多数? 
32 位和 64 位的JVM 中,int 类型变量的长度是相同的,都是 32 位或者 4 个字节。

 

Java 中堆和栈有什么区别? 
JVM 中堆和栈属于不同的内存区域,使用目的也不同。栈常用于保存方法帧和局部变量,而对象总是在堆上分配。栈通常都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的所有线程共享。 

 Hashtable 与 HashMap 有什么不同之处? 
这两个类有许多不同的地方,下面列出了一部分: 
a) Hashtable 是 JDK 1 遗留下来的类,而 HashMap 是后来增加的。 
b)Hashtable 是同步的,比较慢,但 HashMap 没有同步策略,所以会更快。 
c)Hashtable 不允许有个空的 key,但是 HashMap 允许出现一个 null key。 

 

什么时候使用享元模式? 
享元模式通过共享对象来避免创建太多的对象。为了使用享元模式,你需要确保你的对象是不可变的,这样你才能安全的共享。JDK 中 String 池、Integer池以及 Long 池都是很好的使用了享元模式的例子。 

 

Java集合框架的基础接口有哪些?

  Collection为集合层级的根接口。一个集合代表一组对象,这些对象即为它的元素。Java平台不提供这个接口任何直接的实现。

  Set是一个不能包含重复元素的集合。这个接口对数学集合抽象进行建模,被用来代表集合,就如一副牌。

  List是一个有序集合,可以包含重复元素。你可以通过它的索引来访问任何元素。List更像长度动态变换的数组。

  Map是一个将key映射到value的对象.一个Map不能包含重复的key:每个key最多只能映射一个value。

  一些其它的接口有Queue、Dequeue、SortedSet、SortedMap和ListIterator。

 

Iterater和ListIterator之间有什么区别?

  (1)我们可以使用Iterator来遍历Set和List集合,而ListIterator只能遍历List。

  (2)Iterator只可以向前遍历,而LIstIterator可以双向遍历。

  (3)ListIterator从Iterator接口继承,然后添加了一些额外的功能,比如添加一个元素、替换一个元素、获取前面或后面元素的索引位置。

 

在静态方法里可以访问非静态变量吗? 

Java 中的 static 变量归相应的类所有,它的值对于类的所有实例都是相同的。static 变量是在 JVM 加载类的时候初始化的。如果代码试图访问非静态的变量,而且不是通过类的实例去访问,编译器会报错,因为这些非静态变量还没有被创建呢,并且它们没有与实例相关联。

 

接口和抽象类有什么不同? 

Java同时提供和支持抽象类和接口,它们的实现有一些

共同的特点,也有如下不同: 

接口中所有的方法默认都是抽象的,而抽象类可以同时包含抽象和非抽象的方法。 

一个类可以实现多个接口,但它只能继承一个抽象类。 

一个类要实现某个接口,必须实现这个接口声明的所有方法。而一个类不需要实现抽象父类中声明的所有方法,不过,这时候这个类也必须声明为抽象类。 

抽象类可以实现接口,而且不需要实现接口中的方法。 

接口中声明的变量默认是final的,而抽象类可以包含非final的变量。 

接口中的成员默认是public的,而抽象类的成员可以是private,protected,或public的。 

接口是绝对抽象的,不可实例化,抽象类也不可以实例化,但可以在main方法中触发实例化(注:通过匿名类实现)

 

Java中的 HashMap 是怎么工作的? Java 中的 HashMap 是用来存储键值对

的。 HashMap 需要一个 hash 函数,它使

用 hashCode 和 equals 方法,来进行 collection 中元素的保存和查找。调用 put 方法时,HashMap 会计算键(key)的 hash 值,然后将键值对存到 collection 的适当索引下。如果键已经存在,那么相应的值会更新。HashMap 的重要特征主要有它的容量,装载因子(load factor)和容量扩充(threshold resizing)。。

 

System.gc() 和Runtime.gc()方法用途? 

这些方法用于提醒JVM开始垃圾回收. 然而开始垃圾回收的时机是由JVM决定的.

 

finalize()什么时候被调用 ? 它的目的是什么 ? finallize方法是在释放该对象内存前由gc(垃圾回收器)调用. 通常建议在这个方法中释放该对象持有的资源.

 

如果一个对象的引用被设置为null, gc会立即释放该对象的内存么? 

不会, 这个对象将会在下一次gc循环中被回收. 

 

Java中异常与错误的区别? 

Exception和Error都是Throwable类的子类. Exception用于用户程序需要捕获的异常条件. Error定义了用户程序不可预见的异常 

 

异常处理中finally语句块的重要性? 

不管程序是否发生了异常, finally语句块都会被执行. 甚至当没有catch声明但抛出了一个异常时, finally语句块也会被执行. 最后要说一点: finally语句块通常用于释放资源, 如I/O缓冲区, 数据库连接等等.

 

我们能否声明main()方法为private或protected,或者不用访问修饰符?

不能,main()方法必须public。你不能定义main()方法为private和protected,也不能不用访问修饰符。这是为了能让JVM访问main()方法。如果你不定义main()方法为public,虽然编译也会成功,但你会得到运行时错误,因为找不到main方法。

备注:转载自雨日微风的博客http://blog.csdn.net/songkai320/article/details/51820278

posted @ 2017-12-04 20:13  一骑轻尘  阅读(441)  评论(0编辑  收藏  举报