本文回答了 你应该知道的JAVA面试题 基础篇。
http://ifeve.com/java-interview-question/
Java线程的状态
答: 线程间的状态转换:
(1). 新建(new):新创建了一个线程对象。
(2). 可运行(runnable):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权 。
(3). 运行(running):可运行状态(runnable)的线程获得了cpu 时间片(timeslice) ,执行程序代码。
(4). 阻塞(block):阻塞状态是指线程因为某种原因放弃了cpu 使用权,也即让出了cpu timeslice,暂时停止运行。直到线程进入可运行(runnable)状态,才有机会再次获得cpu timeslice 转到运行(running)状态。
阻塞的情况分三种:
(一). 等待阻塞:运行(running)的线程执行o.wait()方法,JVM会把该线程放入等待队列(waitting queue)中。
(二). 同步阻塞:运行(running)的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。
(三). 其他阻塞:运行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行(runnable)状态。
(5). 死亡(dead):线程run()、main() 方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。进程和线程的区别,进程间如何通讯,线程间如何通讯
答: 进程与线程区别
定义方面:进程是程序在某个数据集合上的一次运行活动;线程是进程中的一个执行路径。
角色方面:在支持线程机制的系统中,进程是系统资源分配的单位,线程是CPU调度的单位。
资源共享方面:进程之间不能共享资源,而线程共享所在进程的地址空间和其它资源。同时线程还有自己的栈和栈指针,程序计数器等寄存器。
独立性方面:进程有自己独立的地址空间,而线程没有,线程必须依赖于进程而存在。
开销方面。进程切换的开销较大。线程相对较小。(前面也提到过,引入线程也出于了开销的考虑。)
(一)、进程间的通信方式
管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
有名管道 (namedpipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
信号量(semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
消息队列( messagequeue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
信号 (sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
共享内存(shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
套接字(socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
(二)、线程间的通信方式
锁机制:包括互斥锁、条件变量、读写锁
互斥锁提供了以排他方式防止数据结构被并发修改的方法。读写锁允许多个线程同时读共享数据,而对写操作是互斥的。条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。
信号量机制(Semaphore):包括无名线程信号量和命名线程信号量
信号机制(Signal):类似进程间的信号处理
线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。
3.HashMap的数据结构是什么?如何实现的。和HashTable,ConcurrentHashMap的区别
答:数组+链表+红黑树。具体可以参见以下文章。
http://www.jianshu.com/p/c0642afe03e0
4.Cookie和Session的区别
答: 简单说就是HTTP协议是无状态的,服务器端需要session来跟踪用户的状态。
Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。
http://www.jianshu.com/p/a2fe1d6441a7
- 索引有什么用?如何建索引?
答: http://blog.csdn.net/evankaka/article/details/46685649
6.ArrayList是如何实现的,ArrayList和LinkedList的区别?ArrayList如何实现扩容。
答: ArrayList 的本质就是数组, ArrayList就是对数组进行动态的扩展,其add, get , remove 等等操作就是对数组的操作。每次扩容到原来大小的1.5倍。
7.equals方法实现
答:当equals重载时,这里有4个会引发equals行为不一致的常见陷阱:
定义了错误的equals方法签名(signature) Defining equals with the wrong signature.
重载了equals的但没有同时重载hashCode的方法。 Changing equals without also changing hashCode.
建立在会变化字域上的equals定义。 Defining equals in terms of mutable fields.
不满足等价关系的equals错误定义 Failing to define equals as an equivalence relation.
酷壳有篇文章专门讲解equals方法。https://coolshell.cn/articles/1051.html
8.面向对象
答:这个题目很宽泛,可以谈谈封装,继承,多态,SOLID原则。Java需要了解接口和抽象类的区别。
9.线程状态,BLOCKED和WAITING有什么区别
答:
假设t1,t2先后两个线程,都执行如下代码:
synchronized(Obj) {
Obj.wait();
}
t1先进,最后在Obj.wait()下卡住,这时java管t1的状态waitting状态
t2后进,直接在第一行就卡住了,这时java叫t2为blocked状态。
判断是否是BLOCKED可以看该线程是否在等待获取锁,WAITING从官方文档中可以知道调用Object.wait(), Thread.join(), LockSupport.park()会使得线程进入该状态。
10.JVM如何加载字节码文件
答:JVM的功能可以归纳为:
加载:通过类加载器加载类文件的过程。
链接:链接类文件,提交给JVM在运行时执行。
初始化:分配内存和调用类初始化方法设置变量值。
你可能还需要了解JVM的架构图,方法区,堆空间,栈空间,Native Memory.
http://www.jianshu.com/p/f4f580289091
- JVM GC,GC算法。
答:这个网上资料很多,主要了解CMS的 Eden、Survivor 和 Tenured/Old 空间。
G1算法的优点,和CMS垃圾收集的区别。
12.什么情况会出现Full GC,什么情况会出现young GC。
答: young GC清理Eden区的内存。FullGC 清理所有内存。Major GC 清理老年代。
Initial Mark 和 Remark会stop the world.
需要注意的是G1 GC正常情况是避免Full GC的,如果G1算法出现了Full GC,意味着系统出现了问题,要进行调优。
G1 GC正常情况下只有young GC 和 mixed GC(Eden和Old区同时GC)。
13.JVM内存模型
答:
http://ifeve.com/java-memory-model-6/
如果能够看懂这篇文章,对内存使用和理解会更上一层楼。https://www.ibm.com/developerworks/cn/java/j-nativememory-linux/
14.Java运行时数据区
答:见上图,但是要注意的是在JDK1.8之后,方法区(PermGen)已经去除,相关的内容被移到了元数据区。
http://www.infoq.com/cn/articles/Java-PERMGEN-Removed
http://www.jianshu.com/p/6173a467165e
15.事务的实现原理
答: https://my.oschina.net/huangyong/blog/160012
https://my.oschina.net/huangyong/blog/1598521.