在java学习中遇到的一些经典问题和解答(4)

1.如何权衡是使用无序的数组还是有序的数组?

有序数组的最大好处在与查找的时间复杂度是O(log n),而无序数组是O(n)。
有序数组的缺点是插入操作的时间复杂度是O(n),因为值大的元素需要往后移动来给新元素腾位,相反,无序数组的插入时间复杂度是常量O(1)。

2.Java集合类框架的最佳实践有哪些?

根据应用的需要合理的选择集合的类型对性能非常重要

假如元素的大小是固定的,而且能事先知道,我们就该用Array而不是ArrayList.

有些集合类允许指定初始容量。因此,如果我们能估计出存储元素的数目,我们可以设置初始容量来避免重新计算hash值或者扩容.

为了类型安全,可读性和健壮性的原因总要使用翻新。同时,使用泛型还能皮面运行时的ClassCastException.

使用JDK提供的不变类(immutable class)作为Map的键可以避免为我们自己的类实现hashCode()和equals()方法。

编程的时候接口优于实现。

底层的集合实际上是空的情况下返回长度是0的集合或者是数组,不要返回null.

3.Enumeration接口和Iterator接口的区别有哪些?

Enumeration速度是Iterator的两倍,同时占用更少的内存。
Iterator远远比Enumeration安全,因为其他线程不能修改正在被iterator遍历的集合里面的对象。
iterator允许调用者删除底层集合里面的元素,但是对于Enumeration不能。

4.HashSet和TreeSet有什么区别?

HashSet是由一个hash表来实现的,因此,它的元素是无序的。add,,remove,contains方法的时间复杂度是O(1).
TreeSet是由一个树形结构来实现的,它里面的元素是有序的。add,remove,contains方法的时间复杂度是O(log n)。

5.java中垃圾回收有什么目的?什么时候进行垃圾回收?

垃圾回收目的是识别并且丢弃应用不再使用的对象来释放和重用资源。
1.当应用程序空闲时,即没有应用线程在运行时。
2.java堆内存不足时。

6.System.gc()和Runtime.gc()会做什么事情?

这两个方法都是提示JVM要进行垃圾回收。但是,立即开始还是延迟进行垃圾回收还是取决于JVM的。

7.finalize()方法什么时候被调用?析构函数(finalization)的目的是什么?

垃圾回收器(garbage collector)决定回收某对象时,就会运行该对象的finalize()方法 但是在Java中很不幸,如果内存总是充足的,那么垃圾回收可能永远不会进行,也就是说filalize()可能永远不被执行,显然指望它做收尾工作是靠不住的。 那么finalize()究竟是做什么的呢?它最主要的用途是回收特殊渠道申请的内存。Java程序有垃圾回收器,所以一般情况下内存问题不用程序员操心。但有一种JNI(Java Native Interface)调用non-Java程序(C或C++),finalize()的工作就是回收这部分的内存。

8.如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存?

不会立即释放对象占用的内存。 如果对象的引用被置为null,只是断开了当前线程栈帧中对该对象的引用关系,而 垃圾收集器是运行在后台的线程,只有当用户线程运行到安全点(safe point)或者安全区域才会扫描对象引用关系,扫描到对象没有被引用则会标记对象,这时候仍然不会立即释放该对象内存,因为有些对象是可恢复的(在 finalize方法中恢复引用 )。只有确定了对象无法恢复引用的时候才会清除对象内存。

9.java堆的结构是什么样子的?什么事堆内存中的永久代?

JVM的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存。它在JVM启动的时候被创建。对象所占的堆内存是由自动内存管理系统也就是垃圾收集器回收。

堆内存是由存活和死亡的对象组成的。存活的对象是应用可以访问的,不会被垃圾回收。死亡的对象是应用不可访问尚且还没有被垃圾收集器回收掉的对象。一直到垃圾收集器把这些对象回收掉之前,他们会一直占据堆内存空间。

永久代是用于存放静态文件,如Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate 等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类,永久代中一般包含:

类的方法(字节码…)

类名(Sring对象)

.class文件读到的常量信息

class对象相关的对象列表和类型列表 (e.g., 方法对象的array).

JVM创建的内部对象

JIT编译器优化用的信息

10.串行(serial)收集器和吞吐量(throught)收集器的区别是什么?

吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规模和大型规模数据的应用程序。而串行收集器对于大多数的小应用(在现代处理器上大概需要100M左右的内存)就足够了。

猜你喜欢

转载自blog.csdn.net/huangpeng_HP/article/details/86579019
今日推荐