1.private修饰的方法可以通过反射访问,那么private的意义是什么
答:(1)java的private修饰符并不是为了绝对安全性设计的,更多的是对用户常规使用java的一种约束;
(2)从外部对对象进行常规调用时,能够看到清晰的类结构。
2.Java类初始化顺序
答:基类静态代码块->基类静态成员字段(并列优先级,按照代码中出现的先后顺序执行,且只有第一次加载时执行)->派生类静态代码块->派生类静态成员字段(并列优先级,按照代码中出现的先后顺序执行,且只有第一次加载时执行)->基类普通代码块->基类普通成员字段(并列优点级,按代码中出现先后顺序执行)->基类构造方法->派生类普通代码块->派生类普通成员字段(并列优点级,按代码中出现先后顺序执行)->派生类构造方法。
3.对方法区和永久区的理解以及它们之间的关系
答:方法区是jvm规范里要求的,永久区是Hotspot虚拟机对方法区的具体实现,前者是规范,后者是实现方式。
4.一个java文件有3个类,编译后有几个class文件
答:文件中有几个类编译后就有几个class文件。
5.ReadWriteLock读写之间互斥吗
答:ReadWriteRock读写锁,使用场景可分为读/读、读/写、写/写,除了读和读之间是共享的,其它都是互斥的。
6.写一个你认为最好的单例模式
答:双检锁的:
public class Singleton { //定义一个私有的实例 private volatile static Singleton instance; //构造方法私有化 private Singleton() { } //定义一个公共的方法获取私有的实例 public static Singleton getInstance(){ if(null==instance){ synchronized (Singleton.class){ if(null==instance){ instance = new Singleton(); } } } return instance; } }
7.写一个生产者消费者模式
答:生产者消费者模式,synchronized锁住一个LinkedList,一个生产者,只要队列不满,生产后往里放,一个消费者只要队列不空,向外取,两者通过wait()和notify()进行协调。
8.写一个死锁
答:定义两个ArrayList,将他们都加上锁A,B,线程1,2,1拿住了锁A,请求锁B,2拿住了锁B请求锁A,在等待对方释放锁的过程中谁也不让出已获得的锁。
9.String a = "ab"; String b = "a" + "b"; a == b 是否相等,为什么。
答:相等。
10.int a = 1; 是原子性操作吗
答:int a = 1; 是原子性操作
11.可以用for循环直接删除ArrayList的特定元素吗?可能会出现什么问题?怎样解决
答:for循环直接删除ArrayList中的特定元素是错的,不同的for循环会发生不同的错误,泛型for会抛出ConcurrentModificationException,普通的for想要删除集合中重复且连续的元素,只能删除第一个。
解决方案:用 Iterator。
12.新的任务提交到线程池,线程池是怎样处理
答:第一步:线程池判断核心线程池里的线程是否都在执行任务。如果不是,则创建一个新的工作线程来执行任务。如果核心线程池里的线程都在执行任务,则执行第二步。
第二步 :线程池判断工作队列是否已经满。如果工作队列没有满,则将新提交的任务存储在这个工作队列里进行等待。如果工作队列满了,则执行第三步。
第三步 :线程池判断线程池的线程是否都处于工作状态。如果没有,则创建一个新的工作线程来执行任务。如果已经满了,则交给饱和策略来处理这个任务。
13.dispatchServlet怎样分发任务的
答:(1)客户端发送请求到前端控制器dispatchServlet;
(2)dispatchServlet查询一个或多个处理器映射器(handlerMapping),找到处理请求的controller
(3)dispatchServlet发送请求到controller,controller调用业务逻辑层处理后,返回modeAndView。
(4)dispatchServlet找到一个或者多个视图解析器(viewResolver),找到modeAndView对指定的视图
(5)视图负责将结果显示到客户端。
14.mysql给离散度低的字段建立索引会出现什么问题,具体说下原因
答:重复性较强的字段,不适合添加索引。mysql给离散度低的字段,比如性别设置索引,再以性别作为条件进行查询反而会更慢。