1.ArrayList和LinkedList的区别?
ArrayList和LinkedList都继承List接口;
ArrayList是以动态数组的形式存储数据,可以以O(1)的时间复杂度随机查询元素;
LinkedList是以链表形式存储元素,每一个元素的前面和后面都链接着一个元素链接,在这种情况下,是以O(n)时间复杂度查询某个元素;
相对于ArrayList,LinkedList的插入、删除的效率要更高,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引;。
LinkedList的存储空间要比ArrayList大,因为LinkedList不仅要储存元素还要储存指针。

2.什么是双亲委派模型?
如果一个类收到了类加载的请求,它并不会自己先去加载,而是把这个请求委托给父类加载器去执行,如果父类加载器还存在父类加载器,则进一步向上委托,依次递归,请求最后到达顶层的启动类加载器,如果父类能够完成类的加载任务,就会成功返回,倘若父类加载器无法完成任务,子类加载器才会尝试自己去加载,这就是双亲委派模式。就是每个儿子都很懒,遇到类加载的活都给它爸爸干,直到爸爸说我也做不来的时候,儿子才会想办法自己去加载。

3.说明以下类和对象的区别?
类是一个事物的描述,是抽象的;
对象是一个类的实体,是类的实例。

4.Collection和Collections的区别?
Collection是集合的上级接口,它常见的子集有list、set接口;
Collections是针对集合类的一个帮助类,它提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

5.什么是线程池(thread pool)?
就是事先创建若干个可执行的线程放入一个池中,需要的时候从池中获取线程不用自行创建,使用完毕不需要销毁线程而是放回池中,从而减少创建和销毁线程对象的开销。

6.线程池的种类有?
newSingleThreadExecutor:创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有的任务。如果这个唯一线程因为异常结束,那么会有一个新的线程代替它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行;
newFixedThreadPool:创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小;
newCachedThreadPool:创建一个可缓存的线程池。如果线程池的大小超过了处理处理任务所需要的线程,那么就会回收部分空闲的线程;
newScheduledThreadPool:创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。

7.创建线程有什么方法?
继承Thread类创建线程;
通过runnable接口创建线程;
通过callabled和futurn创建线程;
通过线程池创建线程。

8.启动一个线程使用run()还是start()?
启动线程肯定要用start()方法。当用start()开始一个线程后,线程就进入就绪状态,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。当cpu分配给它时间时,才开始执行run()方法(如果有的话)。start()是方法,它调用run()方法.而run()方法是你必须重写的. run()方法中包含的是线程的主体。

9.说一下线程中的同步和异步有什么区别?
线程同步就是发出一个功能调用时,在没有得到结果之前,该调用就不返回或不继续执行后续操作;
线程异步就是当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作。

10.线程有什么状态?
新建、就绪、运行、阻塞、等待、超时等待、终止。

11.线程的同步方法?
wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
notityAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

12sleep()和wait()的区别?
sleep()是线程类的方法,导致此线程暂停执行到指定时间,把执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait()方法导致本线程放弃对象锁,进入等待此对象的等待池,只有针对此对象的等待锁定池,只有针对此对象发出notify()或notifyAll()后本线程才进入对象锁定池准备获得对象锁进入运行状态。

13.什么是java多线程的回调?
回调就是客户端程序C调用服务程序S中的某个方法A,然后S又在某个时候返回来调用C中的某个方法B,对于C来说,这个B便叫做回调方法。

14.什么是死锁?
两个线程或两个以上线程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是这些线程都陷入了无限的等待中。

15.锁和同步的区别?
用法上的不同:
synchronized可以加在方法上,也可以加在特定代码块上,而lock需要显示的指定起始位置和终止位置。
synchronized是托管给JVM执行的,lock的锁定是通过代码实现的,它有比synchronized更精确的线程语义。
性能上的不同:
lock接口的实现类ReentrantLock,不仅具有和synchronized相同的并发性和内存语义,还多了超时的获取锁、定时锁、等候和中断锁等。
在竞争不是很激烈的情况下,synchronized的性能优于ReentrantLock,竞争激烈的情况下synchronized的性能会下降的非常快,而ReentrantLock则基本不变。
锁机制不同:
synchronized获取锁和释放锁的方式都是在块结构中,当获取多个锁时,必须以相反的顺序释放,并且是自动解锁。而Lock则需要开发人员手动释放,并且必须在finally中释放,否则会引起死锁。