2020常见JAVA面试题整理(进阶)

本文整理了2020年JAVA面试中的关键知识点,涵盖JSP内置对象、作用域、转发与重定向、SimpleDateFormat线程安全、设计模式、单例模式实现、多线程防止死锁、XSS攻击解释、集群环境session共享、Java对象生命周期、JVM调优、Hibernate与iBatis对比、MySQL优化策略、JOIN类型解析、索引原理、分布式事务处理方案、SpringMVC工作流程、BeanFactory与ApplicationContext的区别、Spring注入方式、事务管理与AOP理解、Spring全家桶概念解析、Dubbo工作流程、集群容错策略、服务负载均衡策略以及RocketMQ集群运作。全面了解并掌握这些知识点,能有效提升面试成功几率。
摘要由CSDN通过智能技术生成

1、jsp 9大内置对象

request:封装客户端的请求,其中包含来自GET或POST请求的参数;

response:封装服务器对客户端的响应;

pageContext:通过该对象可以获取其他对象;

session:封装用户会话的对象;

application:封装服务器运行环境的对象;

out:输出服务器响应的输出流对象;

config:Web应用的配置对象;

page:JSP页面本身(相当于Java程序中的this);

exception:封装页面抛出异常的对象。

2、jsp的4种作用域

page代表与一个页面相关的对象和属性。

request代表与Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件;需要在页面显示的临时数据可以置于此作用域。

session代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的session中。

application代表与整个Web应用程序相关的对象和属性,它实质上是跨越整个Web应用程序,包括多个页面、请求和会话的一个全局作用域。

3、forward 和 redirect 的区别?

Redirect:重定向,服务器告诉浏览器请求的URI,由浏览器再次向新的地址发起请求

Forward:转发,由服务器内部执行跳转,共享request数据,并将执行结果告诉浏览器,浏览器并没有感知到地址发生变化。

4、SimpleDataFormat是线程安全的吗?如何更好的使用而避免风险?

simpleDateFormat不是线程安全的。参考下面线程安全的方法:

// 1. 在方法内部使用,没有线程安全问题
private static final String FORMAT = "yyyy-MM-dd HH:mm:ss";
public String getFormat(Date date){
   
    SimpleDateFormat dateFormat = new SimpleDateFormat(FORMAT);
    return dateFormat.format(date);
}
 
// 2. 每次使用的时候加锁      
private static final SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public void getFormat(){
   
    synchronized (SIMPLE_DATE_FORMAT){
   
    SIMPLE_DATE_FORMAT.format(new Date());.;
}
 
// 3. 使用ThreadLocal,每个线程都有自己的SimpleDateFormat对象,互不干扰
private static final ThreadLocal<DateFormat> DATE_FORMATTER = new ThreadLocal<DateFormat>() {
   
    @Override
    protected DateFormat initialValue() {
   
        return new SimpleDateFormat("yyyy-MM-dd");
    }
};
 
// 4. 使用DateTimeFormatter(This class is immutable and thread-safe.)
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(timeFormatter.format(LocalDateTime.now()));

5、有哪些设计模式?

工厂模式:Spring通过工厂模式创建bean

代理模式:Spring AOP通过动态代理增强原对象的功能

责任链模式:SpringMVC的过滤器

单例模式:spring构建的对象默认是单例

6、写个单例模式的代码?

public class SingletonClass {
    
    private static final SingletonClass instance = new SingletonClass(); 
   
    public static SingletonClass getInstance() {
    
        return instance; 
    } 
     
    private SingletonClass() {
     
         
    }  
}

7、多线程如何避免死锁?

  • 加锁顺序(线程按照一定的顺序加锁)

  • 加锁时限(线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁)

  • 死锁检测(jstack -l jvm_pid)

8、什么是XSS攻击,具体如何实现?

  • XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入Web里面的html代码会被执行,从而达到恶意用户的特殊目的。

  • 对输入内容的特定字符进行编码,例如表示 html标记的 < > 等符号。

  • 对重要的 cookie设置 httpOnly, 防止客户端通过document.cookie读取 cookie,此 HTTP头由服务端设置。

  • 将不可信的值输出 URL参数之前,进行 URLEncode操作,而对于从 URL参数中获取值一定要进行格式检测(比如你需要的时URL,就判读是否满足URL格式)。

  • 不要使用 Eval来解析并运行不确定的数据或代码,对于 JSON解析请使用 JSON.parse() 方法。

  • 后端接口也应该要做到关键字符过滤的问题。

9、集群环境中,session如何实现共享?

  • 持久化session到数据库,即使用数据库来储存session。

  • 使用redis共享session。

  • 使用memcache同步session。

  • 通过脚本或守护进程在多台服务器之间同步session。

  • 使用NFS共享session。

  • nginx负载均衡策略。

  • Tomcat集群+redis实现session同步共享。

10、Java对象的生命周期

  1. 创建阶段(Created)

  2. 应用阶段(In Use)

  3. 不可见阶段(Invisible)

  4. 不可达阶段(Unreachable)

  5. 收集阶段(Collected)

  6. 终结阶段(Finalized)

  7. 对象空间重分配阶段(De-allocated)

11、如何调优JVM

-client -server模式

-Xmn、-Xms、-Xmx

监控:jps、jstat、jinfo、jmap、jhat、jstack…

12、hibernate和ibatis的区别&#x

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值