8k-9k薪面试题

写在前面:答案皆为博主所写,有问题可留言

一、java

1.重写equals为什么要重写hashcode

1).使用hashcode方法提前校验,可以避免每一次比对都调用equals方法,提高效率
2).保证是同一个对象,如果重写了equals方法,而没有重写hashcode方法,会出现equals相等的对象,hashcode不相等的情况,重写hashcode方法就是为了避免这种情况的出现。

2.==和equals的区别

==是一个比较运算符,基本数据类型比较的是值,引用数据类型比较的是地址值。
(比较地址值即是指是否为同一个对象的引用)
equals()是一个方法,只能比较引用数据类型。重写前比较的是地址值,重写后比一般是比较对象的属性。常见如:String、Integer等

3.Integer和int区别

1、Integer是int的包装类,int则是java的一种基本数据类型
2、Integer变量必须实例化后才能使用,而int变量不需要
3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
4、Integer的默认值是null,int的默认值是0

4.List、Map和Set区别

  1. List 集合中对象按照索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索对象,例如通过list.get(i)方法来获取集合中的元素;
  2. Map 中的每一个元素包含一个键和一个值,成对出现,键对象不可以重复,值对象可以重复;
  3. Set 集合中的对象不按照特定的方式排序,并且没有重复对象,但它的实现类能对集合中的对象按照特定的方式排序,例如 Tree Set 类,可以按照默认顺序,也可以通过实现 Java.util.Comparator< Type >接口来自定义排序方式。
    4.List、Map和Set都是接口,前两个继承于Collection接口,Map则没有继承该接口

5.HTTP中post和get区别

1)GET在浏览器回退时是无害的,而POST会再次提交请求。
2)GET产生的URL地址可以被Bookmark,而POST不可以。
3)GET请求会被浏览器主动cache,而POST不会,除非手动设置。
4)GET请求只能进行url编码,而POST支持多种编码方式。
5)GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
6)GET请求在URL中传送的参数是有长度限制的,而POST么有。
7)对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
8)GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
9)GET参数通过URL传递,POST放在Request body中
10)GET产生一个TCP数据包;POST产生两个TCP数据包

6.java中抽象类和接口的区别,在项目中如何使用它们

1)定义方式不同
抽象类使用 abstract class 定义
接口使用 interface定义
2)内容不同
抽象类中除了抽象方法外, 还有构造方法等普通类有的所有成员
接口中除了抽象方法外, 可以定义default修饰的方法, 没有构造方法
类只支持单继承, 接口可以支持多继承
3)应用场景不同
如果仅仅是为了 扩展类的功能, 优先选择使用接口
抽象类可以描述类之间的层次关系; 如果除了功能扩展外,还需要保存数据选择抽象类; 抽象类可以约束所有的子类都具有某个功能.
4)使用方式不同
抽象类一般作为其他类的父类存在, 需要被extends继承
接口需要类通过implements实现

7.java中为什么要使用事务?代码中如何实现事务处理?

事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。这样可以防止出现脏数据,防止数据库数据出现问题。
开发中为了避免这种情况一般都会进行事务管理。Spring中也有自己的事务管理机制,一般是使用TransactionMananger进行管理,可以通过Spring的注入来完成此功能。
Spring支持如下两种方式的事务管理:
声明式事务管理:这种方式意味着你可以将事务管理和业务代码分离。你只需要通过注解或者XML配置管理事务。
编程式事务管理:这意味着你可以通过编程的方式管理事务,这种方式带来了很大的灵活性,但很难维护。
一般选择声明式事务管理,因为这种方式和应用程序的关联较少。

二、Nginx

三、缓存

1.为什么用缓存?缓存的不良后果

1)高性能:减少查询同一个数据时的响应速度
2)高并发:减少数据库的承载压力(2000/s),缓存走内存,天然支撑高并发
不良后果:
1)缓存与数据库的双写不一致
2)缓存雪崩
3)缓存穿透
4)缓存并发竞争

2.Redis和memcached区别(单线程、NIO、异步)

1)Redis支持服务器端数据操作:数据类型更多,功能更全
2)内存使用效率对比:简单key-value时memcached效率高,hash结构存储Redis高
3)性能对比:Redis单线程,小数据时Redis高;大数据时多线程的memcached高
4)集群模式:memcached不支持集群,Redis支持

3.Redis的线程模型

文件事件处理器,单线程,通过IO多路复用程序同时监听多个socket,通过socket上的事件选择对应的事件处理器处理事件
AE_READABLE:socket可读(连接操作、客户端对Redis执行write操作,close操作)
AE_WRITABLE:socket可写(客户端对Redis执行read操作)

4.redis有哪些数据类型,用在什么场景

redis 主要有以下几种数据类型:
String、hash、list、set、sorted set
string
这是最简单的类型,就是普通的 set 和 get,做简单的 KV 缓存。
hash
这个是类似 map 的一种结构,这个一般就是可以将结构化的数据,比如一个对象(前提是这个对象没嵌套其他的对象)给缓存在 redis 里,然后每次读写缓存的时候,可以就操作 hash 里的某个字段。
list
list是有序列表,这个可以玩儿出很多花样。
比如可以通过 list 存储一些列表型的数据结构,类似人员列表之类的。
比如可以通过 lrange 命令,读取某个闭区间内的元素,可以基于 list 实现分页查询,这个是很棒的一个功能,基于 redis 实现简单的高性能分页,可以做类似微博那种下拉不断分页的东西,性能高,就一页一页走。
set 是无序集合,自动去重,可以玩交集、差集、并集,如交集,能搞共同好友
sorted set 是排序的 set,去重但可以排序,写进去的时候给一个分数,自动根据分数排序。

四、数据库

1.存储过程的优缺点

优点:
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
3.存储过程可以重复使用,可减少数据库开发人员的工作量
4.安全性高,可设定只有某些用户才具有对指定存储过程的使用权
缺点:
1:调试麻烦,但是用 PL/SQL Developer 调试很方便!弥补这个缺点。
2:移植问题,数据库端代码当然是与数据库相关的。但是如果是做工程型项目,基本不存在移植问题。
3:重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。
4: 如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价是空前的,维护起来更麻烦。

2.触发器的概念和作用

触发器是一种特殊类型的存储过程。触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。当对某一表进行诸如UPDATE、 INSERT、 DELETE 这些操作时,数据库就会自动执行触发器所定义的SQL 语句,从而确保对数据的处理必须符合由这些SQL 语句所定义的规则。
触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。

3.一条sql执行过长的时间,你怎么优化,从哪些方面

1、查看sql是否涉及多表的联表或者子查询,如果有,看是否能进行业务拆分,相关字段冗余或者合并成临时表(业务和算法的优化)
2、涉及链表的查询,是否能进行分表查询,单表查询之后的结果进行字段整合
3、如果以上两种都不能操作,非要链表查询,那么考虑对相对应的查询条件做索引。加快查询速度
4、针对数量大的表进行历史表分离(如交易流水表)
5、数据库主从分离,读写分离,降低读写针对同一表同时的压力,至于主从同步,mysql有自带的binlog实现 主从同步
6、explain分析sql语句,查看执行计划,分析索引是否用上,分析扫描行数等等
7、查看mysql执行日志,看看是否有其他方面的问题

4.内连接、左连接、右链接的语法以及用途

1.内连接
利用内连接可获取两表的公共部分的记录 语句如下:Select * from A JOIN B ON A.Aid=B.Bnameid 。
2.左连接
数据表A中的记录为主循环体,依次匹配数据表B中的记录,如果数据表A中连接字段Aid的值,在数据表B中没有Bnameid值与之对应,则右侧以null代替。结果集:公共部分记录集C+表A记录集A1。语句如下:select * from A Left JOIN B ON A.Aid=B.Bnameid
3.右连接
数据表B中的记录为主循环体,依次匹配数据表A中的记录,如果数据表B中连接字段Bnameid的值,在数据表A中没有Aid值与之对应,则左侧以null代替。结果集:公共部分记录集C+表B记录集B1。语句如下:select * from A Right JOIN B ON A.Aid=B.Bnameid
4.全连接(Full JOIN)
结果集:公共部分记录集C+表A记录集A1+表B记录集B1。语句如下:select * from A FULL JOIN B ON A.Aid=B.Bnameid。

5.索引的作用?和它的优缺点是什么?什么样的字段适合建立索引?

索引的作用:创建索引能够大大的提高系统的性能
优点:
  ①通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性
  ②大大加快数据的检索速度,这也是创建索引的最主要原因
  ③加快表与表之间的连接,在实现数据的参考完整性方面特别有意义
  ④在使用分组和排序,子句进行数据检索时,同样可以显著减少查询中分组和排序的时间
  ⑤通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
缺点:
  ①创建索引和维护索引需要时间,这种时间随着数据量的增加而增加
  ②索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占物理空间,如果要建立聚簇索引,需要的空间更大
  ③当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这就降低了数据的维护速度。
适合建立索引的字段:
1、表的主键、外键必须有索引;
2、经常与其他表进行连接的表,在连接字段上应该建立索引;
3、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
4、索引应该建在选择性高的字段上;
5、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;

6.是什么是事务?什么是锁

事务就是一段sql 语句的批处理,但是这个批处理是一个atom(原子),不可分割,要么都执行,要么回滚(rollback)都不执行。一般来说,事务是必须满足4个条件(ACID): Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)
1、事务的原子性:一组事务,要么成功;要么撤回。
2、稳定性 :有非法数据(外键约束之类),事务撤回。
3、隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。
4、可靠性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit 选项 决定什么时候吧事务保存到日志里。
锁是在多用户环境中对数据的访问的限制。
锁可以分为乐观锁和悲观锁:
悲观锁:认为在修改数据库数据的这段时间里存在着也想修改此数据的事务;
乐观锁:认为在短暂的时间里不会有事务来修改此数据库的数据;

五、linux常见操作

1.查看内存命令

free -m

2.进入/home目录

cd /home

3.进入上一级目录命令

cd …

4.查看文件列表命令

ls

5.查找文件命令

find 【搜索目录】【-name或者-iname】【搜索字符】

6.文件解压命令

Zip文件:unzip filename.zip

其他文件:tar -xvf

7.安装包下载命令

wget+空格+链接地址

8.查看后台进程运行命令

Jobs

9.关闭后台进程命令

kill %jobnum

10.文件权限不够,授权命令

chmod u+x *.sh
r 可读。
w 可写。
x 可执行。

11.启动tomcat

./startup.sh

12.查看tomcat运行日志命令

cd 进入tomcat的logs目录
输入ls -l | grep catalina.out,确认该目录下存在日志文件
输入命令tail -f /usr/local/tomcat/logs/catalina.out查看tomcat日志了

数据库题

1.

Resource表
Phone
City

Area表
Code
City
Resource表有很多数据,只有phone有值,Area表中code为phone的中间4位,将area表的city填入resource表

set city = (select city
from area
where SUBSTRING(resource.phone,5,4)=area.code)
where exists(select 1 from area where SUBSTRING(resource.phone,5,4)=area.code);

2.

present表
Id
Status
Status有1,2,3,4,5五种状态,统计id的每种状态数量,每个id显示一行

select sum(case when status =1 then 1 else 0 end) sum1,sum(case when status =2 then 1 else 0 end) sum2,sum(case when status =3 then 1 else 0 end) sum3,sum(case when status =4 then 1 else 0 end) sum4,sum(case when status =5 then 1 else 0 end) sum5,Id from area GROUP BY Id

3.分组查询前4条

答:
方法1:
SELECT a.id,a.name,a.class,a.score
FROM test a LEFT JOIN test b on a.class = b.class and a.score < b.score
GROUP BY a.id,a.name,a.class,a.score
HAVING count(b.id) <= 4
ORDER BY a.class,a.score DESC;
方法2:
SELECT * FROM test a
WHERE 4 >=(SELECT count(*) FROM test WHERE class = a.class and score>a.score)
ORDER BY a.class,a.score DESC;

前端

1、前端框架

答:layui vue mui

2、layui有哪些组件

答:分页,弹框layer.msg(),数据表格,layData,树形组件等

3,、多文件上传怎么实现

答:layui中有相应组件,选择的文件放到文件队列,读取本地文件,等待上传,修改上传接口

4、拿到静态页面怎么做增删改查

答:接口已经写好的话,给静态页面加上调用接口的方法,使用ajax或者js写好要传输的参数然后提交form表单等

项目

6、404.500.300为什么出现

答:
300:3开头是重定向问题。300代表针对这个请求,服务器可执行多种操作,服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求

者选择。
404:4开头的http状态码表示请求出错。404 服务器找不到请求的网页,看url是否正确。
500:服务器内部错误。 服务器遇到错误,无法完成请求。根据返回的错误代码找到相应地方进行修改

7、介绍一下项目中模块怎么做的

8、mvc怎么集成mybatis

添加pom依赖、config.properties中配置数据源、applicationContext中配置mybatis,配置sql会话工厂、别名、映射文件

9、sql和接口关联的字段

mapper映射,resultMap 结果集映射

10、sql中截取字符串

答:subStr(name,start,length

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值