共计 5647 个字符,预计需要花费 15 分钟才能阅读完成。
Java 面试题总结
Java 语言
多线程
- 什么是多线程:多线程指一个程序中蕴含多个线程,能够同时执行多个不同的工作。
- 多线程优劣:长处是能够进步系统资源的利用率,进步程序效率。毛病是须要协调治理,须要进行同步。
- 并发和并行的区别:并发是多个工作同时开启,在 CPU 的工夫片轮转中交替执行;并行是多个工作在多核 CPU 上同时执行,真正意义上的同时运行。
- 并发编程三要素:原子性,可见性和有序性。原子:一个工作要么全副执行,要么全副不执行;可见:一个线程对共享变量操作后,后果对其余线程可见;有序:程序的执行程序依照代码先后顺序来执行。
- 线程与过程区别:过程是操作系统资源分配的根本单位,线程是操作系统任务调度的根本单位。
- 线程死锁:多个线程因为竞争资源而造成的循环期待的阻塞景象。
- 造成死锁的条件:(1)互斥条件:一个资源每次只能被一个过程应用。(2)申请与放弃条件:一个过程因申请资源而阻塞时,对已取得的资源放弃不放。(3)不剥夺条件:过程已取得的资源,在未应用完之前,不能强行剥夺。(4)循环期待条件:若干过程之间造成一种头尾相接的循环期待资源关系。
- 如何解决死锁:一个过程无奈申请到其余资源时,开释曾经领有的资源;按程序申请资源;一次性申请所有资源。
- 创立线程的四种形式:继承 Thread 类;实现 Runnable 接口;实现 Callable 接口;应用 Executors 创立线程池。
- run 和 start 办法的区别:run 办法只是一般办法,start 能够启动线程,让其进入就绪状态期待调度;
- 线程生命周期:新建,就绪,阻塞,期待,销毁;
- sleep 和 wait 的区别:sleep 不开释锁,wait 开释锁;sleep 是 Thread 类的静态方法,wait 是 Object 类的办法。
- 如何在两个线程之间共享数据:共享变量。
- 什么是线程平安:在多线程的环境中,通过同步的形式让共享变量可能被正确处理,就是线程平安。
- 什么是线程池:提前创立若干个线程保留在一起,期待解决工作,处理完毕后不销毁,持续期待下一个工作,就是线程池。应用 Executors 接口创立线程池。
- 四种线程池的创立:newCachedTheadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor。
- 线程池的长处:重用存在的线程,防止对象创立和销毁的开销;管制最大线程数,防止资源竞争造成的阻塞。
- 乐观锁和乐观锁:乐观锁不对操作的数据加锁,只在提交数据的时候验证是否被批改过;乐观锁在操作数据的期间加锁,等锁开释后其余线程能力对数据进行拜访批改。
- 多线程同步有哪几种办法:synchronized 关键字;手动上 lock;分布式锁。
- synchronized 的底层实现原理:synchronized 能够保障办法或者代码块在运行时,同一时刻只有一个办法能够进入到临界区,同时它还能够保障共享变量内存的可见性。
汇合框架
- 什么是汇合:汇合是一种容器,用来寄存对象信息。
- 数组和汇合的区别:数组长度不可变,汇合可动静扩容;数组元素能够是根本类型和对象,汇合只能保留对象。
- Collections 和 Collection 的区别:Collections 是工具类,提供一系列静态方法用于对汇合元素进行排序、搜寻和线程平安等各种操作。Collection 是汇合的顶级接口。
- List、Set、Map 区别:List 有序,可反复,有索引;Set 无序,不可反复;Map:键值对存储,无序,不可反复。
- HashMap 和 Hashtable 区别:HashMap 线程不平安,效率高;Hashtable 线程平安,效率低。
- HashMap 的数据结构:数组 + 链表 + 红黑树。
- HashSet 实现原理:底层由 HashMap 实现,HashSet 的值寄存于 key 上,value 对立为 PRESENT。
- ArrayList 和 LinkList 的区别:ArrayList 底层是数组,LinkList 底层是链表。
- ArrayList 和 Vector 的区别:Vector 线程平安,ArrayList 非线程平安。
- 哪些汇合是线程平安的:Vector,Hashtable,ConcurrentHashMap,Stack。
其余
- 常见的 Exception:NullPointException,SQLException,IOException,IndexOutOfBoundsException,FileNotFoundException。
- String 不是根本数据类型,而是一个类。
- String 和 StringBuffer 的区别:String 是不可变对象,一旦被创立就不能批改它的值,对于曾经存在的 String 对象,批改值的外部实现是从新创立一个新的对象。StringBuffer 是可变的对象,批改时候不会从新创建对象。
- Int 和 Integer 的区别:int 是根本数据类型,Integer 是援用数据类型。int 默认值是 0,integer 默认值是 null。
- 运行时异样和个别异样的区别:运行时异样都是 RuntimeException 类及其子类,个别异样都是 Exception 类及其子类;运行时异样在程序中能够捕捉解决也能够不解决,个别异样必须捕捉解决,否则不能编译通过。
- JDK 是开发环境,蕴含 JRE;JRE 是运行时环境,不包含 JDK。
- 主动装箱:根本数据类型转换为包装器类型;主动拆箱:包装器类型转换为根本数据类型。
- final,finally,finalize 的区别:final 是修饰符,表明变量不可批改或类不可继承;finally 是异样捕捉后必然执行的语句块;finalize 是办法名,用于在垃圾收集器将对象彻底清除前的清理工作。
Math.round()
是四舍五入的意思。i++
是返回原来的值执行语句,再加一;++i
是先返回 + 1 后的值,再执行语句。-
try finally 问题:
public class Demo {public static void main(String[] args) {Demo demo=new Demo(); System.out.println(demo.test()); } private int test(){ try {System.out.println("try"); return 0; } finally {System.out.println("finally"); } } }
最终执行后果是:
try finally 0
也就是说,有 return 的话 return 最初执行,其余语句块按程序执行。
- 一个变量的定义的修饰符的程序:
private final static int i=1;
网络
- TCP 与 UDP 区别:TCP 有连贯,UDP 无连贯。TCP 牢靠传输,UDP 不牢靠传输。
- 三次握手四次挥手:三次握手,客户端发送 SYN 数据包到服务器,服务器收到 SYN 后发送 SYN+ACK 数据包,客户端收到 SYN+ACK 再向服务器发送 ACK 实现三次握手,开始传输数据;四次挥手,被动发送到被动一个 FIN,被动受到 FIN 发送 ACK,被动发送 FIN,被动收到 FIN 发送 ACK。
- 四层网络模型:应用层,传输层,网络层、链路层。
- 什么是 Socket:套接字,就是对网络中不同主机上的利用过程之间进行双向通信的端点的形象,应用 IP 地址 + 传输协定 + 端口号的形式创立连贯。
- IO 流:用于解决设施之间传输数据的流式管道。输出读取,输入写出。
- BIO,NIO,AIO 的区别:BIO 是同步阻塞形式,NIO 是同步非阻塞形式,AIO 是异步非阻塞形式。
- 网络层协定: IP 协定,ICMP 协定,ARP 协定;传输层协定: TCP 协定,UDP 协定;应用层协定: FTP,SMTP,HTTP,DNS。
- Session, Cookie, Token 的区别:Session 和 Cookie 的次要目标就是为了补救 HTTP 的无状态个性。Session 存储在服务器端,用于保留一次会话的状态。Cookie 存储在客户端,用于保留用户的数据。token 是验证令牌,用于向服务器验证本人的用户身份。
Redis
- 什么是 Redis:开源的、可基于内存也能够长久化的基于键值对的高性能非关系型数据库。
- 为什么要应用 Redis:高性能和高并发,基于内存速度快,数据结构简略,人造比关系型数据库反对更高的并发量和性能。
- Redis 反对的数据类型:能够存储键和五种类型的值的映射。键仅反对字符串,值反对 String、List、Set、HashMap、ZSet。
- 长处:读写性能强,反对长久化,反对主从复制;毛病:数据库容量受到物理内存的限度。
- 什么是 Redis 长久化,Redis 有哪些长久化形式:长久化就是将内存中保留的数据落在磁盘上,避免因内存断电导致的失落。形式:RDB,把以后数据生成快照保留。AOF, 记录每次对数据的操作到硬盘。
-
缓存异样:
- 缓存雪崩:缓存同一时间大面积过期生效,导致前面的申请都落在数据库上,数据库接受大量申请崩掉。
- 缓存穿透:申请缓存和数据库中都没有的数据,导致所有申请都落到数据库上。
- 缓存击穿:缓存中没有但数据库中有的数据,因为并发用户多,同时读取缓存未读取到数据,同时去数据库读取数据,数据库压力过大。
nginx
- 什么是 nginx:是一种反向代理服务器。反向代理指能够代理内部网络拜访外部网络。
- nginx 长处:内存小,高并发,相应快。
- 解决申请的过程:首先由 listen 和 server_name 指令匹配 server 模块,再匹配 server 模块里的 location,location 就是理论地址。
- 正向代理和反向代理:正向代理代理客户端,反向代理代理服务端。
Spring 框架
- 什么是 Spring:轻量级的 Java 开发框架,为了解决企业级利用开发的业务逻辑层和其余层耦合的问题。
- Spring 框架的外围:IOC 容器,面向切片和依赖注入。
- 依赖注入:依赖类不禁程序员实例化,而是通过 Spring 容器创立指定实例并且将实例注入到须要该对象的类中。
- Spring 框架中的设计模式:工厂模式(FactiryBean 接口)和单例模式(Bean)。
-
Spring 罕用注解:
- 申明 bean 的注解:Component,Service,Controller
- 注入 bean 的注解:AutoWired byType,Resource byName。
- 配置类:Configuration 申明以后类是配置类,bean 申明以后办法的返回值是一个 bean,ComponentScan 用于对组件进行扫描。
- @value 为属性注入值。
- SpringMVC:RequestMapping 用于映射 Web 申请,ResponseBody 反对将返回值放在响应体内,RequestBody 容许申请的参数放在申请体中用于获取值,RestController 为 Controller 的响应值放在响应体内。
- 事务注解:Transaction
- Spring 框架的益处:解耦合,轻量,方便管理和配置。
- IOC 容器的了解:Spring IOC 容器负责创立和治理对象,简化利用开发。
- 不同形式的主动拆卸:byName:通过属性名主动拆卸,Spring 容器在配置文件中发现 bean 的 autowire 属性被设置成 byname,之后容器试图匹配、拆卸和该属性具备雷同名字的 bean。byType:通过参数类型主动拆卸,Spring 容器在配置文件中发现 bean 的 autowire 属性被设置成 byType,之后容器试图匹配、拆卸和该 bean 的属性具备雷同类型的 bean。如果有多个 bean 符合条件,则抛出谬误。
- Spring Boot 是什么:是精简了配置的 Spring。
Javaweb
- Servlet:运行在服务器上的一个程序,用来解决对服务器的申请。
- JSP 和 Servlet:JSP 用于页面展现,Servlet 用于逻辑管制。Servlet 是一个残缺的 Java 类。
- 数据库
- 索引:索引是对数据库中一个或多个列进行排序的数据结构,帮忙咱们疾速检索数据库中的数据。
MQ
- 音讯队列:是一种能够存储、传递音讯的容器,罕用于分布式系统中加重服务器间接压力。
- 益处:解耦、异步、削峰。
- RPC:近程过程调用。
数据库
- 索引:应用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种构造。相似于书籍的目录。
- HAVING 子句能够让咱们筛选分组后的各组数据。WHERE 子句在所选列上设置条件,而 HAVING 子句则在由 GROUP BY 子句创立的分组上设置条件。
- PostgreSQL 中的 limit 子句用于限度 SELECT 语句中查问的数据的数量。
- DISTINCT 关键字与 SELECT 语句一起应用,用于去除重复记录,只获取惟一的记录。
- 索引不应该应用在较小的表上。索引不应该应用在有频繁的大批量的更新或插入操作的表上。索引不应该应用在含有大量的 NULL 值的列上。索引不应该应用在频繁操作的列上。
- 视图是一张假表,只不过是通过相干的名称存储在数据库中的一个 PostgreSQL 语句。
- 触发器是数据库的回调函数,它会在指定的数据库事件产生时主动执行 / 调用。
简历相干的面试题
- Linux 怎么样让终端程序在后盾执行?有两种形式。第一种是用 Ctrl+ Z 让程序暂停,而后应用 bg 命令让程序在后盾继续执行,这种形式在退出终端后程序就会完结执行;第二种是在命令后加 & 符号,让命令一开始启动就在后盾运行。
- docker run -it 中的 it 是什么意思?- t 让 docker 调配一个伪终端并绑定到容器的规范输出上, - i 以交互模式运行容器,让容器的规范输出放弃关上。这样一个须要交互的容器实例才不会在启动后立即完结运行。
- 以前的工作我的项目:以前是在永辉做业务中台,包含领取、订单、用户中台。
- 什么是中台?前台的撑持零碎,基础设施层之上的通用业务层,这些业务能满足公共需要,将这些中台中的业务模块组合之后能够灵便的提供多种前台须要的能力。
- 中台解决了什么问题?中台解决了反复造轮子的问题,比方在多个我的项目中须要操作用户和订单,那么不须要屡次对对应的模块进行开发,只需调用对应中台的接口即可。
正文完