当前位置: 首页 > 后端技术 > Java

Java后端初级面试题

时间:2023-04-01 20:53:33 Java

Java面试题总结Java语言多线程什么是多线程:多线程是指一个程序中包含多个线程,可以同时执行多个不同的任务。多线程的优缺点:优点是可以提高系统资源的利用率,提高程序效率。缺点是需要协调管理和同步。并发与并行的区别:并发是指多个任务同时启动,在CPU的时间片轮换中交替执行;并行是指多个任务在多核CPU上同时执行,真正意义上的同时运行。并发编程的三要素:原子性、可见性和顺序。原子性:任务要么完全执行,要么根本不执行;可见:线程对共享变量进行操作后,结果对其他线程可见;有序:程序的执行顺序是按照代码的先后顺序执行的。线程和进程的区别:进程是操作系统资源分配的基本单位,线程是操作系统任务调度的基本单位。线程死锁:由于多个线程争夺资源而引起的循环等待的阻塞现象。形成死锁的条件:(1)互斥条件:一种资源一次只能被一个进程使用。(2)请求和持有条件:当一个进程因请求资源而阻塞时,它会持有获得的资源。(3)非剥夺条件:进程获得的资源在用完之前不能强行剥夺。(4)循环等待条件:几个进程之间形成头尾循环等待资源关系。如何解决死锁:当一个进程无法申请其他资源时,释放它已经拥有的资源;有序申请资源;一次申请所有资源。创建线程的四种方式:继承Thread类;实现Runnable接口;实现可调用接口;使用Executors创建线程池。run和start方法的区别:run方法只是一个普通的方法,start可以启动线程,让它进入就绪状态等待调度;线程生命周期:新建、就绪、阻塞、等待、销毁;sleep和wait的区别:sleep不释放锁,wait释放锁;sleep是Thread类的静态方法,wait是Object类的方法。如何在两个线程之间共享数据:共享变量。什么是线程安全:在多线程环境下,通过同步让共享变量得到正确处理就是线程安全。什么是线程池:预先创建若干个线程,存放在一起,等待处理任务,处理完不销毁,继续等待下一个任务,这就是线程池。使用Executors接口创建线程池。创建四个线程池:newCachedTheadPool、newFixedThreadPool、newScheduledThreadPool、newSingleThreadExecutor。线程池的优点:复用现有线程,避免对象创建和销毁的开销;控制最大线程数,避免资源竞争造成的阻塞。乐观锁和悲观锁:乐观锁不会对操作的数据加锁,只是在提交数据时验证是否被修改;悲观锁在数据操作过程中加锁,释放锁后其他线程才能访问和修改数据。多线程同步的方法有哪些:synchronized关键字;手动锁;分布式锁。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。其他常见异常: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是一个方法名,在垃圾回收器彻底清除对象之前使用Cleanup。Math.round()表示四舍五入。i++是返回执行语句的原值,加一;++i是先返回+1之后的值,再执行语句。最后尝试问题:publicclassDemo{publicstaticvoidmain(String[]args){Demodemo=newDemo();System.out.println(demo.test());}privateinttest(){try{System.out.println("try");返回0;}最后{System.out.println("终于");}}}最后的执行结果是:tryfinally0也就是说如果有return,return最后执行,其他语句块依次执行。变量定义修饰符的顺序:privatefinalstaticinti=1;网络TCP和UDP的区别:TCP有连接,UDP没有连接。TCP可靠传输,UDP不可靠传输。三次握手四次握手:三次握手,客户端向服务器发送SYN包,服务器收到SYN后发送SYN+ACK包,客户端收到SYN+ACK后再向服务器发送ACK,完成三次握手,开始传输数据;挥手四次,主动发送一个被动FIN,被动接收一个FIN并发送一个ACK,被动发送一个FIN,主动接收一个FIN并发送一个ACK。四层网络模型:应用层、传输层、网络层、链路层。什么是套接字:套接字是对网络中不同主机上的应用程序进程之间双向通信的端点的抽象,使用IP地址+传输协议+端口号来创建连接。IOStream:用于处理设备间数据传输的流式管道。读取输入并写入输出。BIO、NIO、AIO的区别:BIO是同步阻塞方式,NIO是同步非阻塞方式,AIO是异步非阻塞方式。网络层协议:IP协议、ICMP协议、ARP协议;传输层协议:TCP协议、UDP协议;应用层协议:FTP、SMTP、HTTP、DNS。Session、Cookie、Token的区别:Session和Cookie的主要目的是为了弥补HTTP的无状态性。Session存储在服务器端,用于保存一个会话的状态。Cookies存储在客户端,用于保存用户数据。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,Controllerbean的注入注解:AutoWiredbyType,ResourcebyName。配置类:Configuration声明当前类是一个配置类,bean声明当前方法的返回值是一个bean,ComponentScan用于扫描组件。@value为属性注入一个值。SpringMVC:RequestMapping用于映射web请求。ResponseBody支持将返回值放在响应体中。RequestBody允许将请求参数放在请求体中获取值。RestController是响应体中Controller的响应值。事务注解:TransactionSpring框架的好处:解耦、轻量级、易于管理和配置。IOC容器的理解:SpringIOC容器负责创建和管理对象,简化应用程序开发。自动组装的不同方式:byName:按属性名自动组装,Spring容器在配置文件中发现bean的autowire属性设置为byname,然后容器尝试匹配并组装同名的bean属性。byType:Spring容器通过参数类型自动装配,在配置文件中发现bean的autowire属性设置为byType,然后容器尝试匹配并组装与bean具有相同类型属性的bean。如果多个bean符合条件,则抛出错误。什么是SpringBoot:就是简化了配置的Spring。JavawebServlet:运行在服务器上的程序,用于处理对服务器的请求。JSP和Servlet:JSP用于页面展示,Servlet用于逻辑控制。Servlet是一个完整的Java类。数据库索引:索引是一种数据结构,它对数据库中的一个或多个列进行排序,以帮助我们快速检索数据库中的数据。MQ消息队列:是一个可以存储和传输消息的容器,常用于分布式系统中,减少对服务器的直接压力。好处:解耦、异步、削峰。RPC:远程过程调用。数据库索引:使用索引可以快速访问数据库表中的特定信息。索引是一种对数据库表中一个或多个列的值进行排序的结构。类似于书籍目录。HAVING子句允许我们在分组后过滤数据组。WHERE子句对所选列设置条件,而HAVING子句对GROUPBY子句创建的分组设置条件。PostgreSQL中的limit子句用于限制SELECT语句中查询的数据量。DISTINCT关键字与SELECT语句一起使用,以删除重复记录并仅获取唯一记录。不应在较小的表上使用索引。不应在频繁、大量更新或插入的表上使用索引。不应在具有大量NULL值的列上使用索引。索引不应用于频繁操作的列。视图是一个假表,只不过是通过关联名称存储在数据库中的PostgreSQL语句。触发器是数据库的回调函数,当指定的数据库事件发生时自动执行/调用。简历相关的面试题Linux是如何让终端程序在后台执行的?有两种方法。第一种是使用Ctrl+Z暂停程序,然后使用bg命令在后台继续程序。这样程序退出终端后就结束了;二是在命令后加一个&符号,让命令运行时在后台运行。dockerrun-it是什么意思?-t让docker分配一个伪终端并将其绑定到容器的标准输入,-i以交互模式运行容器,使容器的标准输入保持打开状态。这样一个需要交互的容器实例不会在启动后立即结束运行。什么是中台?前台和基础设施层之上的通用业务层的支持系统可以满足公众的需求。中台将这些业务模块组合起来后,可以灵活的提供前台需要的各种能力。中泰解决了什么问题?中间平台解决了重复造轮子的问题。比如用户和订单需要在多个项目中进行操作,就不需要多次开发相应的模块,只需要调用中台相应的接口即可。