成都网站建设上市,白城网络推广,wordpress 体育主题公园,网站推广服务合同判决书以下是我记录的一些重点问题和面试中被问到没答上来的问题#xff0c;包括java基础、关系型数据库、Redis、计算机网络、Spring、Java多线程、vue 问题目录 1.fail-safe和fail-fast2.四引用3.explain字段重要内容4.maven三大生命周期5.MYSQL 创建修改表6.数据库三范式7.Strin…以下是我记录的一些重点问题和面试中被问到没答上来的问题包括java基础、关系型数据库、Redis、计算机网络、Spring、Java多线程、vue 问题目录 1.fail-safe和fail-fast2.四引用3.explain字段重要内容4.maven三大生命周期5.MYSQL 创建修改表6.数据库三范式7.String、StringBuffer、StringBuilder区别8.常见的异常类9.IO流10.Redis应用场景高频问各种数据类型的应用场景11.查询优化12.类初始化顺序13.HTTPS解决了HTTP什么问题14.Queue中poll和remove区别15.怎么确保一个集合不能被修改16.final用于函数参数17.SQL执行顺序(高频)18.CAS如何解决ABA问题19.JVM调优不要觉得JVM调优不会问真的会问还不止一次。可以提前准备一个调优的例子面试时讲20.JVM有哪些核心指标合理范围是多少21.JVM优化步骤22.HashMap为什么线程不安全23.AOF和RDB相比优缺点AOF和RDB是Redis里面试官经常喜欢问的24.MYSQL的where里的执行顺序25.MyBatis缓存26.Spring拦截器和过滤器区别27.Vue生命周期见vue官网28.Controller如何接受数组参数29.Spring常用注解30.为什么要少用局部变量 局部变量缺点31.String创建对象系列32. socket怎么建立连接的33. vue2和vue3区别 1.fail-safe和fail-fast
fail-safe 安全失败concurrent包下的容器都是该机制可以在多线程下并发修改 fail-fast快速失败如果Java集合在使用迭代器遍历的过程中进行了增删操作则会抛出异常即使没有并发也会抛出
2.四引用
强引用 A anew A GC永远不会回收这种对象 软引用 有用但是非必须对象 在发送OOM时会把这些对象进行二次回收 弱引用 非必须对象 被弱引用关联的对象只能生存到下次GC前 虚引用 最弱的一种引用关系 存在的目的就是能在这个对象被GC时收到一个系统通知
3.explain字段重要内容
id标识符 type表的连接类型
4.maven三大生命周期
1.clean清理项目 pre-clean执清理前需要完成的工作– clean(清除上次构建过程中生成的文件比如编译后的class文件)—post-clean:(执行清理后需要完成的工作) 2.default构建项目 Default生命周期是Maven生命周期中最重要的一个绝大部分工作都发生在这个生命周期中。 其中比较重要和常用的阶段 validate检测项目结构是否正常必要的配置文件是否存在 initialize做构建前的初始化操作比如初始化参数创建必要目录 generate-sources产生在编译过程中需要的源代码 process-sources处理源代码比如过滤值 compile编译项目源代码 process-classes产生编译过程中生成的文件 generate-test-sources产生编译过程中测试相关的代码 process-test-sources处理测试代码 generate-test-resources产生测试中资源在classpath中的包 process-test-resources复制并处理资源文件至目标测试目录 test-compile 编译测试源代码。 process-test-classes 产生编译测试代码过程的文件test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。 prepare-package 处理打包前需要初始化的准备工作 package 接受编译好的代码打包成可发布的格式如 JAR 。 pre-integration-test 做好集成测试前的准备工作比如集成环境的参数设置 integration-test 集成测试 post-integration-test 完成集成测试前的准备工作比如集成环境的参数设置 verify 检测测试后的包是否完好 install 将包安装至本地仓库以让其它项目依赖。 deploy 将最终的包复制到远程的仓库以让其它开发人员与项目共享。 运行任何一个阶段的时候它前面的所有阶段都会被运行这也就是为什么我们运行mvn install 的时候代码会被编译测试打包。此外Maven的插件机制是完全依赖Maven的生命周期的因此理解生命周期至关重要。
3.site生项目站点 pre-site执行一些需要在生成站点文档之前的操作 site生成项目的站点文档 post-site执行一些需要在生成站点文档之后完成的工作并为部署做准备 site-destory将生成的站点文档部署到特定服务器上 这里经常用到的是site阶段和site-deploy阶段用以生成和发布Maven站点这可是Maven相当强大的功能Manager比较喜欢文档及统计数据自动生成很好看。
5.MYSQL 创建修改表
如何创建表在mysql中? 方法:使用关键字create. 例子:create table demo.person { age int , weight int, hobby varchar } 如何修改表结构? 场景1.修改字段 方法1:使用关键词alter 、change,可以改变表字段的名称和类型,但是转换的类型有限制,不能从数值类型转换为字符类型. 例子:alter table demo.person change age year int ; 方法2:使用关键词alter 、modify,可以改变类型,但是转换的类型有限制,不能从数值类型转换为字符类型. 例子:alter table demo.person modify age int ; 场景2.新增字段 方法1:使用关键词alter 、add,可以新增表字段; 例子:alter table demo.person add father varchar
6.数据库三范式
1NF属性不可再分 2NF满足第一范式且不存在部分依赖即非主属性必须完全依赖于主属性。(主属性即主键完全依赖是针对于联合主键的情况非主键列不能只依赖于主键的一部分) 3NF满足第二范式且不存在传递依赖即非主属性不能与非主属性之间有依赖关系非主属性必须直接依赖于主属性不能间接依赖主属性。
7.String、StringBuffer、StringBuilder区别
String值创建后不能修改任何对String的修改都会引发新的String对的生成 StringBuffer跟String类似但是值可以修改使用synchronized来保证线程安全 StringBuilderStringBuffer的非线程安全版本
8.常见的异常类
NullPointerException NumberFormatException字符转换异常 IOExceptionIO异常 FileNotFoundException
9.IO流 10.Redis应用场景高频问各种数据类型的应用场景
缓存 点赞、排行榜、计数器等功能 共享session 分布式锁 消息中间件
11.查询优化
避免走全表 1.在where order by的列上建立索引 2.避免null判断 3.少使用计算、函数、类型转换字符串单引号 4.少用 5.少用or
12.类初始化顺序
父类静态变量静态代码块-》子类静态变量-》父类非静态变量–》父类构造器–》子类非静态变量–》子类构造器
13.HTTPS解决了HTTP什么问题
HTTP明文传输安全上有窃听、篡改、冒充风险 HTTPS通过混合加密来解决窃听 摘要算法来解决篡改 数字证书解决冒充
14.Queue中poll和remove区别
1offer()和add()区别 增加新项时如果队列满了add会抛出异常offer返回false。 2poll()和remove()区别 poll()和remove()都是从队列中删除第一个元素remove抛出异常poll返回null。 3peek()和element区别 peek()和element用于查询队列头部元素为空时element抛出异常peek返回null。
15.怎么确保一个集合不能被修改
采用Collections包下的unmodifiableMap方法通过这个方法返回的map,是不可以修改的。他会报 java.lang.UnsupportedOperationException错。 同理Collections包也提供了对list和set集合的方法。 Collections.unmodifiableList(List) Collections.unmodifiableSet(Set)
16.final用于函数参数
java中方法用final修饰参数的作用 在方法参数前面加final关键字就是为了防止数据在方法体重被修改。 主要分为两种情况第一用final修饰基本数据类型第二用final修饰引用数据类型。 第一种情况修饰基本数据类型这时参数的值在方法体内是不能被修改的即不能被重新赋值。否则编译就不通过。 第二种情况修饰引用类型。这时参数变量所引用的对象是不能被改变的。但是对于引用数据类型如果修改其属性的话是完全可以的。 所以final这个关键字想用的话就用基本数据类型还是很有作用的。
final变量 对于基本类型使用final它就是一个常量数值恒定不变 对于对象引用使用final使得引用恒定不变一旦引用被初始化指向一个对象就无法再把 它改为指向另一个对象。然而对象自身却是可以被修改的java并没有提供使任何对象恒定不变的途径。这一限制同样也使用数组它也是对象。
17.SQL执行顺序(高频)
fromonjoinwheregroup by(开始使用select中的别名后面的语句中都可以使用)avg,sum…havingselectdistinctorder bylimit
18.CAS如何解决ABA问题
什么是CAS问题 当执行campare and swap会出现失败的情况。例如一个线程先读取共享内存数据值A随后因某种原因线程暂时挂起同时另一个线程临时将共享内存数据值先改为B随后又改回为A。随后挂起线程恢复并通过CAS比较最终比较结果将会无变化。这样会通过检查这就是ABA问题。 在CAS比较前会读取原始数据随后进行原子CAS操作。这个间隙之间由于并发操作最终可能会带来问题。 如何解决 设置版本号
19.JVM调优不要觉得JVM调优不会问真的会问还不止一次。可以提前准备一个调优的例子面试时讲
通常来说我们的 JVM 参数配置大多还是会遵循 JVM 官方的建议例如
-XX:NewRatio2年轻代:老年代1:2-XX:SurvivorRatio8eden:survivor8:1堆内存设置为物理内存的3/4左右等等
20.JVM有哪些核心指标合理范围是多少
jvm.gc.time每分钟的GC耗时在1s以内500ms以内尤佳 jvm.gc.meantime每次YGC耗时在100ms以内50ms以内尤佳 jvm.fullgc.countFGC最多几小时1次1天不到1次尤佳 jvm.fullgc.time每次FGC耗时在1s以内500ms以内尤佳
21.JVM优化步骤
1.分析和定位当前系统的瓶颈 1CPU 1CPU指标
查看占用CPU最多的进程查看占用CPU最多的线程查看线程堆栈快照信息分析代码执行热点查看哪个代码占用CPU执行时间最长查看每个方法占用CPU时间比例
2JVM 内存指标
查看当前 JVM 堆内存参数配置是否合理查看堆中对象的统计信息查看堆存储快照分析内存的占用情况查看堆各区域的内存增长是否正常查看是哪个区域导致的GC查看GC后能否正常回收到内存 3JVM GC指标查看每分钟GC时间是否正常查看每分钟YGC次数是否正常查看FGC次数是否正常查看单次FGC时间是否正常查看单次GC各阶段详细耗时找到耗时严重的阶段查看对象的动态晋升年龄是否正常 2、确定优化目标 定位出系统瓶颈后在优化前先制定好优化的目标是什么例如将FGC次数从每小时1次降低到1天1次将每分钟的GC耗时从3s降低到500ms将每次FGC耗时从5s降低到1s以内
22.HashMap为什么线程不安全
JDK1.8 中由于多线程对HashMap进行put操作调用了HashMap#putVal()具体原因假设两个线程A、B都在进行put操作并且hash函数计算出的插入下标是相同的当线程A执行完第六行代码后由于时间片耗尽导致被挂起而线程B得到时间片后在该下标处插入了元素完成了正常的插入然后线程A获得时间片由于之前已经进行了hash碰撞的判断所有此时不会再进行判断而是直接进行插入这就导致了线程B插入的数据被线程A覆盖了从而线程不安全。
23.AOF和RDB相比优缺点AOF和RDB是Redis里面试官经常喜欢问的
AOF 用 AOF 日志的方式来恢复数据其实是很慢的因为 Redis 执行命令由单线程负责的而 AOF 日志恢复数据的方式是顺序执行日志里的每一条命令如果 AOF 日志很大这个「重放」的过程就会很慢了。
RDB 在 Redis 恢复数据时 RDB 恢复数据的效率会比 AOF 高些因为直接将 RDB 文件读入内存就可以不需要像 AOF 那样还需要额外执行操作命令的步骤才能恢复数据。
24.MYSQL的where里的执行顺序
从左到右
25.MyBatis缓存
一级缓存的作用域是一个sqlsession内 更新清除一级缓存时也会清除二级缓存 一级缓存默认开启二级缓存作用域是针对mapper进行缓存 二级缓存需要手动开启
26.Spring拦截器和过滤器区别
过滤器Filter用于属性甄别对象收集不可改变过滤对象的属性和行为 拦截器Interceptor用于对象拦截行为干预可以改变拦截对象的属性和行为
过滤器和拦截器触发时机不一样过滤器是在请求进入容器后但请求进入servlet之前进行预处理的。请求结束返回也是是在servlet处理完后返回给前端之前。拦截器可以获取IOC容器中的各个bean而过滤器就不行因为拦截器是spring提供并管理的spring的功能可以被拦截器使用在拦截器里注入一个service可以调用业务逻辑。而过滤器是JavaEE标准只需依赖servlet api 不需要依赖spring。过滤器的实现基于回调函数。而拦截器代理模式的实现基于反射Filter是依赖于Servlet容器属于Servlet规范的一部分而拦截器则是独立存在的可以在任何情况下使用。Filter的执行由Servlet容器回调完成而拦截器通常通过动态代理反射的方式来执行。Filter的生命周期由Servlet容器管理而拦截器则可以通过IoC容器来管理因此可以通过注入等方式来获取其他Bean的实例因此使用会更方便。
拦截器本质上是面向切面编程AOP符合横切关注点的功能都可以放在拦截器中来实现主要的应用场景包括
登录验证判断用户是否登录。权限验证判断用户是否有权限访问资源如校验token日志记录记录请求操作日志用户ip访问时间等以便统计请求访问量。处理cookie、本地化、国际化、主题等。性能监控监控请求处理时长等。通用行为读取cookie得到用户信息并将用户对象放入请求从而方便后续流程使用还有如提取 Locale、Theme信息等只要是多个处理器都需要的即可使用拦截器实现
过滤器应用场景
过滤敏感词汇防止sql注入设置字符编码URL级别的权限访问控制压缩响应信息
27.Vue生命周期见vue官网
创建前、创建后、载入前、载入后、更新前、更新后、销毁前、销毁后。
28.Controller如何接受数组参数
对于GET 后端用RequestParam
GetMapping(/listtest)
public Integer test(RequestParam ListInteger arr){for (Integer i : arr) {System.out.println(i);}return 1;}对于POST
使用RequestBody
PostMapping(/postlist)
public String test2(RequestBody ListInteger arr){for (Integer i : arr) {System.out.println(i);}return hello;
}29.Spring常用注解
Value 用于注入application.yml定义的属性
public class A{Value(${push.start:0}) 如果缺失默认值为0private Long id;
}RestController
组合Controller 和Response BodyRequestParam
获取request请求的参数值public ListCopperVO getOpList(HttpServletRequest request,RequestParam(value pageIndex, required false) Integer pageIndex,RequestParam(value pageSize, required false) Integer pageSize) {}ResponseBody 支持将返回值放在response体内而不是返回一个页面。比如Ajax接口可以用此注解返回数据而不是页面。此注解可以放置在返回值前或方法前
PathVariable 用来获得请求url中的动态参数
Import(Config1.class) 导入Config1配置类里实例化的bean
Configuration
public class CDConfig {Bean // 将SgtPeppers注册为 SpringContext中的beanpublic CompactDisc compactDisc() {return new CompactDisc(); // CompactDisc类型的}
}Configuration
Import(CDConfig.class) //导入CDConfig的配置
public class CDPlayerConfig {Bean(name cDPlayer)public CDPlayer cdPlayer(CompactDisc compactDisc) { // 这里会注入CompactDisc类型的bean// 这里注入的这个bean是CDConfig.class中的CompactDisc类型的那个beanreturn new CDPlayer(compactDisc);}
}30.为什么要少用局部变量 局部变量缺点
局部变量太多会导致GC多 因为局部变量会被频繁回收 根据迪米特法则应减少陌生的类作为局部变量会增加耦合 局部变量位于jvm栈递归层数多时可能引起栈溢出 局部变量是线程私有线程封闭的
31.String创建对象系列
String str“a”b创建了几个对象 一个 String常量的累加操作中编译器会进行优化如果是 String str “a” “b”,那相当于String str “ab”; 常量池中会创建一个ab的对象 String str new String(“a”) new String(“b”)几个 在堆中创建了三个字符串对象a字符串对象b字符串对象ab字符串对象在堆中的常量池中创建了2个字符串对象a字符串对象b字符串对象一共创建了5个字符串对象。
Sting sa和String snew String(“a”)区别 两个语句都会先去字符串常量池检查是否存在a 如果有则直接使用 如果没有则在常量池中创建 a 对象 另外String s new String(“a”)还会在堆离创建一个 a 的对象实例
所以前者被后者包含
32. socket怎么建立连接的
建立TCP连接过程 调用系统函数 socket ()创建并绑定一个 IP 地址和端口。 调用系统函数 listen ()进行地址监听。此时可以通过 netstate 命令查看对应端口是否被监听。 调用系统函数 accept ()从内核获取客户端的连接如果没有客户端进行连接则会阻塞等待。 最后调用完成需要close() 连接
33. vue2和vue3区别