Java 面试题整理

Java 面试题整理

  • 需要代码说明会在对应的问题后给出blog链接
  • 如果发现错误希望能再下面指出,方便更正

数据结构对应的使用场景是怎样的?

对数据库事务的理解

事务是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行,好处就是可以简化错误恢复并使应用程序更加可靠。
要使逻辑单元称为一个事务必须满足ACID原则(原子性、一致性、隔离性和持久性,及事务的四大特性)。
* 原子性:是事务本身的特性,即要么全执行,要么全不执行
* 一致性:是事务控制的数据的特性,要么都处于执行前的状态,要么多是执行后的状态
* 隔离性:是事务和事务之间的特性,即事务之间不能有影响
* 持久性:事务的操作必须是永久的

JDBC是怎样实现事务的

手动实现以个hashmap

说说springMVC加载过程

springMVC初始化只要有三个类,DispatcherServlet,FrameWorkServlet,HttpServletBean
他们的继承关系是DispatcherServlet继承了FrameWorkServlet,FrameWorkServlet又继承了HttpServletBean
启动的过程是:
1. 服务启动,会扫描web.xml文件,在web.xml配置的DispatcherSerlvet开始初始化。
2. DispatcherServlet会调用父类的init()方法,init()方法的作用是初始化一些DispatcherServlet启动会用到的参数,然后调用FrameWorkServlet的initServletBean()方法。
3. initServletBean()方法初始化SpringMVC容器,因为SpringMVC是在Spirng基础之上的,所以还需要和Spring的容器关联,是MVC的容器能够访问Spring中的Bean,之后调用DispatcherServlet中的onRefresh()方法。
4. onRefresh()会对SpringMVC的组件进行初始化,比如url映射,文件解析的初始化等等

AOP的实现原理

AOP是OOP的一个补充,通常面向对象编程可以看成是方法调用时间线的纵向展开,把方法的调用看做是连接点,程序的执行就是链接点的执行过程,AOP将每个连接点看做是编程的入口,针对每个方法的调用进行编程,相当于在原来的时间线上横向切入。链接点,切面,切入点是AOP的核心定义,切入点就是已经选择的作用入口的连接点。在spring AOP中,使用方法匹配表达式来(execution(**))表示切入点(Point Cut)

怎么样定义一个注解

需要回答注解的作用、注解的实现原理、如何自定义一个注解
注解的作用:
1. 生成文档。常用的有@param @return 等。
2. 跟踪代码依赖性,简化配置文件中的内容。比如:spring的一些常用注解。
3. 在编译时进行格式检查。如@override。
注解的实现原理:
* 注解本质是一个继承了Annotation的特殊接口,其具体实现类是Java运行时生成的动态代理类。
自定义注解的编写规则:
1. Annotation型定义为@interface, 所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是接口。
2. 参数成员只能用public或默认(default)这两个访问权修饰。
3. 参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和String、Enum、Class、annotations等数据类型,以及这一些类型的数组。
4. 要获取类方法和字段的注解信息,必须通过Java的反射技术来获取 Annotation对象,因为你除此之外没有别的获取注解对象的方法。
5. 注解也可以没有定义成员, 不过这样注解就没啥用了,使用 String value() default ""; 来定义一个属性
6. 定义注解是需要使用到元注解,即
- @Documented –注解是否将包含在JavaDoc中
- @Retention –什么时候使用该注解
- @Target –注解用于什么地方
- @Inherited – 是否允许子类继承该注解
自定义注解主要有三步
1. 使用@interface定义一个注解,需要使用元注解
2. 定义注解的解析器,需要用到java的放射
3. 最后使用这个注解

Java中如何使用正则表达式

web中session,cookie,token的关系

JVM的主要的配置参数有那些

防止SQL注入的处理办法

SQL注入攻击就是在向服务端传递数据中拼写sql,让数据库执行了原本不属于程序的sql,防止注入攻击的方法如下:
1. 使用PreparedStatement来想sql中传入参数,因为PreparedStatement是预编译的,传入的参数会被当做一个整体去处理
2. 使用正则表达式对参数进行预处理,将特殊字符格式化
3. 在jsp中对输入的参数进行处理,比如禁止输入特殊字符等

JS脚本注入攻击

JavaScript注入漏洞能发生作用主要依赖两个关键的动作,一个是用户要能从界面中注入JavaScript到系统的内存或者后台存储系统中;二是系统中存在一些UI会展示用户注入的数据。防范注入漏洞主要有两个思路:一个是在用户输入数据后Encode内容后再保存到持久存储,另一个是在展示用户输入数据的地方Encode从持久存储中取到的数据。

java从1.5.0至1.8.0中都更新了那些内容

具体内容建议参考博客 JDK1.5-JDK1.8各个新特性
这里主要列举常用的,或者主要的特性
1.5的特性:
1. 自动装箱与拆箱,指基本类型与包装类之间的转换
2. 枚举:枚举类型使代码更具可读性,理解清晰,易于维护
3. foreach循环
1.6的特性:
1. Desktop类和SystemTray类:Desktop可以用来使用桌面应用打开一些文件,比如浏览器打开网页,打开pdf文件等等;SystemTray可以用来在系统托盘区创建一个托盘程序。(托盘程序就是在桌面右下角的小图标程序)
1.7的特性:
1. switch中可以使用字串
2. 给集合定义泛型
3. 新增了一些获取环境信息的方法,System.getJavaHomeDir() // 获取jre的安装目录
4. 提供一套安全的运算方法
1.8的特性:
1. 数值之间可以添加下划线int million = 1_000_000; // 不会报错
2. Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可。
3. Lambda 表达式,简化匿名函数的定义
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return b.compareTo(a);
}
});
现在可以写作
Collections.sort(names, (String a, String b) -> {
return b.compareTo(a);
});

4. 待完成。。。

猜你喜欢

转载自blog.csdn.net/the_dawn_1/article/details/80638217