整理自各种各样的面经、博客等,对问题的回答博主自身优化过。
钻石问题(菱形继承)所引发的二义性问题: 假设类B和类C都继承自类A,且都重写了类A的某一个方法,而现在又有类D继承自类A和类B,那么此时类D会继承B、C的该同名方法,那么类D继承的该方法究竟是来自类A还是类B呢?这里产生了歧义。
同理可以扩展到多个类:
这就是为什么Java利用接口来变相实现多重继承,接口中的方法都是未实现的,不会出现歧义问题。
Memory Leak是指程序中已经动态分配的堆内存由于某种原因程序未释放或者无法释放,造成系统内存的浪费,导致程序运行减慢甚至是系统崩溃等严重后果。
Java中有8种情况会出现内存泄露:
Connection
、Statement
或ResultSet
,将会造成大量对象无法被回收,从而引起内存泄露。
null
,否则很有可能导致内存泄露。例:栈中弹出的对象不再使用应设置为null
,否则GC不会释放这部分内存。
contains
方法检索该对象时将返回false
,因而也无法单独删除该对象,造成内存泄露。
WeakHashMap
来替代HashMap
,这种Map的特点是,如果除了自身对key存在引用,没有其他引用存在时会自动丢弃该key。
WeakHashMap
中的键。