2020Java面试题(带答案)持续更新 ing

@好的面试题TOC
-----------------------------------------

1、char型变量中能不能存储一个中文汉字,为什么?

可以。 Java中使用的编码是Unicode(不选择任何特定的编码,直接使用字符在字符集中的编码,这是统一的唯一方法),一个char类型占2个字节(16比特),所以放一个中文是没问题的。

2、抽象类和接口有什么异同?

实例化:抽象类和接口都不能被实例化,但可以定义抽象类和接口类型的引用
实现抽象方法:一个类继承或实现了某个抽象类或接口都需要实现其中所有的抽象方法,否则该类仍然需要被声明为抽象类
接口比抽象类更加抽象:抽象类可以定义构造器、抽象方法和具体方法;接口不能定义构造器,接口中的方法全部都是抽象方法(public abstract)
类的成员:抽象类的成员可以是private、默认、protected、public的,而接口中的成员全都是public的
成员变量:抽象类可以定义成员变量,而接口类中定义的成员变量实际上都是常量(public static final)
抽象方法和抽象类的关系:有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法

3、下面的代码哪些地方会产生编译错误?
public class Outer{
  class inner {
  }
  public static foo() {
    new Inner();
  }
  public static void main(String[] args) {
    new Inner();
  }
}

Java中非静态内部类对象的创建要依赖其外部类对象,上面代码中foo和main方法都是静态方法,静态方法没有this,也就是说没有所谓的外部类对象 ,因此无法创建内部类对象,如果要在静态方法中创建内部类对象,可以这样做:
new Outer().new Inner();

4、阐述静态变量和实例变量的区别
  1. 静态变量(类变量)是被static修饰符修饰的变量,它属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝
  2. 静态变量可以实现让多个对象共享内存
  3. 实例变量必须依存于某一个实例,需要先创建对象,然后通过对象才能访问它
5、Java线程的状态
  1. New:初始状态,线程被创建,没有调用start()
  2. Runnable:运行状态,Java线程把操作系统中的就绪和运行两种状态统一称为“运行中”
  3. Blocked:阻塞,线程进入等待状态,线程因为某种原因,放弃了CPU的使用权
    阻塞的几种情况:
    A. 等待阻塞:运行的线程执行了wait(),JVM会把当前线程放入等待队列
    B. 同步阻塞:运行的线程在获取对象的同步锁时,如果该同步锁被其他线程占用了,JVM会把当前线程放入锁池中
    C. 其他阻塞:运行的线程执行sleep(),join()或者发出IO请求时,JVM会把当前线程设置为阻塞状态,当sleep()执行完,join()线程终止,IO处理完毕线程再次恢复
  4. Waiting:等待状态
  5. timed_waiting:超时等待状态,超时以后自动返回
  6. terminated:终止状态,当前线程执行完毕
6、线程的六种状态之间的转换:

当实例化一个线程之后,首先进入初始状态,即New状态,此时线程在启动的时候并不是立刻就运行,而是要等到操作系统调度之后才运行,然后调用start()进入运行状态,即runnable,其中运行状态中包括运行(running)和就绪(ready)两种状态,这两种状态在操作系统的调度下可以互相转换,如果运行中的线程时间片被CPU抢占的话就会变成就绪状态;运行中的线程通过调用synchronized方法或synchronized块进入阻塞状态,即blocked,当线程获取到锁之后进入运行状态;如果线程在执行过程中调用了sleep(),wait().join(),Locksupported.parkUtil()等方法时,会进入等待状态(waiting)或超时等待状态,即timed_waiting,再次调用notify(),notifyAll(),Locksupported.unpark()等方法时,又会重新进入运行时状态,当线程执行完成时,就进入了终止状态,即terminated状态。
在这里插入图片描述

7、JSP中的九个隐含对象

在这里插入图片描述

隐含对象所属类对象说明
requestjavax.servlet.http.HttpServletRequest客户端的请求信息
responsejavax.servlet.http.HttpServletResponse网页传回客户端的响应
outjavax.servlet.jsp.JSPWriter向客户端浏览器输出数据的数据流
sessionjavax.servlet.http.HttpSession与请求有关的会话
applicationjavax.servlet.ServletContext提供全局的数据,一旦创建就保持到服务器关闭
pageContextjavax.servlet.jsp.PageContextJSP页面的上下文,用于访问页面属性
pagejava.lang.Object同Java中的this,即JSP页面本身
configjavax.servlet.servletConfigServlet的配置对象
exceptionjava.lang.Throwable针对错误网页,捕捉一般网页中未捕捉的异常
Mybatis的缓存问题

一级缓存也叫本地缓存,MyBatis 的一级缓存是在会话(SqlSession)层面进行缓存的。MyBatis 的一级缓存是默认开启的,不需要任何的配置
一级缓存的生命周期有多长?
MyBatis在开启一个数据库会话时,会 创建一个新的SqlSession对象,SqlSession对象中会有一个新的Executor对象,Executor对象中持有一个新的PerpetualCache对象;当会话结束时,SqlSession对象及其内部的Executor对象还有PerpetualCache对象也一并释放掉。
如果SqlSession调用了close()方法,会释放掉一级缓存PerpetualCache对象,一级缓存将不可用;
如果SqlSession调用了clearCache(),会清空PerpetualCache对象中的数据,但是该对象仍可使用;
SqlSession中执行了任何一个update操作(update()、delete()、insert()) ,都会清空PerpetualCache对象的数据,但是该对象可以继续使用;

二级缓存是用来解决一级缓存不能跨会话共享的问题的,范围是namespace 级别的,可以被多个SqlSession 共享(只要是同一个接口里面的相同方法,都可以共享),生命周期和应用同步。如果你的MyBatis使用了二级缓存,并且你的Mapper和select语句也配置使用了二级缓存,那么在执行select查询的时候,MyBatis会先从二级缓存中取输入,其次才是一级缓存,即MyBatis查询数据的顺序是:二级缓存 —> 一级缓存 —> 数据库。

作为一个作用范围更广的缓存,它肯定是在SqlSession 的外层,否则不可能被多个SqlSession 共享。而一级缓存是在SqlSession 内部的,所以第一个问题,肯定是工作在一级缓存之前,也就是只有取不到二级缓存的情况下才到一个会话中去取一级缓存。第二个问题,二级缓存放在哪个对象中维护呢? 要跨会话共享的话,SqlSession 本身和它里面的BaseExecutor 已经满足不了需求了,那我们应该在BaseExecutor 之外创建一个对象。

实际上MyBatis 用了一个装饰器的类来维护,就是CachingExecutor。如果启用了二级缓存,MyBatis 在创建Executor 对象的时候会对Executor 进行装饰。CachingExecutor 对于查询请求,会判断二级缓存是否有缓存结果,如果有就直接返回,如果没有委派交给真正的查询器Executor 实现类,比如SimpleExecutor 来执行查询,再走到一级缓存的流程。最后会把结果缓存起来,并且返回给用户。

8、HashMap是如何根据Key值找到对应的Value的

基于hashing的原理,jdk8后采用数组+链表+红黑树的数据结构。我们通过put和get存储和获取对象。当我们给put()方法传递键和值时,先对键做一个hashCode()的计算来得到它在bucket数组中的位置来存储Entry对象。当获取对象时,通过get获取到bucket的位置,再通过键对象的equals()方法找到正确的键值对,然后在返回值对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值