Java全链路面试指南-知乎
秀聚
学无止境
展开
-
59.MyBatis-缓存机制,从一级缓存到二级缓存
缓存的主要作用是提高了查询性能,减少了跟数据库交互的次数,从而也减轻了数据库承受的压力。适用于读多写少的场景,如果数据变化频率非常高,则不适用。因为当数据库的数据发生更新操作的时候,缓存会进行清除,然后再将数据缓存下来。如果数据变化的频率非常高的话,就需要频繁的刷新缓存,耗费资源,甚至效率会降低。MyBatis的缓存分为一级缓存和二级缓存。一级缓存1,一级缓存模式是开启状态2,一级缓存作用域在于SqlSession(大家可以关闭SqlSession,然后创建一个新的,再获取对象,关闭SqlSes原创 2020-12-18 09:01:28 · 108 阅读 · 0 评论 -
60. MyBatis有哪些分页方式?
分页方式可以分为 逻辑分页 和 物理分页正常人,一般使用物理分页。所谓逻辑分页,是指使用MyBatis自带的RowBounds进行分页,它会一次性查出多条数据,然后再检索分页中的数据,具体一次性查询多少条数据,受封装jdbc配置的fetch-size决定。采用逻辑分页,一次从数据库中拿出多条数据,再对拿到的数据进行检索,分页,会造成内存的浪费,性能的浪费。不是一种很好的分页方式。而物理分页,是从数据库中查询指定条数的数据,而我们用的分页插件PageHelper实现的就是物理分页。物理分页就是使用数原创 2020-12-18 09:01:12 · 122 阅读 · 0 评论 -
61.从浏览器输入URL到页面加载完毕,都经历了什么?
首先,需要经过DNS(域名解析服务)将URL转换为对应的ip地址,实际上域名只是方便我们记忆,在网络上的每台主机交互的地址都是IP。其次,我们需要通过这个ip地址跟服务器建立TCP网络连接,随后向我们的服务器发出http请求。注意,http协议是tcp的上层协议最后,服务器接收到我们的请求,处理完毕之后,将响应数据放入到http的响应信息中,然后返回给客户端。客户端浏览器完成对服务器响应信息的渲染,将信息展现在用户面前。...原创 2020-12-18 09:00:54 · 90 阅读 · 0 评论 -
62.说说synchronized底层原理(重要)
这个我们要分情况来分析:1,JDK1.6之前synchronized是由一对monitor-enter和monitor-exit指令实现的。synchronized ("A"){}这对指令的实现是依靠操作系统内部的互斥锁来实现的,期间会涉及到用户态到内存态的切换,所以这个操作是一个重量级的操作,性能较低。2,JDK1.6之后JVM对synchronized进行了优化,改了三个经历的过程偏向锁 →轻量级锁→重量级锁偏向锁:在锁对象保存一个thread-id字段,刚开始初始化为空,当第一原创 2020-12-18 09:00:35 · 98 阅读 · 0 评论 -
58.什么是悲观锁,什么是乐观锁?
1,悲观锁是利用数据库本身的锁机制来实现,会锁记录。实现的方式为:select * from t_table where id = 1 for update乐观锁是一种不锁记录的方式,采用 CAS (compare and swap/set)模式,采用version字段作为判断是否相同的依据每次对数据库进行更新操作,都会对version + 1,这样提交更新操作的时候,如果version字段已经被更改了,则数据更新失败。伪代码:update tbl_xxx set xxx = xxx + 1,原创 2020-12-16 13:34:23 · 115 阅读 · 0 评论 -
57.什么是事务的传播特性?Spring支持的特性有哪些?
文章目录什么是事务的传播?Spring支持的事务传播特性什么是事务的传播?首先我们要明确,事务具有原子性,要么都成功,要么都失败。假如说,你的service层中,A方法是一个事务操作,B方法是一个事务操作,A方法中调用了 B 方法,这就设计到了事务传播。两个操作,要么都成功,要么都失败。这时必须保证在这两个事务是处在同一个事务中,否则无法保证事务的一致性。Spring支持的事务传播特性在spring中,针对传播特性的多种配置,我们大多数情况下都是使用的:PROPGATION_REQUIRED(原创 2020-12-16 13:34:07 · 125 阅读 · 0 评论 -
56. Spring的bean是线程安全的吗?
说这个问题,首先需要知道在什么环境下会造成线程安全问题。线程安全出现的条件:需要有多个线程多个线程同时操作共享资源资源具有状态性由于Spring的bean是单例的,并且每个http请求到servlet的时候,都是一个线程,所以bean处在可能造成线程安全问题的环境的,那么spring的bean是线程安全的吗?这样的话,spring 的 bean 是否存在线程安全问题,主要就要看是否具有状态性了。spring的bean基本不会对数据进行操作,从这个层面来说,它是无状态的,也就是没有通过数据的原创 2020-12-16 13:33:48 · 434 阅读 · 0 评论 -
55.Spring的bean的作用域有哪些?
默认是 singleton 单例模式,创建的对象是单例的prototype 多个的,每次容器调用bean的时候都会创建一个新的对象。request,每次http请求都会创建一个bean对象session,同一个session共享一个bean对象...原创 2020-12-16 13:33:35 · 215 阅读 · 0 评论 -
53.如何实现动态代理?
SpringAOP(面向切面编程),AOP分离核心业务逻辑和非核心业务逻辑,其背后动态代理的思想。主要实现方式有两种:JDK 动态代理,基于接口实现基于 cglib 的动态代理,是基于继承当前类来实现的(所以,使用cglib代理的时候,被代理的类不能是final的)。在Spring 中,默认会根据代码的关系进行自动切换,当我们基于接口方式编程的时候,默认会采用JDK的动态代理,如果不是接口的方式,就会采用cglib的方式进行代理。代码如何写呢?基于JDK实现动态代理:传入的参数需要是父类接口原创 2020-12-16 13:32:14 · 78 阅读 · 0 评论 -
52.什么是反射?可以解决什么问题?
反射是指程序在运行状态中,可以对任意一个类,都能获取到这个类的所有的属性和方法,可以对任意一个对象,都可以调用它的任意一个方法和属性反射是一种能力,一种在程序运行时,动态获取当前类对象的所有属性和方法的能力,可以动态执行方法,给属性赋值等操作的能力Class 代表的就是所有的字节码对象的抽象类反射,可以让java程序具有动态性这种动态获取类信息以及调用对象方法的功能成为反射在java中,Class类就是关键的API这种能力可以可以带来很多好处,许多框架在实现的别后都使用了反射,都采用了反射的方式原创 2020-12-16 13:31:59 · 262 阅读 · 0 评论 -
51.什么是死锁,如何防止死锁?
文章目录1. 什么是死锁?2. 如何防止死锁?1. 什么是死锁?死锁最初由一个悲惨的故事说起,话说一群哲学家一起聚餐,然后在每个人的左边和右边分别放着一根筷子,而只有同时抓到两根筷子,才能正常吃饭,于是,不幸的故事发生了,每位哲学家都只抓到一根筷子,且都不愿意释放手中的筷子,于是,最终一桌的饭菜就这么浪费了。不知道这个故事是谁发明的,但确实形象说明了死锁的情况。转换到线程的场景,就是线程A持有独占锁资源a,并尝试去获取独占锁资源b同时,线程B持有独占锁资源b,并尝试去获取独占锁资源a这样线程A和原创 2020-12-16 13:31:44 · 96 阅读 · 0 评论 -
50. 说一说TCP和UDP的区别
TCP和UDP都是传输层的协议。传输层是7层网络协议中的一层7层网络协议TCP是提供可靠的网络传输协议,传输前需要建立连接,经过三次握手建立连接,面向字节流传输,传输速率较慢(相较于UDP来说),断开连接的时候要经过四次挥手。UDP不保证可靠传输,无需建立连接,传输数据使用报文的形式传输,传输效率较高。...原创 2020-12-16 13:31:27 · 94 阅读 · 0 评论 -
49.深拷贝和浅拷贝的区别
深拷贝: 除了对象本身被复制外,对象所包含的成员变量都会被复制,包括引用类型的变量。 相当于,从要复制对象的本身能找到的对象,都会被新复制一份。浅拷贝: 只复制对象本身,对象的引用类型的变量,只是复制引种的地址值,不会复制出一个新的对象。相当于,只是在表面浅浅的复制了一层。内部都是已有的东西举个例子:比如说填一个坑, 深拷贝就是将那个坑全部填满,浅拷贝就是在上边打了一层,表面看上去都是填满了,但是深拷贝是充实的,浅拷贝是空虚的。深拷贝浅拷贝...原创 2020-12-16 13:31:04 · 86 阅读 · 0 评论 -
48. synchronized 和 lock 的区别
这个主要是想考 synchronized 和 lock 锁代码块(方法)的不同作为位置不同synchronized 不仅可以锁代码块,还可以给方法加锁,给变量加锁lock 只能对代码块加锁获取和释放锁的方式不同。synchronized 不需要手动释放锁,发生异常的时候会自动解锁,执行完成后也会自动释放锁。lock 需要自己手动加锁,手动释放锁。 一旦使用的时候加锁之后忘记释放锁,程序将一致持有这把锁,极有可能出现死锁。所以一般在加锁之后,都会跟上一个 try{} finally{}原创 2020-12-16 13:30:12 · 80 阅读 · 0 评论 -
47. synchronized和volatile的区别
这个想考的主要就是 修饰变量的作用的不同吧从三方面来说:变量的内存可见性是否会阻止指令重排序能否保证操作的原子性线程是否阻塞名称内存可见性指令重排序原子性线程是否阻塞synchronized可见会重排序可以保证会阻塞volatile可见不会重排序无法保证不会阻塞volatile 底层使用 CAS算法 不会造成线程的阻塞。...原创 2020-12-13 15:09:36 · 89 阅读 · 0 评论 -
46.事务的隔离级别
文章目录事务的四个隔离级别1. 数据库操作的三个问题1. 脏读不可重复读幻读事务的隔离级别 - 解决不同程度的问题事务的四个隔离级别事务有四个隔离级别,可以解决3层面的问题1. 数据库操作的三个问题先说这三个问题吧:问题层次依次递增脏读不可重复读幻读1. 脏读比如说:A事务正在操作一条数据,A事务对这个数据进行了修改,但是这时候事务并没有提交,此时,B事务拿到了修改后的数据。但是A事务发生了错误,进行回滚,此时B拿的数据并不是数据库中真正的数据,这就是脏读。不可重复读在一个事务内原创 2020-12-13 15:09:49 · 108 阅读 · 0 评论 -
45.事务的特点
文章目录事务的四大特性原子性一致性隔离性持久性这时候怎么都逃不开事务的4大特性:- 原子性- 一致性- 隔离性- 持久性事务的四大特性原子性每个事务都相当于一个原子操作,同生共死,一个事务中的操作,要么都成功,要么都失败。一致性事务的一致性始值,数据库中的数据在事务操作前后都必须满足约束的规则。换句话说就是:事务中的操作也必须遵守规则。比如说:一个转账操作,A 转账给 B,那么转账前后 A B 两个账户的余额总和应该是相等的。这个一致性等多的说的是逻辑上的一致。隔离性一个事务的执原创 2020-12-11 23:57:21 · 70 阅读 · 0 评论 -
43.左连接,右连接,内连接,如何编写SQL,他们的区别是什么?
左连接、右连接、内连接的区别内连接:只有两个表都满足的条件才会被展示出来。原创 2020-12-11 23:57:04 · 67 阅读 · 0 评论 -
42.说说常用的聚合函数有哪些及作用?
名称描述count求出全部的记录数sum计算总和avg平均值max最大值min最小值原创 2020-12-11 23:56:17 · 1035 阅读 · 0 评论 -
41. 谈谈数据库设计的三大范式及反范式
数据库的三大范式列不可分要有主键非主键字段不能相互依赖(不能有传递依赖)反范式设计:(第三范式)为什么会有反范式设计?原因一:提高查询效率(读多写少)为了提高查询效率,可以通过冗余一个商品名称字段,这个可以将原先的表关联查询转换为单表查询原因二:保存历史快照信息比如,里面需要包含收货人的各项信息,如姓名,电话,地址等等,这些都属于历史快照,需要冗余保存起来,不能通过保存用户地址ID去关联查询,因为用户的收货人信息可能会在后期发生变更...原创 2020-12-11 23:55:59 · 162 阅读 · 0 评论 -
40.什么是序列化?
序列化是为了保持对象在内存中的状态,并且可以把保存的对象状态再读出来。序列化是一种处理对象流的机制,解决对象在传输时候的问题。什么时候需要用到java序列化?1,需要将内存的对象状态保存到文件中2,需要通过socket通信进行对象传输时3,我们将系统拆分成多个服务之后,服务之间传输对象,需要序列化...原创 2020-12-11 23:55:44 · 67 阅读 · 0 评论 -
39.Iterator和ListIterator的区别?
IteratorListIterator遍历对象set、listlist方向单向双向ListIterator继承与Iterator接口原创 2020-12-11 23:55:31 · 102 阅读 · 0 评论 -
38. 谈谈对MVC的理解(重要)
MVC是对Web层做了进一步的划分,更加细化Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。View(视图) - 视图代表模型包含的数据的可视化,比如HTML,JSP,Thymeleaf,FreeMarker等等Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开,目前的技术代表是Servlet,Controller常见的MVC框架有,Struts1,Struts2,SpringMVC.原创 2020-12-11 23:55:01 · 142 阅读 · 0 评论 -
37.谈谈三层架构
三层架构:Web层:负责与用户交互并对外提供服务接口业务逻辑层:实现业务逻辑模块数据存取层:将业务逻辑层处理的结果持久化,方便后续查询每个层都有自己的框架:WEB层:SpringMVC,Struts2,Struts1业务逻辑层:Spring数据持久层:Hibernate,MyBatis,SpringDataJPA,SpringJDBC...原创 2020-12-11 23:54:40 · 79 阅读 · 0 评论 -
36.转发和重定向的区别
转发:发生在服务器内部的跳转,所以,对于客户端来说,至始至终就是一次请求,所以这期间,保存在request对象中的数据可以传递重定向:发生在客户端的跳转,所以,是多次请求,这个时候,如果需要在多次请求之间传递数据,就需要用session对象...原创 2020-12-11 23:54:24 · 58 阅读 · 0 评论 -
35.描述Session跟Cookie的区别(重要)
1,存储的位置不同Session:存在服务端Cookie:存在客户端存储的数据格式不同Session:value为对象,Object类型Cookie:value为字符串,如果我们存储一个对象,这个时候,就需要将对象转换为JSON存储的数据大小Session:受服务器内存控制Cookie:一般来说,最大为4k生命周期不同Session:服务器端控制,默认是30分钟,注意,当用户关闭了浏览器,session并不会消失Cookie:客户端控制,其实是客户端的一个文件,分两种情况1,默认的是原创 2020-12-11 23:54:08 · 103 阅读 · 1 评论 -
34.JSP的4大域对象
四大域对象ServletContext context域HttpSession session域HttpServletRequet request域PageContext page四大域对象的作用范围page域: 只能在当前jsp页面使用 (当前页面)request域: 只能在同一个请求中使用 (转发才有效,重定向无效)session域: 只能在同一个会话(session对象)中使用 (私有的,多个请求和响应之间)context域: 只能在同一个web应用中使用 (全局的)..原创 2020-12-18 09:00:20 · 99 阅读 · 0 评论 -
33. 描述JSP和Servlet的区别
JSP本质就是一个ServletJSP的工作原理:JSP->翻译->Servlet(java)->编译->Class(最终运行的文件)在现在的开发种,JSP 一般用作视图,不会有太多的java代码。 Servlet 主要用户控制逻辑,当作控制层使用...原创 2020-12-10 23:50:11 · 77 阅读 · 0 评论 -
32.谈谈Servlet的生命周期
Servlet是单实例的,这个很重要!生命周期的流程:创建对象–>初始化–>service()–>doXXX()–>销毁创建对象的时机:默认是第一次访问该Servlet的时候创建也可以通过配置web.xml,来改变创建时机,比如在容器启动的时候去创建,DispatcherServlet(SpringMVC前端控制器)就是一个例子<load-on-startup>1</load-on-startup>执行的次数对象的创建只有一次,单例初始化原创 2020-12-10 23:49:49 · 64 阅读 · 0 评论 -
31.谈谈Ajax的工作原理
主要有三个要素:异步交互XMLHttpRequest对象回调函数早期,预计是以XML为主要的传输数据格式,所以Ajax的最后一个字母就是代表XML的意思,不过现在基本是json为主。原创 2020-12-10 23:49:27 · 83 阅读 · 0 评论 -
30.我们来谈谈Java的类加载机制
文章目录1. 什么是类的加载机制?1. 什么是类的加载机制?JVM使用Java类的流程如下:1,Java源文件----编译---->class文件2,类加载器ClassLoader会读取这个.class文件,并将其转化为java.lang.Class的实例。有了该实例,JVM就可以使用他来创建对象,调用方法等操作了。那么ClassLoader是以一种什么机制来加载Class的?这就是我们要谈的类的加载机制!搞清楚这个问题,首先要知道,我们用到的Class文件都有哪些来源?Java原创 2020-12-10 23:48:42 · 101 阅读 · 0 评论 -
29. 谈谈你对ThreadLocal的理解
ThreadLocal解决了什么问题?ThreadLocal作用:为每个线程创建一个副本实现在线程的上下文传递同一个对象,比如connection理解ThreadLoal 变量,它的基本原理是,同一个 ThreadLocal 所包含的对象(对ThreadLocal< StringBuilder >而言即为 StringBuilder 类型变量),在不同的 Thread 中有不同的副本(实际上是不同的实例):因为每个 Thread 内有自己的实例副本,且该副本只能由当前 Thread原创 2020-12-10 17:22:07 · 127 阅读 · 0 评论 -
28.谈谈你对线程安全的理解?
线程安全的描述是:当多个线程访问一个对象时,如果不用进行额外的同步控制或其他的协调操作,调用这个对象的行为都可以获得正确的结果,我们就说这个对象是线程安全的如何做到线程安全?实现线程安全的方式有多种,其中在源码中常见的方式是,采用synchronized关键字给代码块或方法加锁。那么,我们开发中,如果需要拼接字符串,使用StringBuilder还是StringBuffer?使用 StringBuilder还是StringBuffer 是需要看场景的:如果字符串的拼接都是在方法内部进行的,都是使原创 2020-12-10 17:21:41 · 129 阅读 · 0 评论 -
27. JDK提供的线程池有哪些?实际开发我们该怎么使用?
1,JDK通过接口ExecutorService来表示线程池,通过工具类Executors来创建多种线程池对象Executors.newSingleThreadExecutor();Executors.newFixedThreadPool(2);Executors.newCachedThreadPool();Executors.newScheduledThreadPool(2);2,各种线程池的特点如下:newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工原创 2020-12-10 17:21:12 · 139 阅读 · 0 评论 -
26.谈谈Sleep和wait的区别
1,所属的类不同:sleep方法是定义在Thread上wait方法是定义在Object上2,对于锁资源的处理方式不同sleep不会释放锁wait会释放锁3,使用范围:sleep可以使用在任何代码块wait必须在同步方法或同步代码块执行4,与wait配套使用的方法void notify()Wakes up a single thread that is waiting on this object’s monitor.译:唤醒在此对象监视器上等待的单个线程void notif原创 2020-12-10 17:18:25 · 128 阅读 · 0 评论 -
23.创建线程的三种方式
创建线程的3种方式:集成Thread类实现Runable接口实现Callable接口,可以接收返回值,能抛异常但实际后两种,更准确的理解是创建了一个可执行的任务,要采用多线程的方式执行,还需要通过创建Thread对象来执行,比如 new Thread(new Runnable(){}).start();这样的方式来执行。在实际开发中,我们通常采用线程池的方式来完成Thread的创建,更好管理线程资源。本质上来说创建线程的方式就是继承Thread,就是线程池,内部也是创建好线程对象来执行任务原创 2020-12-10 17:17:31 · 67 阅读 · 0 评论 -
25.请描述线程的生命周期
线程共有6种状态:new,runnable,blocked,waiting,timed waiting,terminated1,当进入synchronized同步代码块或同步方法时,且没有获取到锁,线程就进入了blocked状态,直到锁被释放,重新进入runnable状态2,当线程调用wait()或者join时,线程都会进入到waiting状态,当调用notify或notifyAll时,或者join的线程执行结束后,会进入runnable状态3,当线程调用sleep(time),或者wait(ti原创 2020-12-10 17:18:49 · 153 阅读 · 0 评论 -
24. 一个普通main方法的执行,是单线程模式还是多线程模式?为什么?
因为java有个重要的特性,叫垃圾自动回收机制,所以答案是多线程,这里面有两部分:主线程(用户线程)垃圾回收线程GC(守护线程)同时存在。原创 2020-12-09 18:45:14 · 263 阅读 · 0 评论 -
22.throw和throws的区别
throw,作用于方法内,用于主动抛出异常,结束方法throws, 作用于方法声明上,声明该方法有可能会抛些某些异常,只是可能会抛出异常,实际运行时并不一定会抛出异常。更多的作用时声明。原创 2020-12-09 18:44:18 · 80 阅读 · 0 评论 -
21. 罗列常见的几个运行时异常
运行时异常算数异常空指针异常类型转换异常数组下标越界连接异常超时原创 2020-12-09 18:43:48 · 147 阅读 · 0 评论