平安科技面经 2018.12.3
一面(电话面试45min)
1、自我介绍(简单提到项目)
2~3 min
2、spring启动时的容器启动流程(对配置的加载顺序)?
容器启动流程中涉及的主要类——
ContextLoaderListener:注册在web.xml中,web应用启动时,会创建它,并回调它的initWebApplicationContext()方法,从而创建并启动spring容器。必须继承ServletContextListener。
WebApplicationContext:用于web应用的spring容器上下文,它代表了spring容器,继承自ApplicationContext。是一个接口,ContextLoader.properties配置文件中可以声明它的实现类。默认实现类为XmlWebApplicationContext。 ApplicationContext继承自BeanFactory,并扩展了它的很多功能。
ServletContext:web容器(如tomcat)的上下文,不要和ApplicationContext搞混了。
3、spring使用到的设计模式?最好说出在什么地方使用,举例说明。
4、手撕设计模式,写一种你熟悉的设计模式的demo。
写了简单工厂模式demo(包含测试类)
无代码提示,所以在平时书写时注意代码的格式以及细节处,避免出现小问题。
5、String s=new String(“abc”),包含几个对象?
(两个或一个都有可能,”xyz”对应一个对象,这个对象放在字符串常量缓冲区,常量”xyz”不管出现多少遍,都是缓冲区中的那一个。NewString每写一遍,就创建一个新的对象,它使用常量”xyz”对象的内容来创建出一个新String对象。如果以前就用过’xyz’,那么这里就不会创建”xyz”了,直接从缓冲区拿,这时创建了一个StringObject;但如果以前没有用过"xyz",那么此时就会创建一个对象并放入缓冲区,这种情况它创建两个对象。)
创建了两个对象,一个是new String 创建的一个新的对象,一个是常量“abc”对象的内容创建出的一个新的String对象。
创建过程分析:当执行String s = new String(“abc”);时,JVM首先在String Pool中查看是否存在字符串对象“abc”,如果不存在该对象,则先在String Pool中创建一个新的字符串对象“abc”,然后执行new String(“abc”)构造方法,在Heap里又创建一个新的字符串对象“abc”(new出来的对象都放在Heap堆里面),并将引用s指向Heap中创建的新对象;如果已存在该对象,则不用创建新的字符串对象“abc”,而直接使用String Pool中已存在的对象“abc”, 然后执行new String(“abc”)构造方法,在Heap里又创建一个新的字符串对象“abc”,并将引用s指向Heap中创建的新对象。
注意:使用new String(“”)创建的字符串对象时,会在运行期创建新对象存储到Heap中。因此,new String(“abc”)创建字符串对象时,会创建2个对象,编译期在String Pool(字符串常量池)中创建一个,运行时Heap中创建一个。
6、static可以修饰什么?有什么作用?
作用于方法上:方法属于类,不属于类的实例对象;Static方法不需要实例对象就可以通过类名调用,且Static方法中不能有实例成员。
作用于变量上:……
作用于类上:……
在什么时候执行:……
注:非static——
作用于方法上:属于类的实例对象,可以有static成员。
作用于变量上:属于实例对象或者是局部变量,创建类的实例对象才能引用。
作用于类上:可以有Static成员也可以有非Static成员。
static是在编译的时候被绑定,加载的时候就会被执行的。按顺序执行static变量和static代码块。
Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。
7、HashMap的源码简述。
8、Hashtable与HashMap的区别?
HashMap和Hashtable的相同点——
HashMap和Hashtable都是存储“键值对(key-value)”的散列表,而且都是采用拉链法实现的。
存储的思想都是:通过table数组存储,数组的每一个元素都是一个Entry;而一个Entry就是一个单向链表,Entry链表中的每一个节点就保存了key-value键值对数据。
添加key-value键值对:首先,根据key值计算出哈希值,再计算出数组索引(即,该key-value在tab