本文写给正在努力的自己,努力的补基础知识,五道题一篇
ps:我把答案都放在解析下面了,我只是知识的搬运工
- Hashtable 和 HashMap 的区别是:
A. Hashtable 是一个哈希表,该类继承了AbstractMap,实现了Map接口
B. HashMap是内部基于哈希表实现,该类继承AbstractMap,实现Map接口
C. Hashtable线程安全,而HashMap是线程不安全的
D. Properties类继承了Hashtable类,而Hashtable类则继承Dictionary类
E. HashMap允许将null作为一个entry的key或者value,而Hashtable不允许
解析:以下是Hashtable和HashMap的部分源码,我们可以看出来HashMap继承的是AbstractMap,而Hashtable继承的是Dictionary,他们都实现了Map接口,Cloneable接口和Serializable接口。
Hashtable为线程安全的,HashMap是线程不安全的
我们分开来讲一下Hashtable和HashMap
Hashtable:
(1)它是一个散列表,它存储的内容是键值对(key-value)的映射
(2)Hashtable的函数都是同步的,这意味着它是线程安全的,它的key,value均不可以为null
(3)Hashtable直接使用对象hashCode
HashMap:
(1)由数组+链表组成的,基于哈希表的Map实现,数组是HashMap的主体,链表是主要为了解决哈希冲突而存在的
(2)它不是线程安全的,HashMap可以接收为null的key,value
(3)HashMap重新计算hash值
public class HashMap<K, V> extends AbstractMap<K, V> implements Map<K, V>, Cloneable, Serializable {
public class Hashtable<K, V> extends Dictionary<K, V> implements Map<K, V>, Cloneable, Serializable {
答案:BCDE
- final,finally,finalize三个关键字的区别是什么?
A. final是关键字,可以修饰类,方法,变量
B. finally在异常处理的时候使用,提供finally块来执行操作
C. finalize是方法名,在垃圾收集器对象从内存中清除之前必要的清理工作
D. finally和finalize一样都是用于异常处理的方法
解析:
final:可以定义变量,方法传入的参数,类,方法
finally:只能跟在try/catch语句中,并且附带一个语句块
finalize:是垃圾回收器操作的运行机制中的一部分,进行垃圾回收操作时会调用finalize方法,因为finalize方法是object的方法,所以每个类都有这个方法并且可以重写这个方法,在这个方法里实现释放系统资源及其他清理工作,JVM不保证此方法总被调用
答案:ABC
- 以下那些jvm的垃圾回收方式采用的是复制算法回收?
A. 新生代串行收集器
B. 老年代串行收集器
C. 并行收集器
D. 新生代回收收集器
E. 老年代并行回收收集器
F. cms收集器
解析:两个最基本的java回收算法:复制算法和标记清理算法
复制算法:在两个区域A,B,初识对象在A,继续存活不被清理的对象复制到B,此为新生代最常用的算法
标记清理:一块区域,标记可对象(可达性分析算法,根节点ROOT),然后回收不可达对象,会产生碎片,那么引出标记-整理算法:多了碎片整理,整理出更大的内存存放更大的对象
新生代和老年代两个概念的区分
新生代:初识对象,生命周期短
老年代(永久代):长时间存在的对象
整个java的垃圾回收是新生代和老年代的协作,这种叫做分代回收
Serial New收集器是针对新生代的收集器,采用的是复制算法
Parallel New(并行)收集器,新生代采用复制算法,老年代采用标记整理
Parallel Scavenge(并行)收集器,针对新生代,采用复制收集算法
Serial Old(串行)收集器,新生代采用复制,老年代采用标记整理
Parallel Old(并行)收集器,针对老年代,标记整理
CMS收集器,基于标记清理
G1收集器:整体上是基于标记 整理 ,局部采用复制
答案:AD
- 以下类型为Final类型的为?
A. HashMap
B. StringBuffer
C. String
D. Hashtable
解析:StringBuilder , StringBuffer ,String 都是 final 的,但是为什么StringBuilder , StringBuffer可以进行修改呢,因为不可变包括的是,引用不可变以及对象不可变,而这三个都是属于引用不可变,(也就是地址不要变,里面的内容随心所欲),而StringBuilder , StringBuffer 中都包含右append方法,可对对象中的内容进行增加。
而String a=“123”+new String(“456”);实际上底层是用了一个StringBuffer 进行append;
答案:BC
- jre判断程序是否执行结束的标准是
A. 所有前台线程执行完毕
B. 所有后台线程执行完毕
C. 所有线程执行完毕
解析:
main()函数即主函数,是一个前台线程,前台线程是程序中必须执行完成的,而后台线程则是java中所有的前台线程结束后结束,不管有没有完成,后台线程主要用于内存分配等方面
1. 后台线程不会阻止进程的终止,属于某个进程所有前台程序都终止后,该进程就会终止,所有剩余的后台线程都会停止且不会继续运行
2. 可以在任何时候将前天线程修改为后台线程,方式是设置Thread.isBackground属性
3. 不管是前台线程还是后台线程,如果线程内出现了异常,都会导致进程的终止(内存溢出等)
4. 托管线程池中的线程都是后台线程,使用new Thread方法创建的线程默认都是前台线程
强调:
应用程序的主线程以及使用Thread构造的线程都默认为前台线程
答案:A