Java 中级面试题及答案整理
(1)Singleton:一个 Spring 容器中只有一个 Bean 的实例,此为 Spring 的默认配置,全容器共享一个实例。
(2)Prototype:每次调用新建一个 Bean 实例。
(3)Request:Web 项目中,给每一个 http request 新建一个 Bean 实例。
(4)Session:Web 项目中,给每一个 http session 新建一个 Bean 实例。
(5)GlobalSession:这个只在 portal 应用中有用,给每一个 global http session 新建一个 Bean 实例。
5、Spring 事务传播行为
所谓事务的传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。在 TransactionDefinition 定义中包括了如下几个表示传播行为的常量:
TransactionDefinition.PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。
TransactionDefinition.PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。
TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。
TransactionDefinition.PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
TransactionDefinition.PROPAGATION_NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于 TransactionDefinition.PROPAGATION_REQUIRED。
6、Spring 的声明式事务管理力度是什么级别?
Struts2 是类级别的,Spring 是方法级别的
spring 事务可以分为编程式事务和声明式事务
7、spring?MVC 与 struts2 的区别:
参考:??http://blog.csdn.net/chenleixing/article/details/44570681
① Struts2 是类级别的拦截, 一个类对应一个 request 上下文,SpringMVC 是方法级别的拦截
② SpringMVC 的方法之间基本上独立的,独享 request response 数据
③ 由于 Struts2 需要针对每个 request 进行封装,把 request,session 等 servlet 生命周期的变量封装成一个一个 Map,供给每个 Action 使用,并保证线程安全,所以在原则上,是比较耗费内存的
④ 拦截器实现机制上,Struts2 有以自己的 interceptor 机制,SpringMVC 用的是独立的 AOP
方式
⑤ SpringMVC 的入口是 servlet,而 Struts2 是 filter
⑥ SpringMVC 集成了 Ajax
⑦ SpringMVC 验证支持 JSR303,处理起来相对更加灵活方便,而 Struts2 验证比较繁琐,感觉太烦乱
⑧ Spring MVC 和 Spring 是无缝的。从这个项目的管理和安全上也比 Struts2 高
⑨ Struts2 更加符合 OOP 的编程思想, SpringMVC 就比较谨慎,在 servlet 上扩展
⑩ SpringMVC 开发效率和性能高于 Struts2
8、Spring 框架中的核心思想包括什么?
主要思想是 IOC 控制反转,DI 依赖注入,AOP 面向切面
9、ArrayList 和 LinkedList 的大致区别如下:
1.ArrayList 是实现了基于动态数组的数据结构,LinkedList 基于链表的数据结构。?
2.对于随机访问 get 和 set,ArrayList 觉得优于 LinkedList,因为 LinkedList 要移动指针。?
3.对于新增和删除操作 add 和 remove,LinedList 比较占优势,因为 ArrayList 要移动数据。
10、ArrayList,Vector 主要区别为以下几点:?
(1):Vector 是线程安全的,源码中有很多的 synchronized 可以看出,而 ArrayList 不是。导致 Vector 效率无法和 ArrayList 相比;?
(2):ArrayList 和 Vector 都采用线性连续存储空间,当存储空间不足的时候,ArrayList 默认增加为原来的 50%,Vector 默认增加为原来的一倍;?
11、HashSet 与 HashMap 的区别:
12、HashMap 和 Hashtable 的区别:
HashMap 和 Hashtable 都实现了 Map 接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。
HashMap 几乎可以等价于 Hashtable,除了 HashMap 是非 synchronized 的,并可以接受 null(HashMap 可以接受为 null 的键值(key)和值(value),而 Hashtable 则不行)。
HashMap 是非 synchronized,而 Hashtable 是 synchronized,这意味着 Hashtable 是线程安全的,多个线程可以共享一个 Hashtable;而如果没有正确的同步的话,多个线程是不能共享 HashMap 的。Java 5 提供了 ConcurrentHashMap,它是 HashTable 的替代,比 HashTable 的扩展性更好。
另一个区别是 HashMap 的迭代器(Iterator)是 fail-fast 迭代器,而 Hashtable 的 enumerator 迭代器不是 fail-fast 的。所以当有其它线程改变了 HashMap 的结构(增加或者移除元素),将会抛出 ConcurrentModificationException,但迭代器本身的 remove()方法移除元素则不会抛出 ConcurrentModificationException 异常。但这并不是一个一定发生的行为,要看 JVM。这条同样也是 Enumeration 和 Iterator 的区别。
由于 Hashtable 是线程安全的也是 synchronized,所以在单线程环境下它比 HashMap 要慢。如果你不需要同步,只需要单一线程,那么使用 HashMap 性能要好过 Hashtable。
HashMap 不能保证随着时间的推移 Map 中的元素次序是不变的。
13、线程安全是什么?线程不安全是什么?
线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。(Vector,HashTable)?
线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。(ArrayList,LinkedList,HashMap 等)
14、线程和进程的区别?
进程和线程都是一个时间段的描述,是 CPU 工作时间段的描述,不过是颗粒大小不同;
(1)进程是资源的分配和调度的一个独立单元,而线程是 CPU 调度的基本单元
(2)同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进行至少包括一个线程。
(3)进程的创建调用 fork 或者 vfork,而线程的创建调用 pthread_create,进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同个进程中的其他线程的结束
(4)线程是轻两级的进程,它的创建和销毁所需要的时间比进程小很多,所有操作系统中的执行功能都是创建线程去完成的
(5)线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源
(6)线程有自己的私有属性 TCB,线程 id,寄存器、硬件上下文,而进程也有自己的私有属性进程控制块 PCB,这些私有属性是不被共享的,用来标示一个进程或一个线程的标志
15、黑盒测试、灰盒测试、白盒测试、单元测试有什么区别?
黑盒测试关注程序的功能是否正确,面向实际用户;
白盒测试关注程序源代码的内部逻辑结构是否正确,面向编程人员;
灰盒测试是介于白盒测试与黑盒测试之间的一种测试。
单元测试(Unit Testing)是对软件基本组成单元进行的测试,如函数或是一个类的方法。这里的单元,就是软件设计的最小单位。
16、怎么对数据库百万级数据进行优化?
使用读写分离技术(
让主数据库(master)处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库(slave)处理 SELECT 查询操作
)
17、Spring Bean 的生命周期:
Bean 的建立, 由 BeanFactory 读取 Bean 定义文件,并生成各个实例
Setter 注入,执行 Bean 的属性依赖注入
BeanNameAware 的 setBeanName(), 如果实现该接口,则执行其 setBeanName 方法
BeanFactoryAware 的 setBeanFactory(),如果实现该接口,则执行其 setBeanFactory 方法
BeanPostProcessor 的 processBeforeInitialization(),如果有关联的 processor,则在 Bean 初始化之前都会执行这个实例的 processBeforeInitialization()方法
InitializingBean 的 afterPropertiesSet(),如果实现了该接口,则执行其 afterPropertiesSet()方法
Bean 定义文件中定义 init-method
BeanPostProcessors 的 processAfterInitialization(),如果有关联的 processor,则在 Bean 初始化之前都会执行这个实例的 processAfterInitialization()方法
DisposableBean 的 destroy(),在容器关闭时,如果 Bean 类实现了该接口,则执行它的 destroy()方法
Bean 定义文件中定义 destroy-method,在容器关闭时,可以在 Bean 定义文件中使用“destory-method”定义的方法
简单回答 springbean 生命周期:
(1)实例化(必须的)构造函数构造对象
(2)装配(可选的)为属性赋值
(3)回调(可选的)(容器-控制类和组件-回调类)
(4)初始化(init-method=" ")
(5)就绪
(6)销毁(destroy-method=" ")
18、springmvc 生命周期:
1A)客户端发出 http 请求,只要请求形式符合 web.xml
文件中配置的*.action 的话,就由 DispatcherServlet
来处理。
1B)DispatcherServlet 再将 http 请求委托给映射器
的对象来将 http 请求交给对应的 Action 来处理
2)映射器根据客户的 http 请求,再对比<bean name="/hello.action
如果匹配正确,再将 http 请求交给程序员写的 Action
3)执行 Action 中的业务方法,最终返回一个名叫 ModelAndView
的对象,其中封装了向视图发送的数据和视图的逻辑名
4)ModelAndView 对象随着响应到到 DispatcherServlet 中了
5)这时 DispatcherServlet 收到了 ModelAndView 对象,
它也不知道视图逻辑名是何意,又得委托一个名叫
视图解析器的对象去具体解析 ModelAndView 对象
中的内容
6)将视图解析器解析后的内容,再次交由 DispatcherServlet
核心控制器,这时核心控制器再将请求转发到具体的
视图页面,取出数据,再显示给用户
19、servlet 生命周期?
Servlet 通过调用?init ()?方法进行初始化。
Servlet 调用?service()?方法来处理客户端的请求。
Servlet 通过调用?destroy()?方法终止(结束)。
最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的
20、ajax 怎么解决跨域?
参考:http://blog.csdn.net/u014727260/article/details/72793459
① 代理(通过后台操作)
② JSONP(添加响应头,允许跨域?)
addHeader(‘Access-Control-Allow-Origin:*’);//允许所有来源访问?
addHeader(‘Access-Control-Allow-Method:POST,GET’);//允许访问的方式
③ 在 ajax 的 dataType 方式改为“jsonp”
评论