Java最新面试题
本人免费整理了java高级资料,涵盖了java、redis、mongodb、mysql、zookeeper、spring cloud、dubbo高并发分布式等教程,一共30g,需要自己领取。
传送门:https://mp.weixin.qq.com/s/igmojff-bbmq6ircgo3mqa
51、类examplea继承exception,类exampleb继承examplea。
有如下代码片断:
try { throw new exampleb("b") } catch(examplea e){ system.out.println("examplea"); } catch(exception e){ system.out.println("exception"); }
请问执行此段代码的输出是什么?
答:输出:examplea。(根据里氏代换原则[能使用父类型的地方一定能使用子类型],抓取examplea类型异常的catch块能够抓住try块中抛出的exampleb类型的异常)
面试题 - 说出下面代码的运行结果。(此题的出处是《java编程思想》一书)
class annoyance extends exception {} class sneeze extends annoyance {} class human { public static void main(string[] args) throws exception { try { try { throw new sneeze(); } catch ( annoyance a ) { system.out.println("caught annoyance"); throw a; } } catch ( sneeze s ) { system.out.println("caught sneeze"); return ; } finally { system.out.println("hello world!"); } } }
52、list、set、map是否继承自collection接口?
答:list、set 是,map 不是。map是键值对映射容器,与list和set有明显的区别,而set存储的零散的元素且不允许有重复元素(数学中的集合也是如此),list是线性结构的容器,适用于按数值索引访问元素的情形。
53、阐述arraylist、vector、linkedlist的存储性能和特性。
答:arraylist 和vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,vector中的方法由于添加了synchronized修饰,因此vector是线程安全的容器,但性能上较arraylist差,因此已经是java中的遗留容器。linkedlist使用双向链表实现存储(将内存中零散的内存单元通过附加的引用关联起来,形成一个可以按序号索引的线性结构,这种链式存储方式与数组的连续存储方式相比,内存的利用率更高),按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。vector属于遗留容器(java早期的版本中提供的容器,除此之外,hashtable、dictionary、bitset、stack、properties都是遗留容器),已经不推荐使用,但是由于arraylist和linkedlisted都是非线程安全的,如果遇到多个线程操作同一个容器的场景,则可以通过工具类collections中的synchronizedlist方法将其转换成线程安全的容器后再使用(这是对装潢模式的应用,将已有对象传入另一个类的构造器中创建新的对象来增强实现)。
补充:遗留容器中的properties类和stack类在设计上有严重的问题,properties是一个键和值都是字符串的特殊的键值对映射,在设计上应该是关联一个hashtable并将其两个泛型参数设置为string类型,但是java api中的properties直接继承了hashtable,这很明显是对继承的滥用。这里复用代码的方式应该是has-a关系而不是is-a关系,另一方面容器都属于工具类,继承工具类本身就是一个错误的做法,使用工具类最好的方式是has-a关系(关联)或use-a关系(依赖)。同理,stack类继承vector也是不正确的。sun公司的工程师们也会犯这种低级错误,让人唏嘘不已。
54、collection和collections的区别?
答:collection是一个接口,它是set、list等容器的父接口;collections是个一个工具类,提供了一系列的静态方法来辅助容器操作,这些方法包括对容器的搜索、排序、线程安全化等等。
55、list、map、set三个接口存取元素时,各有什么特点?
答:list以特定索引来存取元素,可以有重复元素。set不能存放重复元素(用对象的equals()方法来区分元素是否重复)。map保存键值对(key-value pair)映射,映射关系可以是一对一或多对一。set和map容器都有基于哈希存储和排序树的两种实现版本,基于哈希存储的版本理论存取时间复杂度为o(1),而基于排序树版本的实现在插入或删除元素时会按照元素或元素的键(key)构成排序树从而达到排序和去重的效果。
下一篇: java泛型demo