⼯作3年JAVA⾯试题整理(⾃⽤)
1.Java线程的状态
⼀. 线程状态类型:1. 新建状态(New):新创建了⼀个线程对象。2. 就绪状态(Runnable):线程对象创建后,其他线程调⽤了该对象的start()⽅法。该状态的线程位于可运⾏线程池中,变得可运⾏,等待获取CPU的使⽤权。3. 运⾏状态(Running):就绪状态的线程获取了CPU,执⾏程序代码。4. 阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使⽤权,暂时停⽌运⾏。直到线程进⼊就绪状态,才有机会转到运⾏状态。阻塞的情况分三种:(⼀)、等待阻塞:运⾏的线程执⾏wait()⽅
法,JVM会把该线程放⼊等待池中。(⼆)、同步阻塞:运⾏的线程在获取对象的同步锁时,若该同步锁被别的线程占⽤,则JVM会把该线程放⼊锁池中。(三)、其他阻塞:运⾏的线程执⾏sleep()或join()⽅法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终⽌或者超时、或者I/O处理完毕时,线程重新转⼊就绪状态。5. 死亡状态(Dead):线程执⾏完了或者因异常退出了run()⽅法,该线程结束⽣命周期。⼆. 线程状态图
2.进程和线程的区别,进程间如何通讯,线程间如何通讯
他们之间根本区别在于多进程中每个进程有⾃⼰的地址空间,线程则共享地址空间。
⼀、进程间的通信⽅式
1. 管道( pipe ):
管道是⼀种半双⼯的通信⽅式,数据只能单向流动,⽽且只能在具有亲缘关系的进程间使⽤。进程的亲缘关系通常是指⽗
⼦进程关系。
2. 有名管道 (namedpipe) :
有名管道也是半双⼯的通信⽅式,但是它允许⽆亲缘关系进程间的通信。
3. 信号量(semophore ) :
信号量是⼀个计数器,可以⽤来控制多个进程对共享资源的访问。它常作为⼀种锁机制,防⽌某进程正在访问共享资源
时,其他进程也访问该资源。因此,主要作为进程间以及同⼀进程内不同线程之间的同步⼿段。
4. 消息队列( messagequeue ) :
消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载⽆格
式字节流以及缓冲区⼤⼩受限等缺点。
5. 信号 (sinal ) :
信号是⼀种⽐较复杂的通信⽅式,⽤于通知接收进程某个事件已经发⽣。
6. 共享内存(shared memory ) :
共享内存就是映射⼀段能被其他进程所访问的内存,这段共享内存由⼀个进程创建,但多个进程都可以访问。共享内存是
最快的 IPC ⽅式,它是针对其他进程间通信⽅式运⾏效率低⽽专门设计的。它往往与其他通信机制,如信号两,配合使
⽤,来实现进程间的同步和通信。
7. 套接字(socket ) :
套接⼝也是⼀种进程间通信机制,与其他通信机制不同的是,它可⽤于不同设备及其间的进程通信。
⼆、线程间的通信⽅式
1. 锁机制:包括互斥锁、条件变量、读写锁
互斥锁提供了以排他⽅式防⽌数据结构被并发修改的⽅法。
读写锁允许多个线程同时读共享数据,⽽对写操作是互斥的。
条件变量可以以原⼦的⽅式阻塞进程,直到某个特定条件为真为⽌。对条件的测试是在互斥锁的保护下进⾏的。条件
变量始终与互斥锁⼀起使⽤。
2. 信号量机制(Semaphore):包括⽆名线程信号量和命名线程信号量
信号机制(Signal):类似进程间的信号处理
线程间的通信⽬的主要是⽤于线程同步,所以线程没有像进程通信中的⽤于数据交换的通信机制。
3.HashMap的数据结构是什么?如何实现的。和HashTable,ConcurrentHashMap的区别
ConcurrentHashMap线程同步,hashMap 线程不同步,hashTable不许使⽤null
hashMap使⽤数组加链表的存储⽅式来实现
4.Cookie和Session的区别
cookie 和session 的区别:
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别⼈可以分析存放在本地的COOKIE并进⾏COOKIE欺骗考虑到安全应当使⽤session。
3、session会在⼀定时间内保存在服务器上。当访问增多,会⽐较占⽤你服务器的性能考虑到减轻服务器性能⽅⾯,应当使⽤COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制⼀个站点最多保存20个cookie。
5、所以个⼈建议:将登陆信息等重要信息存放为SESSION 其他信息如果需要保留,可以放在COOKIE中
5.索引有什么⽤?如何建索引?
SQL 创建索引的作⽤以及如何创建索引
SQL 创建索引的作⽤
⼀、使⽤索引的优点:
1、通过唯⼀性索引(unique)可确保数据的唯⼀性
2、加快数据的检索速度
3、加快表之间的连接
4、减少分组和排序时间
5、使⽤优化隐藏器提⾼系统性能
⼆、使⽤索引的原则:
1、在需要经常搜索的列上创建索引
2、主键上创建索引
3、经常⽤于连接的列上创建索引
4、经常需要根据范围进⾏搜索的列上创建索引
5、经常需要排序的列上创建索引
6、经常⽤于where⼦句的列上创建索引
三、不创建索引的原则:
1、查询很少使⽤和参考的列不建索引
2、对只有少数值的列不建索引
3、定义为text、image、bit的列不建索引
4、当需要update性能远远⾼于select性能时不应建索引
四、常⽤的命令:
1、sp_helpindex :报告表或视图上的索引信息
2、dbcc showcontig :显⽰指定表的数据和索引的碎⽚信息
3、dbcc dbreindex :重建指定数据库中⼀个或多个索引
4、dbcc indexdefrag :整理指定表或视图的聚集索引或辅助索引的碎⽚
五、优化索引:
1、重建索引(dbcc dbreindex)
2、索引优化向导
3、整理指定的表或视图的聚集索引和辅助索引碎⽚(dbcc indexefrag)
如何创建索引
CREATE INDEX 语句⽤于在表中创建索引。
在不读取整个表的情况下,索引使数据库应⽤程序可以更快地查数据。索引
您可以在表中创建索引,以便更加快速⾼效地查询数据。
6.ArrayList是如何实现的,ArrayList和LinedList的区别?ArrayList如何实现扩容。
新容量=(旧容量*3)/2+1,ArrayList 基于动态数组,LinkedList基于链表。
如果涉及到堆栈,队列等操作,应该考虑⽤List,对于需要快速插⼊,删除元素,应该使⽤LinkedList,如果需要快速随机访问元素,应该使⽤ArrayList。
尽量返回接⼝⽽⾮实际的类型,如返回List⽽⾮ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不⽤改变。这就是针对抽象编程。
7.equals⽅法实现
⾸先看下Java语⾔规范对equals⽅法的要求:
1,⾃反性,对于任何⾮控引⽤x,x.equals(x)都应该返回true。
2,对称性,对于任何引⽤x和y,如果x.equals(y)返回true,那么y.equals(x)也应该返回true。
3,传递性,如果x.equals(y),y.equals(z)都返回true,那么,x.equals(z)返回true。
4,⼀致性,如果x和y引⽤的对象没有发⽣变化,那么⽆论调⽤多少次x.equals(y)都返回相同的结果。
5,对于任意⾮空引⽤x,x.equals(null)都应该返回false。
Object类中的equals⽅法⽤于检测两个对象是否相等,⽽相等判断的标准则是⼆者是否引⽤同⼀个对象。
下⾯给出编写⼀个完美的equals⽅法的原则:
1,将equals的Object类显式参数命名为otherObject。
2,检测otherObject是否与this引⽤⾃同⼀个对象。
3,检测otherObject是否为null,是的话返回false。
4,检测this与otherObject是否属于同⼀个类,这⾥需要注意的情况就是当⽐较的两个对象不属于同⼀个类时,⽐如p.equals(e),p是⼀个Person,e是⼀个Employee, Employee继承⾃Person。Person拥有name,age私有域,Employee具有occupation域。
如果相等的概念是的对象的所有域都必须相等,p.equals(e)中使⽤e instalceof Person返回true,但是
如果e.equals(p)调⽤,p instanceof Employee则返回false,不满⾜对称性要求,所以这⾥需要强制采⽤getClass()来进⾏类型检测。
如果相等的概念是由超类决定的,⽐如认为只要name和age相同,则Person和Employee相等,则可以使⽤instance进⾏检测,同时在超类中将该⽅法定义为final。
5,将otherObject转换为this类型的变量。
6,现在开始进⾏私有数据域的⽐较,对于基本类型如数值,字符和布尔类型使⽤==进⾏⽐较,对对象域使⽤equals进⾏⽐较,所有域都相同则返回true。
7,使⽤@Override声明有助于错误检查。
8.⾯向对象
9.线程状态,BLOCKED和WAITING有什么区别
WATTING就是⼀个线程调⽤了 Object.wait() 就是在等待别的线程对该对象调⽤ ify() ifyAll().
BLOCKED是指线程正在等待获取锁。
总结: BLOCKED 和WAITING 都是⾮活动线程的状态. WAITING 线程是已经分配到了CPU时间,但是需要等待事件发⽣所以主动释放了CPU,直到某些事件完成后调⽤了notify()唤醒, 也就是WAITTING线程是⾃⼰现在不想要CPU时间,但是BLOCKED线程是想要的,但是BLOCKED线程没有获得锁,所以轮不到BLOCKED线程。
作者:罗智勇链接:www.zhihu/question/27654579/answer/97448656来源:知乎著作权归作者所有。商业转载请联系作者获得授权,⾮商业转载请注明出处。
10.JVM如何加载字节码⽂件
11.JVM GC,GC算法。
12.什么情况会出现Full GC,什么情况会出现yong GC。
13.JVM内存模型
14.Java运⾏时数据区
15.事务的实现原理
事务必须服从ISO/IEC所制定的ACID原则。ACID是原⼦性(atomicity)、⼀致性(consistency)、隔离性(isolation)和持久性(durability)的缩写。事务的原⼦性表⽰事务执⾏过程中的任何失败都将导
致事务所做的任何修改失效。⼀致性表⽰当事务执⾏失败时,所有被该事务影响的数据都应该恢复到事务执⾏前的状态。隔离性表⽰在事务执⾏过程中对数据的修改,在事务提交之前对其他事务不可见。持久性表⽰已提交的数据在事务执⾏失败时,数据的状态都应该正确。
技术深度
1.有没有看过JDK源码,看过的类实现原理是什么。
2.HTTP协议
3.TCP协议
TCP(Transmission Control Protocol 传输控制协议)是⼀种⾯向连接(连接导向)的、可靠的、基于IP的传输层协议
4.⼀致性Hash算法
5.JVM如何加载字节码⽂件
当我们使⽤命令来执⾏某⼀个Java程序(⽐如Test.class)的时候:java Test
(1) 会帮助我们到 JRE ,接着到位于 JRE 内部的 jvm.dll ,这才是真正的 Java 虚拟机器 , 最后加载动态库,激
活 Java 虚拟机器。
(2) 虚拟机器激活以后,会先做⼀些初始化的动作,⽐如说读取系统参数等。⼀旦初始化动作完成之后,就会产⽣第⼀个类装
载器―― Bootstrap Loader(启动类装载器 ) 。
(3) Bootstrap Loader 所做的初始⼯作中,除了⼀些基本的初始化动作之外,最重要的就是加载 Launcher.java 之中的
ExtClassLoader(扩展类装载器) ,并设定其 Parent 为 null ,代表其⽗加载器为 BootstrapLoader 。
(4) 然后 Bootstrap Loader 再要求加载 Launcher.java 之中的 AppClassLoader(⽤户⾃定义类装载器 ) ,并设定其 Parent 为之
前产⽣的 ExtClassLoader 实体。这两个加载器都是以静态类的形式存在的。
6.类加载器如何卸载字节码
由Java虚拟机⾃带的类加载器所加载的类,在虚拟机的⽣命周期中,始终不会被卸载。
前⾯介绍过,Java虚拟机⾃带的类加载器包括根类加载器、扩展类加载器和系统类加载器。
Java虚拟机本⾝会始终引⽤这些类加载器,⽽这些类加载器则会始终引⽤它们所加载的类的Class对象,因此这些Class对象始终是可触及的。
由⽤户⾃定义的类加载器加载的类是可以被卸载的。
7.IO和NIO的区别,NIO优点
8.Java线程池的实现原理,keepAliveTime等参数的作⽤。
我们使⽤线程的时候就去创建⼀个线程,这样实现起来⾮常简便,但是就会有⼀个问题:
如果并发的线程数量很多,并且每个线程都是执⾏⼀个时间很短的任务就结束了,这样频繁创建线程就会⼤⼤降低系统的效率,因为频繁创建线程和销毁线程需要时间。
那么有没有⼀种办法使得线程可以复⽤,就是执⾏完⼀个任务,并不被销毁,⽽是可以继续执⾏其他的任务?
在Java中可以通过线程池来达到这样的效果。今天我们就来详细讲解⼀下Java的线程池,⾸先我们从最核⼼的
ThreadPoolExecutor类中的⽅法讲起,然后再讲述它的实现原理,接着给出了它的使⽤⽰例,最后讨论了⼀下如何合理配置线程池的⼤⼩。
9.HTTP连接池实现原理
10.数据库连接池实现原理
11.数据库的实现原理
技术框架
1. 看过哪些开源框架的源码
2. 为什么要⽤Redis,Redis有哪些优缺点?Redis如何实现扩容?
3. Netty是如何使⽤线程池的,为什么这么使⽤
4. 为什么要使⽤Spring,Spring的优缺点有哪些
5. Spring的IOC容器初始化流程
6. Spring的IOC容器实现原理,为什么可以通过byName和ByType到Bean
7. Spring AOP实现原理
8. 消息中间件是如何实现的,技术难点有哪些
系统架构
1. 如何搭建⼀个⾼可⽤系统
2. 哪些设计模式可以增加系统的可扩展性
3. 介绍设计模式,如模板模式,命令模式,策略模式,适配器模式、桥接模式、装饰模式,观察者模式,状态模式,访问者模式。
4. 抽象能⼒,怎么提⾼研发效率。java中常用的设计模式有哪些
5. 什么是⾼内聚低耦合,请举例⼦如何实现
6. 什么情况⽤接⼝,什么情况⽤消息
7. 如果AB两个系统互相依赖,如何解除依赖
8. 如何写⼀篇设计⽂档,⽬录是什么
9. 什么场景应该拆分系统,什么场景应该合并系统
10. 系统和模块的区别,分别在什么场景下使⽤
分布式系统
1. 分布式事务,两阶段提交。
2. 如何实现分布式锁
3. 如何实现分布式Session
4. 如何保证消息的⼀致性
5. 负载均衡
6. 正向代理(客户端代理)和反向代理(服务器端代理)
7. CDN实现原理
8. 怎么提升系统的QPS和吞吐量
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论