秋招面经(二)

三四个答得不好,应该多加点自己的理解,发现自己基础答得不好,深入答得好,
有的时候不是很了解面试官的意图
面试了半个小时,有些不太记得,

java三大特性,分别是怎么实现的

封装:指的是属性私有化,根据需要提供setter和getter方法来访问属性,即隐藏具体属性和实现细节,仅对外开放接口,控制程序中属性的访问级别,增强安全性和简化编程,不必在意具体实现细节,而只是通过外部接口即可访问类的成员
继承:将多个相同的属性和方法提取出来,新建一个父类,java中一个类只能继承一个父类,且只能继承访问权限非private的属性和方法,子类重写父类中的方法,命名与父类中同名的属性,代码复用
多态:多态可以分为两种:设计时多态和运行时多态。
设计时多态:即重载,是指Java允许方法名相同而参数不同(返回值可以相同也可以不相同)。
运行时多态:即重写,是指Java运行根据调用该方法的类型决定调用哪个方法。
增加代码灵活度

一.Java中应尽量减少继承关系,以降低耦合度。
二.使用多态时,父类在在调用方法时,优先调用子类的方法。如果子类没有重写父类的方法,则再调用父类的方法。
三.Java三大特性是Java最基础的也是最重要的,应当牢记(面试中也是经常考的)。

多线程的核心

原子性:一系列操作要么成功,要么失败,不存在其中的一部分成功了,一部分失败,和数据库的原子性差不多
可以说一下atomic的用法
可见性:线程会存一份主内*享的数据,这样就不用每次用到都去主内存中去获取了,在自己本地就有一份,加快处理速度,但是这样会导致,对同一个数据的修改,线程自己修改完,并更新到主内存中,并没有告知其它已经在使用该数据的线程,你们本地内存中的那份数据已经过期无效了,就会出现下面的情况,明明是两次加1操作,但数据只增加了1
.秋招面经(二)
当变量被volatile修饰时,线程对变量的写操作都会立马把刷新到主内存中去,并且还会让所有线程中缓存的该变量值无效,必须重新去主内存中获取

顺序性:顺序初始化对应的值,JVM会允许指令的重排序,比如这里的a和b赋值是不相关的,这里改变两者的顺序不会对程序的结果造成影响,但是c的赋值与a和b相关,它肯定是要放在a和b赋值之后,不然会影响到执行结果,JVM会在保证单线程执行结果不变的情况,允许指令的重排序
volatile修饰的属性可以禁止JVM对其指令的重排

多线程池的使用

结合自己编写过的多线程池实现数据库连接池
https://blog.****.net/yan88888888888888888/article/details/83927609

SpringBoot和SpringMVC的区别

基础都是Spring的IOC和AOP
SpringMVC是基于servlet的一个MVC框架,主要解决WEB开发问题,
因为Spring的配置非常复杂,各种XML、 JavaConfig、hin处理起来比较繁琐。于是为了简化开发者的使用,从而创造性地推出了Spring boot,约定优于配置,简化了spring的配置流程。

spring boot只是一个配置工具,整合工具,辅助工具.
springmvc是框架,项目中实际运行的代码

Spring Boot只是承载者,辅助你简化项目搭建过程的。如果承载的是WEB项目,使用Spring MVC作为MVC框架,那么工作流程和你上面描述的是完全一样的,因为这部分工作是Spring MVC做的而不是Spring Boot。

SpringMVC常用的注解

老生常谈了
https://blog.****.net/qq_42337039/article/details/108268521

SpringMVC和三层架构

不是一个概念!!!
三层架构是一种分层思想,将开发模式分为了这三层,每个人根据自己的专长,开发不同的模块
Dao:数据访问层
Service:业务处理层
Web层(J2ee的内容)Request和response

MVC是一种设计模式,目的是让HTML代码和业务逻辑代码分开,让代码看起来更加清晰,便于开发。
M:model
V:view
C:controller

SpringMVC运行流程

老生常谈,但这里要是用自己的理解说是请求映射到controller层的@RequestMapping,然后注入service并实现service方法,注入dao层数据并返回会不会更好;
我回答的是dispatchter那套官方
https://blog.****.net/qq_36761831/article/details/89053314

@Controller和RestController的区别

@RestController注解相当于@ResponseBody + @Controller合在一起的作用
如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,或者html,配置的视图解析器 InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。
如果需要返回到指定页面,则需要用 @Controller配合视图解析器InternalResourceViewResolver才行。
如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解

线程锁主要有哪些

我回答的是自旋锁,偏向锁,轻量级锁,重量级锁
应该想问的是synchronize和lock
Synchronized,它就是一个:非公平,悲观,独享,互斥,可重入的重量级锁
ReentrantLock,它是一个:默认非公平但可实现公平的,悲观,独享,互斥,可重入,重量级锁。
ReentrantReadWriteLocK,它是一个,默认非公平但可实现公平的,悲观,写独享,读共享,读写,可重入,重量级锁。

主要结合自己的例子来讲
https://blog.****.net/nalanmingdian/article/details/77800355

String字符串怎么拼接

回答+,concat
然后就直接跳到下一个
还有一个append
阿里巴巴Java开发手册建议:循环体内,字符串的连接方式,使用 StringBuilder 的 append 方法进行扩展。而不要使用+。

String,StringBuffer,StringBuilder的区别

老生常谈
https://blog.****.net/itchuxuezhe_yang/article/details/89966303

JVM内存模型

JVM老生常谈
https://blog.****.net/qq_42337039/article/details/108650224

JVM垃圾回收

分为新生代和老生代,标记-复制,标记-清除,标记-整理
https://blog.****.net/qq_42337039/article/details/108650224

新生代和老生代

too easy
https://blog.****.net/qq_42337039/article/details/108650224

Spring的主要特性(IOC和AOP)

AOP总是讲不好,需要具体学习一下底层JDK和CGLIB
https://blog.****.net/dkbnull/article/details/87219562

SpringIOC的主要实现

BeanFactory和Applicationcontext容器加载配置文件

数据库索引的使用

主键索引,唯一索引,普通索引,组合索引,并没有往底层深入B-Tree和B+Tree
https://www.cnblogs.com/coder-lichao/p/10940338.html

数据库和用户的关系

这个就不知道是什么了

一个数据库服务器可以包含多个数据库和用户,每个数据库包含多张数据表
创建用户时,可以为用户分配对数据库的管理权限,所以用户可以共享所有数据库,只要具有对数据库的使用权限
秋招面经(二)

数据库的优化操作

添加索引和explain查询,尽量避免全表查询

想要全表数据时,该用什么索引?

这题就很迷了,先是回答了不能创建太多索引,问我那每个字段都要加索引才能查询到吗,我说不是,可以添加一个主键索引就可以了,那如果没有呢,利用组合索引就不用一一创建索引,那如果没有呢,我就不会了,懵逼
有没有大佬告知

如果有百万用户进入到静态界面,怎么优化

这里其实是想把面试官带入熟悉的redis缓存中,结果自己搞砸了,反而往dubbo方向去了,完全不会,面试就到这了,心痛,没有机会表现一下redis

死在了最后三题,有点难受,看来更高级的操作还是不行,继续努力