Java我的面试题

BIO、NIO、AIO 有什么区别?
IO操作分为两部分:发起IO请求和IO数据读写。阻塞和非阻塞主要是针对线程发起IO请求后,是否立即返回来定义的,立即返回称为非阻塞IO,否则称为阻塞IO。同步和异步主要针对IOS数据读写来定义的,读写过程中不阻塞线程称为异步IO,否则称为同步IO。
1. BIO表示同步阻塞式IO:交互方式是同步、阻塞方式,即客户端有连接请求时服务端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的开支。
2. NIO表示同步非阻塞IO:客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程处理。
3. AIO表示异步非阻塞IO:客户端的I/O请求都是由操作系统先完成IO操作后再通知服务器应用来启动线程处理。
怎么确保一个集合不能被修改?
可以使用Collections或者Guava来快速实现。如Collections.unmodifiableMap(mapObj);
并行和并发有什么区别?
并行是多个事件同时进行,并发是多个事件在某一时间段内间隔发生。
线程和进程的区别?
进程是操作系统资源分配的基本单位,线程是任务调度和执行的基本单位.
进程有独立的地址空间,一个进程崩溃后在保护模式下不会对其他进程产生影响,而线程只是一个进程中的
不同执行路径,线程有自己的堆栈和局部变量.在操作系统中能同时运行多个进程,而在同一个进程内有多个线程同时执行。
runnable 和 callable 有什么区别?
runnable 的 run() 方法没有返回值,多个线程间可以共享实例变量,且不能抛出异常,异常需要在方法内部处理。
callable 的 call() 方法可以的返回线程的执行结果,允许抛出异常,有返回值返回执行结果。
创建线程的方式有几种?
四种。
1. 继承 Thread 类,重写 run() 方法;
2. 实现 Runnable 接口,实现 run() 方法;
3. 实现 Callable 接口,实现 call() 方法;
4. 通过 Executors 工厂类创建一个线程池,提供管理和调度线程的功能。
线程有哪些状态?
1. new 新建状态,此时线程还没有运行线程中的代码;
2. runnable 就绪状态,处于就绪状态的线程并不一定立即运行 run 方法,必须还要和其他线程竞争CPU时间;
3. running 运行状态,线程获得CPU时间后才进入运行状态,开始执行run方法
4. blocked 阻塞状态,线程运行过程中会有各种原因来进入阻塞状态,如:调用sleep方法进入休眠等;
在IO操作中被阻塞;试图得到一个锁,该锁正被其他线程持有;等待某个触发条件
阻塞状态的线程此时没有结束,只是暂时让出CPU时间给其他线程;
5. dead 死亡状态,有两个原因导致线程死亡:第一是run方法正常退出自然死亡;第二是一个未捕获的
异常终止了run方法使线程死亡。
为了确定线程在当前是否存活着(就是要么是可运行的,要么是被阻塞了),需要使用isAlive方法,如果是可运行或被阻塞,这个方法返回true;如果线程仍旧是new状态且不是可运行的,或者线程死亡了,则返回false。
线程池都有哪些状态?
1. running 一旦被创建,就处于此状态,可以接受新任务以及对已经添加的任务进行处理.
2. shutdown 此时不接收新任务,但是可以处理已添加的任务
3. stop 此状态不接收新任务,不处理已添加任务,并且会中断正在处理的任务.
4. tidying 当所有的任务已终止,ctl记录的任务数变为0,线程池会变成tidying状态.当线程池变为TIDYING状态会执行terminated()方法.
当线程池在SHUTDOWN状态下,阻塞队列为空并且线程池中执行的任务也为空时,就会由 SHUTDOWN -> TIDYING。
当线程池在STOP状态下,线程池中执行的任务为空时,就会由STOP -> TIDYING。
5. terminated 线程池彻底终止会变成这个状态.当在TIDYING状态,执行完terminated()函数后,就会由TIDYING状态变为TERMINATED状态.
sleep() 和 wait() 有什么区别?
1. sleep方法是Thread类的,而wait方法是Object类中的。
2. sleep方法使线程休眠指定的时间,让出CPU给其他线程,但是他的监控状态依然保持着,时间到了以后会自动恢复运行状态
在这个过程中线程不会释放同步对象锁。而调用wait方法,线程会放弃对象锁,进入等待队列,待调用notify/notifyAll方法后才会进入锁池,获取对象锁后才进入运行状态。
notify()和 notifyAll()有什么区别?
notify()方法随机唤醒一个wait线程到锁池中去竞争锁,而notifyAll方法唤醒所有wait线程到锁池。
notity()方法可能产生死锁,notifyAll则不会.
线程的 run()和 start()有什么区别?
run()方法只是定义了线程的执行单元并非直接开启了线程资源,只有start()方法被调用,才可以启动一个线程。
线程池中 submit()和 execute()方法有什么区别?
1. 接受参数不一样,execute()方法接收Runnable类型的参数;submit()可以接收runnable和callable类型的参数
2. submit方法有返回值,返回一个Future类型的对象,execute方法没有返回值.
3. submit方法方便处理Exception异常。
在 java 程序中怎么保证多线程的运行安全?
1. 最简单的方式是加入 synchronized 关键字,在共享数据语句中加入该关键字可以在某一时段只会让一个线程执行,其他线程不能执行;
2. 使用锁Lock,new 一个 Lock对象然后调用 .lock() 方法,业务逻辑处理完成之后再调用 .unlock() 方法;
3. 变量使用 volatile 关键字修饰,本地线程将不会缓存,对该变量的读写都是直接操作共享缓存从而确保多个线程能正确处理该变量。
什么是反射?
在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。
什么是 java 序列化?什么情况下需要序列化?
序列化就是一种用来处理对象流的机制,简单来说就是需要将对象持久化是,把对象的内容转变为字节序列。
当想把内存中的对象状态保存在一个文件或者数据库,或者在网络上传输的时候,就需要序列化。在java中需要实现Serializable接口.
动态代理是什么?有哪些应用?
在程序运行期,创建目标对象的代理对象,对目标对象中的方法进行功能性增强的一种技术。
在生成代理对象的过程中,目标对象不变,代理对象中的方法是目标对象方法的增强方法。可以理解为运行期间,对象中方法的动态拦截,在拦截方法的前后执行功能操作。
应用: Spring的AOP,事物,权限,日志,RPC框架等。
如何实现对象克隆?
1. 实现 Cloneable 接口并重写 Objec t的clone()方法 【属于浅拷贝】【浅克隆只会克隆基本数据类型,其他的会直接进行引用】。(注:Cloneable 接口是一个空接口,但是需要重写 Object 对象的 clone() 方法)
2. 实现Serializable接口,通过对象的序列化和反序列化实现深度克隆。
说一下 session 的工作原理?
当用户第一次访问一个服务器,服务器就会为该用户创建一个session,并生成一个和该session有关的session_id,
这个id是唯一的,不可重复.这个id将会在本次响应中返回,保存在客户端的cookie中,下次访问的时候,客户端浏览器
的cookie中含有session_id,服务器基于这个id就可以识别该用户.
session 和 cookie 有什么区别?
1. 数据存放位置不同.session在服务器,cookie在客户端浏览器
2. 安全程度不同,别人可以分析存放在本地的cookie进行cookie欺骗.
3. 单个cookie保存的数据不能超过4k,而session是在服务器的,所以没有限制
4. cookie只能存储string类型的数据,session可以存储对象.
如果客户端禁止 cookie 能实现 session 还能用吗?
可以,当cookie被禁用,我们可以使用"URL重写"来使session生效,简单来说就是将sessionid的信息作为请求地址的一部分
这样服务器就可以解析URL,得到该sessionid,进而识别用户。
如何避免 sql 注入?
1. 采用预编译语句;
2. 使用正则过滤传入的参数;
3. 屏蔽不安全的字符。
什么是 XSS 攻击,如何避免?
XSS攻击,即跨站脚本攻击。是指攻击者在用户端注入恶意的可运行脚本,让其在用户浏览网页时运行,从而通过脚本来获得用户的信息。
避免: 对用户输入和URL参数进行过滤,过滤掉脚本相关的内容。
http 响应码 301 和 302 代表的是什么?有什么区别?
301和302都是HTTP请求的状态码,其中301代表永久性转移,302代表暂时性转移.
301代表转向前的网址不在了,就会把新的网址当做有效目标
302只是代表临时性重定向,旧的网址会保留.
TCP 和 UDP
传输控制协议(TCP):TCP(传输控制协议)定义了两台计算机之间进行可靠的传输而交换的数据和确认信息的格式,以及计算机为了确保数据的正确到达而采取的措施。TCP最大的特点就是提供的是面向连接、可靠的字节流服务。
用户数据报协议(UDP):UDP(用户数据报协议)是一个简单的面向数据报的传输层协议。提供的是非面向连接的、不可靠的数据流传输。UDP不提供可靠性,也不提供报文到达确认、排序以及流量控制等功能。它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。因此报文可能会丢失、重复以及乱序等。但由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
TCP 的三次握手与四次挥手
通道的建立——三次握手:
(1)在建立通道时,客户端首先要向服务端发送一个 SYN 同步信号。
(2)服务端在接收到这个信号之后会向客户端发出 SYN 同步信号和 ACK 确认信号。
(3)当服务端的 ACK 和 SYN 到达客户端后,客户端与服务端之间的这个“通道”就会被建立起来。
通道的关闭——四次挥手:
(1)在数据传输完毕之后,客户端会向服务端发出一个 FIN 终止信号。
(2)服务端在收到这个信号之后会向客户端发出一个 ACK 确认信号。
(3)如果服务端此后也没有数据发给客户端时服务端会向客户端发送一个 FIN 终止信号。
(4)客户端在收到这个信号之后会回复一个确认信号,在服务端接收到这个信号之后,服务端与客户端的通道也就关闭了。
tcp 为什么要三次握手,两次不行吗?为什么?
1. 为了实现可靠数据传输,TCP 协议的通信双方,都必须维护一个序列号以标识发送出去的数据包中哪些是已经被对方收到的。
三次握手的过程即是通信双方相互告知序列号起始值,并确认对方已经收到了序列号起始值的必经步骤。
2. 如果只是两次握手,至多只有连接发起方的起始序列号能被确认,另一方选择的序列号则得不到确认。
get 和 post 请求有哪些区别?
1.get产生一个TCP数据包,POST产生两个;
2.get将数据放在url中可以看到,post会放在html header中提交;
3.get数据大小有限制,最大1024字节(和浏览器有关),post没有限制。
设计模式
简单工厂与抽象工厂
什么是 Spring,为什么要使用 Spring?
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,供了很多基础功能(如:事务管理、持久化框架集成等等)将应用逻辑的开发留给了开发人员,为了解决企业应用开发的复杂性。
spring 有哪些主要模块?
1. spring core: core是spring的核心类库,它的所有功能都依赖于该类库,主要实现IOC功能。
2. AOP: spring aop提供了常用的拦截器供用户配置。
3. ORM: 该模块提供对常用的ORM框架的管理和辅助支持.spring自己不实现ORM,只是对常见的ORM进行封装管理
4. DAO: spring提供对jdbc的支持,统一管理jdbc事物,并不对其进行实现
5. WEB: 提供对常用框架,如struts2的支持,将spring的资源注入给这些框架,也能在这些框架的前后插入拦截器
6. Context: 提供框架式的bean访问方式,其他程序可以通过Context访问spring的bean资源
7. MVC: 提供一套轻量级的MVC实现,简单方便.
什么是 ioc?
ioc控制反转。即把创建对象和维护对象之间关系的权利交给spring容器去做,程序自己不再维护。
传统:自己使用new 或者getInstance直接或者间接创建一个对象(高耦合,不易测试)
spring:容器使用工厂模式为了创建了所需要的对象,我们不用自己创建,直接调用即可.
什么是 aop?
aop即面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术,可以在不修改源代码的基础上对功能进行增强,
spring 常用的注入方式有哪些?
1. 构造器注入:可以在xml中通过constructor-arg标签来注入一个对象到构造器中;
2. 注解注入:基于注解在xml文件中开启注解扫描以后,就可以在filed上使用注解@Autowired或者@Rsource来注入对象。
spring 自动装配 bean 有哪些方式?
1. xml配置方式
2. 注解扫描方式
@Autowired 和 @Resources 的使用及区别?
@Autowired 和 @Resources 都是注入 Java Bean的。 @Autowired 是 Spring 定义的注解 @Resources 是 Java 定义的注解。
依赖查找顺序不同:
1. @Autowired 是先根据类型(byType)查找,如果存在多个 Bean 再根据名称(byName)进行查找;(需要搭配@Qualifier(“xxService”)使用才能转为 byName)
2. @Resource 是先根据名称查找,如果(根据名称)查找不到,再根据类型进行查找; @Resources(name = “xxService”)
当一个接口被多个类实现时,@Resources 可以直接使用 name 属性进行区分。@Autowired 可以搭配 @Qualifier(“xxService”) 使用。[限定符]
spring 事务实现方式有哪些?
1.编程式事务 允许用户在代码中精确定义事务的边界;
2.声明式事务 基于AOP,将操作和事务管理分离。
spring mvc 有哪些组件?
1. DispatcherServlet 前端控制器
2. HandlerMapping 请求派发,建立请求和处理器的映射
3. Controller 处理器
4. ModelAndView 封装模型和视图信息
4. ViewResolver 视图处理器,定位页面
spring mvc 运行流程?
用户发送请求到前端控制器 DispatcherServlet;
DispatcherServlet 解析请求,调用处理器映射器 HandlerMapping;
HandlerMapping 找到具体的控制器生成执行链,返回给 DispatcherServlet;
DispatcherServlet 调用处理器适配器 HandlerAdapter;
HandlerAdapter 经过适配调用具体的控制器 Controller;
Controller 执行完返回 ModelAndView 给 HandlerAdapter;
HandlerAdapter 将 ModelAndView 返回给 DispatcherServlet;
DispatcherServlet 将 ModelAndView 传给视图解析器 ViewReslover;
ViewReslover 解析后返回真实的View 给 DispatcherServlet;
DispatcherServlet 根据 View 将模型数据填充至视图中,最后将渲染结果响应给客户端。

什么是 SpringBoot,为什么要使用 SpringBoot?

事务有哪些特性? (ACID)
原子性(A):事务最小的执行单位,不允许分割。事务的原子性确保动作要么全部执行,要么全部不执行。(InnoDB存储引擎的原子性是通过 undo log (重做日志)来保证的,每当操作时,在磁盘数据变更之前,将操作写入 redo log,这样当系统奔溃重启后可以继续执行。)
一致性©:执行事务的前后,数据保持一致。例如转账的业务中,无论事务是否成功,转账者和收款人的总额应该是不变的。
隔离性(I):并发访问数据库时,一个用户的事务不应该被其他事务所影响,各并发事务之间数据库是独立的。(事务的隔离性是通过 读写锁 + MVCC 机制来实现的)
持久性(D):一个事务被提交后,它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有影响。(事务的持久性是通过 redo log (回滚日志)来实现的,当一个事务执行一半无法继续执行时,可以根据回滚日志将之前的修改恢复到变更之前的状态。)

Spring 事务隔离级别?
Sping 中的事务隔离级别有 5 种,它们分别是:
DEFAULT: Spring 中默认的事务隔离级别 。以连接的数据库的事务隔离级别为准;
READ_UNCOMMITTED:读未提交,也叫未提交读。该隔离级别的事务可以看到其他事务中未提交的数据。该隔离级别因为可以读取到其他事务中未提交的数据,而未提交的数据可能会发生回滚,因此我们把该级别读取到的数据称之为脏数据,把这个问题称之为脏读;
READ_COMMITTED:读已提交,也叫提交读。该隔离级别的事务能读取到已经提交事务的数据,因此它不会有脏读问题。但由于在事务的执行中可以读取到其他事务提交的结果,所以在不同时间的相同 SQL 查询中,可能会得到不同的结果,这种现象叫做不可重复读;
REPEATABLE_READ:可重复读,它能确保同一事务多次查询的结果一致。但也会有新的问题,比如此级别的事务正在执行时,另一个事务成功的插入了某条数据,但因为它每次查询的结果都是一样的,所以会导致查询不到这条数据,自己重复插入时又失败(因为唯一约束的原因)。明明在事务中查询不到这条信息,但自己就是插入不进去,这就叫幻读 (Phantom Read);
SERIALIZABLE:串行化,最高的事务隔离级别。它会强制事务排序,使之不会发生冲突,从而解决了脏读、不可重复读和幻读问题,但因为执行效率低,所以真正使用的场景并不多。
MySQL 的事务隔离级别?
MySQL 中的事务隔离级别有 4 种,它们分别是:
未提交读(READ UNCOMMITTED):
提交读(READ COMMITTED):
可重复读(REPEATABLE READ):MySQL 默认的隔离级别。
序列化(SERIALIZABLE):
Oracle 的事务隔离级别?
Oracle 中的事务隔离级别有 2 种,它们分别是:
提交读(READ COMMITTED):Oracle 默认隔离级别。
序列化 (SERIALIZABLE):
Spring 事务的传播机制与 @Transacional 注解:
@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.READ_UNCOMMITTED)
@Transactional 的 isolation 属性可以设置事物的隔离级别,propagation 属性可以设置事物的传播机制。Spring中七种Propagation类的事务属性:
REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值