Java2面试常见问题(简单)HashMap和Hashtable有什么区别?线程是否安全:HashMap不是线程安全的,而Hashtable是线程安全的,因为Hashtable里面的方法基本都是synchronized修饰的。(如果要保证线程安全,就用ConcurrentHashMap吧!)效率:因为Hashtable加了同步锁。所以HashMap比Hashtable效率高一点。另外,Hashtable基本被淘汰,不要在代码中使用它对Nullkey和Nullvalue的支持:HashMap可以存储nullkey和value,但是只能有一个null作为key,多个null作为value;Hashtable不允许Null键和null值,否则抛出NullPointerException。初始容量与每次扩容容量的区别:①如果创建时没有指定容量初始值,Hashtable默认初始大小为11,每次扩容后容量变为原来的2n+1。HashMap默认初始化大小为16,每次扩容后,容量变成原来的2倍。②如果在创建的时候给定了capacity的初始值,那么Hashtable会直接使用你给的大小,而HashMap会把它扩充到2的次方的大小。也就是说,HashMap总是使用2的次方作为哈希表的大小。底层数据结构:JDK1.8之后的HashMap在解决hash冲突方面发生了较大变化。当链表长度大于阈值(默认为8)(在链表转红黑树之前会进行判断,如果当前数组长度小于64,则选择先扩充数组而不是转成红黑树),将链表转成红黑树减少查找时间。哈希表没有这样的机制。Spring事务的理解?Spring支持程序化事务管理和声明式事务管理。程序化事务管理是侵入式事务管理。使用TransactionTemplate或直接使用PlatformTransactionManager。对于编程式事务管理,Spring推荐使用TransactionTemplate。声明式事务管理声明式事务管理基于AOP。它的本质是拦截方法前后,然后在目标方法开始前创建或加入一个事务,在目标方法执行后根据执行情况进行commit或rollback。Java会不会有内存泄漏?请简单描述一下,所谓内存泄漏,就是一个不再被程序使用的对象或变量,一直被占用在内存中。Java中有一种垃圾回收机制,可以保证当一个对象不再被引用时,即该对象成为孤儿时,该对象会被垃圾回收器自动从内存中清除。因为Java使用有向图进行垃圾回收管理,可以消除引用循环的问题。比如有两个相互引用的对象,只要根进程不可达,GC也可以回收。比如下面的代码你可以看到针对这种情况的内存回收。Java中内存泄漏的情况:长寿命对象持有短寿命对象的引用很可能造成内存泄漏,虽然短寿命对象不再需要了,但是由于长寿命对象持有对它们的引用导致的,它不能回收。这就是Java内存泄漏的场景。通俗地说,程序员可能创建了一个对象,以后再也不用这个对象了,但是这个对象一直是被引用的,也就是这个对象没用但不能用。被垃圾回收器回收,这是java中可能会出现内存泄漏的地方。例如,在缓存系统中,我们在缓存中加载一个对象(例如,在全局地图对象中),然后再也不会使用它。该对象已被缓存引用,但不再使用。在Java中检查内存泄漏,必须让程序执行所有的分支,直到程序结束,然后检查一个对象是否被使用过。如果不是,则可以确定该对象是内存泄漏。如果一个外部类的实例对象的方法返回了一个内部类的实例对象,则内部类对象被长期引用,即使不再使用外部类实例对象,但由于内部类持久化了外部类类实例对象,这个Outer类对象不会被垃圾回收,同样会造成内存泄漏。什么是GC?为什么会有GC?GC是垃圾回收(GabageCollection)的意思。内存处理是程序员容易出问题的地方。忘记或错误的内存恢复将导致程序或系统不稳定甚至崩溃。Java提供了GC功能,可以自动监测对象是否超出范围,达到自动回收内存的目的。Java语言并没有提供明确的释放分配内存的操作方法。简述Java垃圾回收机制在Java中,程序员不需要显式释放一个对象的内存,而是由虚拟机自己执行。在JVM中,有一个垃圾回收线程,它的优先级很低,一般情况下是不会执行的。只有在虚拟机空闲或当前堆内存不足时才会触发。引用的对象并将它们添加到要回收的集合中,以供回收。垃圾回收的优点和原理。并考虑两种回收机制。Java语言的一个显着特点是引入了垃圾回收机制,解决了C++程序员最头疼的内存管理问题。它使得Java程序员在编写程序时不再需要考虑内存管理。由于垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象引用才有“作用域”。垃圾回收可以有效防止内存泄漏,有效使用可用内存。垃圾收集器通常作为单独的低级线程运行。在不可预测的情况下,它会清除和回收内存堆中已经死亡或长时间未使用的对象。程序员无法实时调用垃圾收集器。垃圾收集的对象或所有对象。回收机制包括分代复制垃圾回收、标记垃圾回收和增量垃圾回收。什么是深拷贝和浅拷贝?简单来说,就是复制和克隆。浅拷贝就是简单的给对象中的数据成员赋值。如果有动态成员或指针,就会报错。而且,如果有引用类型的变量,新生成的对象和复制的对象的这个属性会指向同一个地方,不解耦的话,会互相影响,两个对象会有相同的值(穿一个一条裤子)。对于原始数据类型,这两个方面是独立的。深拷贝就是为对象中存在的动态成员或指针重新开辟内存空间。而且,如果有引用类型的变量,新生成的对象和复制的对象的属性会指向两个地方,解耦,不会互相影响。如果两个对象分别修改,则不会相互影响。什么是分布式垃圾收集(DGC)?它是如何工作的?DGC全称为分布式垃圾收集。RMI使用DGC进行自动垃圾收集。因为RMI包含对跨虚拟机的远程对象的引用,所以垃圾回收很困难。DGC使用引用计数算法为远程对象提供自动内存管理。简述Java内存分配和回收策略,MinorGC和MajorGC对象首先分配在堆的Eden区。大对象直接进入老年代。执行MinorGC的机会。MinorGC一般发生在新生代的Eden区。该区域的对象生命周期较短,经常发生Gc的频率比较高,回收速度也比较快;FullGC/MajorGC发生在老年代。一般老年代触发时GC不会触发MinorGC,但是通过配置可以在FullGC之前先进行MinorGC,这样可以加快老年代的回收速度。
