Java面试题库之面向对象(四)

34.垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?

1、对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。

通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是”可达的”,哪些对象是”不可达的”。当GC确定一些对象为”不可达”时,GC就有责任回收这些内存空间。

2、可以。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。

细了解一下System.gc()的工作原理:

Java中的内存分配是随着new一个新的对象来实现的,这个很简单,而且也还是有一些可以“改进”内存回收的机制的,其中最显眼的就是这个System.gc()函数。

乍一看这个函数似乎是可以进行垃圾回收的,可事实并不是那么简单。

其实这个gc()函数的作用只是提醒虚拟机:程序员希望进行一次垃圾回收。但是它不能保证垃圾回收一定会进行,而且具体什么时候进行是取决于具体的虚拟机的,不同的虚拟机有不同的对策。

那么下一个问题就是:gc()进行回收的准则是什么?也就是说什么样的对象可以被回收?

简单来说就是:没有被任何可达变量指向的对象。这里的可达是我发明的……意思就是能够找到的,那什么样的是不可达的呢?

比如说:

1 a.v = b;
2 b.v = c;
3 /*
4  *Watch out !
5  */
6 a.v = d;

看一下这段代码:

第一行:对象a的变量v指向了对象b
第二行:对象b的变量v指向了对象c
第六行:对象a的变量v指向了变量d。

这个时候,虽然变量c指向的对象有c以及b.v指向它,但是它们都已经不可达了,为什么?因为唯一可以找到它们的是a.v,但是现在a.v指向了d,所以他们就是不可达的了。

理由也很直观:没有任何可达变量指向你,你还有活下去的理由吗?你就算活下去谁能找得到你呢?

所以说,C++中将释放了的指针置为null的习惯要保留到Java中,因为这有可能是你释放内存的唯一途径。

最后的箴言:不要频繁使用gc函数。

我的建议是:保持代码健壮(记得将不用的变量置为null),让虚拟机去管理内存。

[v_notice]参考资料:[垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?](https://www.cnblogs.com/zhangxiaopeng/p/5001171.html)[/v_notice]

35.静态变量和实例变量的区别?

static int i = 10; //静态变量,类变量

静态方法可以调用静态变量、不可以调用非静态变量。

实例方法可以调用静态变量、实例变量

[v_notice]参考资料:[静态变量和实例变量的区别(配图解释专业术语,通俗易懂)](https://www.cnblogs.com/cmusketeer/p/7686122.html)[/v_notice]

36.是否可以从一个static方法内部发出对非static方法的调用?

静态方法只能访问静态成员。

非静态既可以访问静态,又可以访问非静态。

static修饰的方法可以直接用类名调用。

静态变量可以被对象调用,还可以被类名调用。

非static修饰的方法只能被对象调用,必须用类new出对象才能调用。

当我们用类名直接调用时,可能这个类的对象并没有new。

如果这时候static方法里调用非static的方法就会出现空指针异常,当然这种错误编译时就不会通过。

37.写clone()方法时,通常都有一行代码,是什么?

clone 有缺省行为,super.clone();他负责产生正确大小的空间,并逐位复制。

38.JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?

try:执行部分,产生异常

catch:捕捉异常

finally:不管有没有异常都执行

throws:在方法声明处声明要抛出的异常,调用者必须对其进行处理。

throw:抛出一个异常

在try中可以抛出异常,一般与声明的异常相同。

自定义异常要继承于Exception或Exception的子类

39.冒泡排序法

//相邻两个数比较,将最小或最大的放到后面,最后面数的不参与比较

40.String and StringBuffer的区别?

String:长度给定不可变,当多个字符串联合时要先转为StringBuffer,再联合,速度慢。

StringBuffer:长度可变,可以将多个字符串值直接联合,效率高

[v_notice]参考资料:[String类和StringBuffer类的区别](https://www.cnblogs.com/rpp506815950/archive/2012/11/07/2758646.html)[/v_notice]

41.集合的作用是什么?

数据的传送 增、删、改、查、constainsAll,可以存放不同类型的对象。

42.集合的通用方法有那些?通用方法是什么?(操作)

集合List 的遍历方法有:
Iterator:
Enumeration
For
Get
set

Collection的通用方法有:
Iterator()
add()
clear();
remove()

43.说出ArrayList,Vector, LinkedList的存储性能和特性HashMap和Hashtable的区别
ArrayList Vector:以数组的方式存储,增、删慢,查、改快

ArrayList:线程不安全,速度快

Vector:线程安全,速度慢(synchoronized)

LikedList: 以单链表的方式存储,增、删快,查、改慢

HashMap与Hashtable都实现的Map接口,HashTable线程安全,HashMap线程不安全。

[v_notice]参考资料:[ArrayList、Vector、LinkedList、HashMap、HashTable的存储性能和特性](https://www.cnblogs.com/holyshengjie/p/6500526.html)[/v_notice]

44.Collection 和 Collections的区别。

Collection是集合的根接口,其下有set及list

Collections是集合的算法。

[v_notice]参考资料:[Collection和Collections的区别及Collections常用方法](https://www.jianshu.com/p/0494cce4312a)[/v_notice]

本站所有文章均由网友分享,仅用于参考学习用,请勿直接转载,如有侵权,请联系网站客服删除相关文章。若由于商用引起版权纠纷,一切责任均由使用者承担
极客文库 » Java面试题库之面向对象(四)

Leave a Reply

欢迎加入「极客文库」,成为原创作者从这里开始!

立即加入 了解更多