Java 中常见面试题二(简略)
HashMap 和 Hashtable 的区别?
- 线程是否平安:HashMap 是非线程平安的,Hashtable 是线程平安的, 因为 Hashtable 外部的办法根本都通过 synchronized 润饰。(如果你要保障线程平安的话就应用 ConcurrentHashMap 吧!)
- 效率:因为 Hashtable 加了 synchronized 锁。所以 HashMap 要比 Hashtable 效率高一点。另外,Hashtable 根本被淘汰,不要在代码中应用它
- 对 Null key 和 Null value 的反对:HashMap 能够存储 null 的 key 和 value,但 null 作为键只能有一个,null 作为值能够有多个;Hashtable 不容许有 null 键和 null 值,否则会抛出 NullPointerException。
- 初始容量大小和每次裁减容量大小的不同:① 创立时如果不指定容量初始值,Hashtable 默认的初始大小为 11,之后每次裁减,容量变为原来的 2n+1。HashMap 默认的初始化大小为 16。之后每次裁减,容量变为原来的 2 倍。② 创立时如果给定了容量初始值,那么 Hashtable 会间接应用你给定的大小,而 HashMap 会将其裁减为 2 的幂次方大小。也就是说 HashMap 总是应用 2 的幂作为哈希表的大小。
- 底层数据结构:JDK1.8 当前的 HashMap 在解决哈希抵触时有了较大的变动,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果以后数组的长度小于 64,那么会抉择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以缩小搜寻工夫。Hashtable 没有这样的机制。
Spring 事务的了解?
Spring 反对编程式事务管理以及申明式事务管理两种形式
- 编程式事务管理
编程式事务管理是侵入性事务管理,应用 TransactionTemplate 或者间接应用 PlatformTransactionManager,对于编程式事务管理,Spring 举荐应用 TransactionTemplate。 - 申明式事务管理
申明式事务管理建设在 AOP 之上,其本质是对办法前后进行拦挡,而后在指标办法开始之前创立或者退出一个事务,执行完指标办法之后依据执行的状况提交或者回滚。
Java 中会存在内存透露吗,请简略形容
- 所谓内存泄露就是指一个不再被程序应用的对象或变量始终被占据在内存中。Java 中有垃圾回收机制,它能够保障一对象不再被援用的时候,即对象变成了孤儿的时候,对象将主动被垃圾回收器从内存中革除掉。因为 Java 应用有向图的形式进行垃圾回收治理,可 以打消援用循环的问题,
- 例如有两个对象,互相援用,只有它们和根过程不可达的,那么 GC 也是能够回收它们的,例如上面的代码能够看到这种状况的内存回收。
- Java 中的内存泄露的状况: 长生命周期的对象持有短生命周期对象的援用就很可能产生内存泄露,只管短生命周期对象曾经不再须要,然而因为长生命周期对象持有它的援用而导致不能被回收,这就是 Java 中内存泄露的产生场景,艰深地说,就是程序员可能创立了一个对象,当前始终不再应用这个对象,这个对象却始终被援用,即这个对象无用然而却无奈被垃圾回收器回收的,这就是 java 中可能呈现内存泄露的状况,例如,缓存零碎,咱们加载了一个对象放在缓存中(例如放在一个全局 map 对象中), 而后始终不再应用它,这个对象始终被缓存援用,但却不再被应用。
- 查看 Java 中的内存泄露,肯定要让程序将各种分支状况都残缺执行到程序完结,而后看某个对象是否被应用过,如果没有,则能力断定这个对象属于内存泄露。
- 如果一个外部类的实例对象的办法返回了一个外部类的实例对象,这个外部类对象被长期援用了,即便那个外部类实例对象不再被应用,但因为外部类长久外部类的实例对象,这个外部类对象将不会被垃圾回收,这也会造成内存泄露。
GC 是什么? 为什么要有 GC?
GC 是垃圾收集的意思(GabageCollection),内存解决是编程人员容易呈现问题的中央,遗记或者谬误的内存回收会导致程序或零碎的不稳固甚至解体,Java 提供的 GC 性能能够主动监测对象是否超过作用域从而达到主动回收内存的目标,Java 语言没有提供开释已分配内存的显示操作方法。
简述 Java 垃圾回收机制
在 Java 中,程序员是不须要显示的去开释一个对象的内存的,而是由虚拟机自行执行。在 JVM 中,有一个垃圾回收线程,它是低优先级的,在失常状况下是不会执行的,只有在虚拟机闲暇或者以后堆内存不足时,才会触发执行,扫面那些没有被任何援用的对象,并将它们增加到要回收的汇合中,进行回收。
垃圾回收的长处和原理。并思考 2 种回收机制
- Java 语言中一个显著的特点就是引入了垃圾回收机制,使 C ++ 程序员最头疼的内存治理的问题迎刃而解,它使得 Java 程序员在编写程序的时候不再须要思考内存治理。
- 因为有个垃圾回收机制,Java 中的对象不再有“作用域”的概念,只有对象的援用才有 ” 作用域 ”。垃圾回收能够无效的避免内存泄露,无效的应用能够应用的内存。
- 垃圾回收器通常是作为一个独自的低级别的线程运行,不可预知的状况下对内存堆中曾经死亡的或者长时间没有应用的对象进行分明和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。
- 回收机制有分 代复制垃圾回收 、 标记垃圾回收 、 增量垃圾回收。
深拷贝和浅拷贝是什么?
- 简略来讲就是复制、克隆。
- 浅拷贝就是对对象中的数据成员进行简略赋值,如果存在动静成员或者指针就会报错。而且,如果有援用类型的变量,新生成的对象和被拷贝的对象的这个属性会指向同一个中央,没有解耦,会影响对方,两个对象会领有一样的值(穿一条裤子)。对根本数据类型来说,两边是独立的。
- 深拷贝就是对对象中存在的动静成员或指针从新开拓内存空间。而且,如果有援用类型的变量,新生成的对象和被拷贝的对象的这个属性会指向两个中央,解耦了,不会影响对方,两个对象别离做批改的话,不会影响到对方。
什么是分布式垃圾回收(DGC)? 它是如何工作的?
- DGC 叫做分布式垃圾回收。
- RMI 应用 DGC 来做主动垃圾回收。因为 RMI 蕴含了跨虚拟机的近程对象的援用,垃圾回收是很艰难的。DGC 应用援用计数算法来给近程对象提供主动内存治理。
简述 Java 内存调配与回收策率以及 Minor GC 和 Major GC
- 对象优先在堆的 Eden 区调配
- 大对象间接进入老年代
- 长期存活的对象将间接进入老年代
- 当 Eden 区没有足够的空间进行调配时,虚构机会执行一次 Minor GC。
- Minor GC 通常产生在新生代的 Eden 区,在这个区的对象生存期短,往往产生 Gc 的频率较高,回收速度比拟快;
- Full GC/Major GC 产生在老年代,个别状况下,触发老年代 GC 的时候不会触发 Minor GC, 然而通过配置,能够在 Full GC 之前进行一次 Minor GC 这样能够放慢老年代的回收速度。