1.两个对象值相同(x.equals(y)==true),但却可有不一样的hash code,这句话对不对?为何? 程序员
答: 不对,有相同的hash code。 算法
2.GC是什么?为何要有GC? 编程
答: GC是垃圾收集器。Java 程序员不用担忧内存管理,由于垃
圾收集器会自动进行管理。要请求垃圾收
集,能够调用下面的方法之一:
System.gc()
Runtime.getRuntime().gc() tomcat
3.请简要描述一下J2EE应用中的class loader的层次结构? spa
答:以tomcat为例子: code
Tomcat Server在启动的时候将构造一个ClassLoader树,以保证模块的类库是私有的
Tomcat Server的ClassLoader结构以下:
其中:
- Bootstrap - 载入JVM自带的类和$JAVA_HOME/jre/lib/ext/*.jar
- System - 载入$CLASSPATH/*.class
- Common - 载入$CATALINA_HOME/common/...,它们对TOMCAT和全部的WEB APP均可见
- Catalina - 载入$CATALINA_HOME/server/...,它们仅对TOMCAT可见,对全部的WEB APP都不可见
- Shared - 载入$CATALINA_HOME/shared/...,它们仅对全部WEB APP可见,对TOMCAT不可见(也没必要见)
- WebApp? - 载入ContextBase?/WEB-INF/...,它们仅对该WEB APP可见 server
4."组合优于继承",是否赞成这句话,并阐述你的观点。 对象
答: 继承和组合均可以实现代码的重用(Reuse),为何组合要优于继承呢?
回想SimUDuck这个例子,很有感触,开始Joe的方案是用继承,代码改动简单,能够实现现有状况下的某些需求(大部分鸭子都是正常的,但有一小部分 是失败的,好比RubberDuck);仔细思考继承:经过继承,子类可以得到与父类相同的功能和属性,父类拥有了某种功能,子类就有了;可是若是子类需 要新的功能,直接在父类里面增长新的功能,那么会致使全部的子类同时拥有这种功能,这其实是将类的功能与类牢牢的耦合在一块儿,是一种紧密耦合系统,因为 关系至关密切,致使改动一处而动全身,实际上不利于代码的重用。而组合刚好相反,她把类的各项功能分割开,互不干涉。一个类的功能,其实是各类子功能的 组合,好比鸭子的功能就是飞行功能和发出叫声功能的组合,不管是何种鸭子,都是这样。同时究竟是怎样飞行,怎样叫,又能够经过面向接口的编程实现多态。因 此这个组合的系统(Duck)很容易在加入新的成员,好比加入ModelDuck,加入RocketDuck,只须要实现新的相应的飞行和叫的功能类(实 现功能接口)。很明显,组合所产生的代码便于维护,易于扩展,是真正的Flexible Design。 继承
6.请说下Template模式与Strategy模式的异同点。 接口
答:Template method适用域可能更小一点,灵活性也差一点。若是子类也能够订制这些子步骤的顺序,那就不适合使用Template。使用策略模式,则没有那么多的限制,甚至经常没有子步骤。不过实现者须要知道整个算法的流程,同时也可能暴露过多的行为,从而可能形成使用者误用的可能。