以下为这段时间参加几家公司面试记录下来的部分面试题:
一、Spring
1、谈谈自己对SpringAOP和IOC的理解,核心机制及项目中的运用:原理以及实现的核心机制:AOP通过动态代理和反射,IOC通过(反射)。
2、Spring上下文的加载方式有哪些?
① AnnotationConfigApplicationContext:从一个或多个基于java的配置类中加载上下文定义,适用于java注解的方式;
② ClassPathXmlApplicationContext:从类路径下的一个或多个xml配置文件中加载上下文定义,适用于xml配置的方式;
③FileSystemXmlApplicationContext:从文件系统下的一个或多个xml配置文件中加载上下文定义,也就是说系统盘符中加载xml配置文件;
④ AnnotationConfigWebApplicationContext:专门为web应用准备的,适用于注解方式;
⑤ XmlWebApplicationContext:从web应用下的一个或多个xml配置文件加载上下文定义,适用于xml配置方式。
3、以往项目中是如何对事务进行管理的?
4、Autowired和resource的区别?
二、SpringMVC
1、描述一下SpringMVC的工作流程。其包含哪4个主要组件?
三、Mybatis
1、以往项目中mybatis是如何实现分页的?
2、例举Mybatis里的常用标签。
3、Mybatis的插件运行原理。如何编写一个插件?
四、Java集合类
1、List和Set集合的区别?
2、ArrayList的加载因子,默认容量和扩容增量是多少?是容量不够了还是快不够了进行扩容?
3、谈谈HashMap的元素碰撞?
4、怎么去删除ArrayList中不符合条件的元素?通过Iterater的remove()方法。
5、Java线程安全的集合是通过什么手段实现线程安全的?
6、有什么其他方法可代替synchronized实现线程安全类。
五、多线程
1、对多线程的理解?多线程的作用是什么?多线程为什么要使用线程池(好处/优点)。在所作项目中什么场景会用到?
① 几乎所有操作系统都支持同时运行多个任务(IOS是单任务系统),一个任务通常就是一个程序,每个运行中的程序就是一个进程。当一个程序运行时(如QQ),内部就可能包括多个顺序执行流,每个顺序执行流就是一个线程。
② 多线程时得同一个进程可以同时并发处理多个任务(如边视频边聊天)。
③ 当单个任务处理的时间比较短且需处理的任务的数量比较大的时候会考虑使用线程池。减少在创建和销毁线程上所花的时间以及系统资源的开销。如果不使用线程池很有可能造成系统创建大量线程从而导致消耗完系统内存以及过度切换。
④ 图片上传业务
2、如何获取线程的返回值?
3、谈谈对乐观锁和悲观锁的理解
4、谈一谈Lock锁
5、线程池的作用。
6、Java线程池有哪几种?
- newCachedThreadPool
创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
该类型线程池特点:
工作线程的创建数量几乎没有限制(其实也有限制,数目为Integer.MAX_VALUE),这样可灵活地往线程池中添加线程。
如果长时间没有往线程池中提交任务,即如果工作线程空闲了指定时间(默认一分钟),终止后又提交新任务,则线程池重新创建一个工作线程。
在使用CachedThreadPool时,一定要逐一控制任务的数量,否则由于大量线程同时运行,很有可能会导致系统瘫痪。
- newFixedThreadPool
创建一个指定工作线程数量的线程池。每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。
FixedThreadPool是一个典型且优秀的线程池,它具有线程池提高程序效率和节省创建线程时所耗的开销的优点。但是,在线程池空闲时,即线程池中没有可运行任务时,它不会释放工作线程,还会占用一定的系统资源。
创建一个单线程化的Executor,即只创建唯一的工作者线程来执行任务,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。如果这个线程异常结束,会有另一个取代它,保证顺序执行。单工作线程最大的特点是可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。
创建一个定长的线程池,而且支持定时的以及周期性的任务执行,支持定时及周期性任务执行。
- newSingleThreadExecutor
- newScheduleThreadPool
7、多个线程如何共享变量?使用ThreadLocal
8、wait()和sleep()的区别?
- 这两个方法来自不同的类分别是Thread和Object
- 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法(锁代码块和方法锁)。
- wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)
- sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
- sleep方法属于Thread类中方法,表示让一个线程进入睡眠状态,等待一定的时间之后,自动醒来进入到可运行状态,不会马上进入运行状态,因为线程调度机制恢复线程的运行也需要时间,一个线程对象调用了sleep方法之后,并不会释放他所持有的所有对象锁,所以也就不会影响其他进程对象的运行。但在sleep的过程中过程中有可能被其他对象调用它的interrupt(),产生InterruptedException异常,如果你的程序不捕获这个异常,线程就会异常终止,进入TERMINATED状态,如果你的程序捕获了这个异常,那么程序就会继续执行catch语句块(可能还有finally语句块)以及以后的代码。
- sleep()方法是一个静态方法,也就是说他只对当前对象有效,通过t.sleep()让t对象进入sleep,这样的做法是错误的,它只会是使当前线程被sleep 而不是t线程
- wait属于Object的成员方法,一旦一个对象调用了wait方法,必须要采用notify()和notifyAll()方法唤醒该进程;如果线程拥有某个或某些对象的同步锁,那么在调用了wait()后,这个线程就会释放它持有的所有同步资源,而不限于这个被调用了wait()方法的对象。wait()方法也同样会在wait的过程中有可能被其他对象调用interrupt()方法而产生
9、如何唤醒一个线程?
- notify()和notifyAll()
10、怎么保证T1执行完后执行T2?
- 通过join()方法保证线程按顺序执行,示例代码如下
package com.java.yj; /** * Created by yejian on 2018/7/9. */ public class MultiThread { public static void main(String[] args) throws InterruptedException { Thread thread1 = new Thread(new Thread1()); thread1.start(); thread1.join(); Thread thread2 = new Thread(new Thread2()); thread2.start(); thread2.join(); Thread thread3 = new Thread(new Thread3()); thread3.start(); } public static class Thread1 implements Runnable{ @Override public void run() { System.out.println("Thread1"); } } public static class Thread2 implements Runnable{ @Override public void run() { System.out.println("Thread2"); } } public static class Thread3 implements Runnable{ @Override public void run() { System.out.println("Thread3"); } } } 1.2 ExecutorService executor = Executors.newSingleThreadExecutor() java5以后提供的一个多线程操作方法,创建一个只有一个线程的线程池操作,会创建一个线程队列,按FIFO的顺序执行里面的线程。 package com.java.yj; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * Created by yejian on 2018/7/9. */ public class MultiThread2 { public static void main(String[] args) throws InterruptedException { ExecutorService executor = Executors.newSingleThreadExecutor(); executor.submit(new Thread1()); executor.submit(new Thread2()); executor.submit(new Thread3()); executor.shutdown(); } public static class Thread1 implements Runnable{ @Override public void run() { System.out.println("Thread1"); } } public static class Thread2 implements Runnable{ @Override public void run() { System.out.println("Thread2"); } } public static class Thread3 implements Runnable{ @Override public void run() { System.out.println("Thread3"); } } }
11、有用过CountdownLatch()方法吗?
12、在Java中CycliBarriar和CountdownLatch有什么区别?
六、JVM
1、描述JVM类加载机制(过程)。
2、JVM原理
3、垃圾回收原理
4、谈谈JVM的新生代、老年代、永久代。
5、谈谈JVM运行数据区?
七、MySQL
1、MySQL常用存储引擎有哪些,都分别有哪些特性。
2、InnoDB是行锁还是页锁?
3、谈一下以往工作中对SQL优化的策略措施。
4、查询出各班成绩前五名的学生(MySQL)。
5、Having的作用和用法?
6、索引的原理
7、为什么有主键索引却还有唯一索引,两者的区别是什么?
8、索引的数据结构了解吗?
9、where条件分别为like ‘%wz%’ like 'wz%' like '%wz'这三种情况,设计的索引对这三种情况是否有效?
10、谈谈联合索引
11、MySQL默认的隔离技术?
12、MySQL默认是哪类锁?
13、MySQL怎么实现全文检索查询。
八、Dubbo
1、Dubbo是怎么进行监控的?
九、Tomcat
1、Tomcat启动后,Web项目的加载顺序?
2、Tomcat优化
十、其他
1、以往项目中遇到哪些问题让你印象比较深刻,当时又是如何解决的?
2、看过哪些源代码?
3、前后端是通过什么协议通信的?HTTP或Socket
4、给你一个功能模块,描述一下你开展的设计实现流程?
5、有用过Jetty容器吗?
6、有用过MQ消息中间介吗?
7、ibatis和hibernate的区别?
8、抽象类和接口的区别?
9、什么是第三方支付?
10、String和StringBuffer的区别?
String是字符串常量,而StringBuilder和StringBuffer是字符串变量。String对象一旦创建后该对象是不可更改的,但后两者是可更改的。以如下代码为例:
String str = "abc";
System.out.println(str);
str = str + "de";
System.out.println(str);
如果运行这段代码会发现先输出“abc”,然后又输出“abcde”,好像是str这个对象被更改了,其实,这只是一种假象罢了,JVM对于这几行代码是这样处理的,首先创建一个String对象str,并把“abc”赋值给str,然后在第三行中,其实JVM又创建了一个新的对象也名为str,然后再把原来的str的值和“de”加起来再赋值给新的str,而原来的str就会被JVM的垃圾回收机制(GC)给回收掉了,所以,str实际上并没有被更改,也就是前面说的String对象一旦创建之后就不可更改了。所以,Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
11、冒泡排序算法的实现
12、项目的文件结构下包含哪些目录,比如WEB-INFO?
13、JFinal快速开发框架快在哪里?
14、HTTP和HTTPS的区别?
超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS,为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
15、怎么防范redis缓存穿透
16、了解jar包热加载及隔离技术吗?