Java面试总结之基础知识(二)

简单介绍

今天主要记录一些数据库和框架相关的一些知识,总结的都是我面试的时候问到的基础问题,不晓得我面试的时候是吃了啥,竟然忘得一塌糊涂,感觉面试官向我投来鄙视的眼神,心里肯定想:这人啥也不是,还来面试。遇到这种事情不要慌,脸皮一定要厚,忘了的就别逞强说别的理由,还有不会的就不会,不要瞎装,这样不仅是给自己挖坑跳,还可能会让人家面试官感觉你这个人不够诚实。当然,会的必须要吹上天吹下地,让面试官看你的时候眼神直勾勾的放光,尽量牵着面试官走,这样下来,那你就很nice。好了,废话不多说,我来上干货把!

数据库相关
1.数据库中常用的函数有哪些?

a)sysdate: 系统时间
b)to_char(日期类型的数据 ,‘转化形式’): 将日期类型的数据 转化为字符串
c)to_date(‘日期’,‘转化形式’): 将字符串类型的时间转化为数据库中的日期类型
d)max(): 获取一组数据的最大值
e)min(): 获取一组数据的最小值
f)sum():获取一组数据的总和
g)avg():获取一组数据的平均值
h)count():获取一组数据的条数

2.数据库:什么是事务?

事务:一组功能性sql 是一个整体 , 是一个不可分割的步骤 原子操作
事务控制:保证事务操作的完整性 保证一组sql语句要不一起成功 要不一起失败
语法:commit 提交事务 rollback 回滚事务
注意:只有在增删改操作时 需要控制事务

3.事务的特性?

A 原子性: 保证原子操作的完整性
C 一致性: 事务前后数据的一致性
I 隔离性: 保证并发访问下的数据的正确性
D 持久性: 保证数据可以持久的保存

4.索引的一些语法

创建:create index 索引名 on 表名(列名)
删除:drop index 索引名
查看:select index from 表名

5.适合建立索引的情况

1)主键默认是唯一索引
2)经常查询的字段
3)多表连接查询时与其他表连接时,外键作为索引
4)查询中经产用来排序的字段
5)查询中经常用来统计和分组的字段

6.什么是组合索引?

组合索引就是多个字段组合成索引。而且你的索引条件必须是这个字段,不然没有效果。比如你组合三个字段A、B、C作为索引,那你检索时要满足where A=a and B=b and C=c,这样你的索引速度才会提高,如果中间断了,如where A= a and C= c,这样情况下用到索引的只有A,B,C都没有效果。具体的情况可以去搜索,我这里就不全部列出来了。

7.不适合建立索引的情况

1)频繁更新的字段
2)where条件查询中用不到的字段
3)表记录太少的
4)经常增删改的表
5)表中重复记录太多的不适合建立索引

8.索引失效的条件(等同于sql优化,我一般混合讲)

1)不在索引上进行任何计算、函数、类型转换操作
2)避免使用select*
3)mysql在使用不等于条件的时候
4)不使用is null , is not null
5)like以通配符开头(%xxx)索引会失效
6)字符串不加单引号索引会失效
7)少用or,它会导致索引失效

9.经常被问到的一些sql

1)如何用sql查询表中重复的数据?
2)去除表中重复的数据

框架相关
1.过滤器和拦截器的区别?

①拦截器是基于java的反射机制的,而过滤器是基于函数回调。
②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

2.谈谈你对Mybatis的理解

1)Mybatis是半映射框架,内部封装了JDBC,开发时我们只需要注重sql语句就可以了。不需要再去处理加载驱动、创建连接、创建statement等过程了,直接编写原生sql就可以了,可以严格控制sql的执行性能,灵活性高
2)Mybatis是基于XML和注解来配置和映射原生信息的,将实体类的对象实例映射成数据库中的记录,避免了JDBC代码和手动设置参数以及获取结果集
3)通过XML或注解的方式将所有要进行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射形成最终要执行的sql,最后由mybatis框架来执行sql并将结果映射为java对象并返回
4)Mybatis存在一级缓存和二级缓存,一级缓存是默认开启的,二级缓存需要手动开启。

3.${} 和 #{} 的区别?

#{}是预编译,KaTeX parse error: Expected 'EOF', got '#' at position 20: …符串替换 Mybatis在处理#̲{}时,会将sql中的#{}替…{}时,就是把${}替换成变量值
使用#{}能够有效的防止sql注入,增强系统的安全性

4.Spring中的AOP和IOC的理解

AOP:面向切面编程。简单介绍一下什么是切面,切面:就是代码中与业务无关的但是经常会用到的代码,将它们封装起来,这样的就叫做切面。应用场景:事务、权限认证等等
IOC:控制反转。以前创建对象的控制权在我们自己手里,但是在Spring中,我们把对象的创建交有Spring工厂去管理,并且根据配置文件来进行对对象的管理。还在此基础上提出了DI(依赖注入),也就是注入对象所需要的资源。

5.Spring中的事务隔离

READ_UNCOMMITTED: 读未提交
READ_COMMITTED: 读提交
REPEATABLE_READ:重复读
SERIALIZABLE:序列化
脏读: 一个事务读取到了另一个事务未提交的数据操作结果,获取到的数据会随着回滚而产生错误。
不可重复读: 事务1读取了数据,事务2修改了该数据,事务1再次去读取数据的时候----数据不一致(两次独立事 务)。
幻读: 操作中存在了两次的查询,第二次查询存在了第一次没有或者缺失了的数据,发现数据的不一致。

6.@Autowired 和 @Resource的区别?

@Autowired:是Spring提供的一个注解
@Resource:由java提供。先验证成员变量相同的名称对象,如果没再次去验证类型相同的对象

7.SpringMVC的执行流程

1)一个请求匹配前端控制器 DispatcherServlet 的请求映射路径(在 web.xml中指定), WEB 容器将该请求转交给 DispatcherServlet 处理
2)DispatcherServlet 接收到请求后, 将根据 请求信息 交给 处理器映射器 (HandlerMapping)
3)HandlerMapping 根据用户的url请求 查找匹配该url的 Handler,并返回一个执行链
4)DispatcherServlet 再请求 处理器适配器(HandlerAdapter) 调用相应的 Handler 进行处理并返回 ModelAndView 给 DispatcherServlet
5)DispatcherServlet 将 ModelAndView 请求 ViewReslover(视图解析器)解析,返回具体 View
6)DispatcherServlet 对 View 进行渲染视图(即将模型数据填充至视图中)
7)DispatcherServlet 将页面响应给用户

8.Srping中常用的注解有哪些,分别代表什么含义?

@Autowired:注入
@Resource:注入
@Controller:声明该类为SpringMVC中的Controller
@RequestMapping:用于映射Web请求,包括访问路径和参数(类或方法上)
@ResponseBody:支持将返回值放在response内,而不是一个页面,通常用户返回json数据(返回值旁或方法上)
@RequestBody:允许request的参数在request体中,而不是在直接连接在地址后面。(放在参数前)
@RestController:该注解为一个组合注解,相当于@Controller和@ResponseBody的组合,注解在类上,意味着,该Controller的所有方法都默认加上了@ResponseBody。

9.SpringBoot 和 Spring 的区别?

1)创建独立的Spring应用程序
2)嵌入的Tomcat,无需部署WAR文件
3)简化Maven配置
4)自动配置Spring
5)没有XML配置

10.Springboot中有哪些注解,分别代表什么含义?

@SpringBootApplication 三合一的注解 标记该类为入口类
@Configuration 声明该类为配置类
@EnableAutoConfiguration 开启自动配置
@ComponentScan 包扫描,可以使用basepack指定扫描位置,如果没有指定扫描当前子包
还有一部分是spring中常用到的注解

补充知识点
1.linux中常用到的命令

ls:显示指定目录中的文件清单,如果没有指定任何目录,则默认为当前目录
ls -a:显示所有文件
pwd:显示当前目录
mkdir:在当前目录下创建目录
cd:切换工作目录
touch:创建空文件
cp:复制文件
cat:显示文件内容
tail:默认显示指定文件的末尾10行的内容
ps -ef:查看所有进程
kill:杀死进程
tar:解压

2.redis常用的数据类型

list , set , hash , string , socketset

3.缓存击穿、缓存穿透、缓存雪崩分别是什么?应该怎么解决?

https://blog.csdn.net/qq_35190492/article/details/103041932
给大家安利一下这位博主,看了以后深有体会!

4.RDB和AOF相关

https://blog.csdn.net/qq_35190492/article/details/102958250
可以参考这篇,嘿嘿~

5.git常用的指令

添加文件到缓存区:git add filename
添加所有文件到缓冲区:git add .
删除文件:git rm filename
提交缓冲区修改到仓库:git commit -m “提交说明”
查看git库的状态:git status
版本回退:git reset
回退到上一个版本:git reset --hard HEAD^
回退到指定版本:git reset --hard d7b6
查看日志:git log
查看命令历史:git reflog
创建分支:git branch 分支名
切换当前分支到指定分支:git checkout 分支名
切换分支并切换到创建的分支:git checkout -b 分支名
喝冰某分支的内容到当前分支:git merge 分支名
删除分支:git branch -d 分支名
将本地内容推送到远端仓库:git push -u origin master
移除远端仓库:git remote remove origin
从远端库更新内容到本地:git pull

6.redis的使用场景有哪些?

1)点上首页以及热点数据,一般缓存都是定时任务去刷新
2 )秒杀库存扣减
3)app首页的访问流量高峰

7.内存溢出和内存泄漏的区别?

内存溢出:
1)内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
2)集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
3)代码中存在死循环或循环产生过多重复的对象实体;
4)使用的第三方软件中的BUG;
5)启动参数内存值设定的过小
解决办法:
1)修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不要忘记加)
2)检查错误日志,查看“OutOfMemory”错误前是否有其 它异常或错误。
3)对代码进行走查和分析,找出可能发生内存溢出的位置。
4)使用内存查看工具动态查看内存使用情况 
内存泄漏: 强引用所指向的对象不会被回收,可能导致内存泄漏

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值