常出现的面试题

1.javaWeb`

http和https有什么不同

http协议就是一个基于应用层的通信规范,规定了客户端和服务器之间的通信方式
https是基于ssl+http 协议构建的 就是相对http来说多了一个加密传输和身份认证

cookie和session的区别

cookie是将会话中的数据保存到客户端,是客户端技术
session是将会话中产生的数据保存在服务端,是服务端技术
session比较安全,而如果客户端收到攻击,cookie中的信息可能会被窃取,数据可能被篡改
cookie中的数据有大小和数量的限制,
cookie适合存储需要长时间保存,但对安全性要求不高的数据
session适合存储对安全性要求较高,但不需要长时间保存的数据

session 的生命周期

session在用户第一次访问服务器时创建(第一次调用request.getSession()方法时),当超过30分钟没有访问session,session就会超时销毁
还有自杀(invalidate()方法)和意外身亡

tcp/udp

常接触的状态码

200 请求成功,一般用于get和post请求
400 客户端请求的语法错误,服务器无法理解
500 服务器端异常
404 找不到资源或者路径错误

什么是restFul风格

表现层状态迁移,资源在网络中以某种表现形式进行状态转移.
就是用一个可变的参数来动态地获取一个url地址

2.数据库

多表查询有哪些

连接查询(等同于内连接查询inner) 左外连接查询 右外连接查询

mysql数据库事务的四大特性

原子性 一致性 隔离性 持久性

事务的三个并发读问题(需要一句话概述)

脏读 在一个事物中,读到了另一个事物未提交更新的数据,即读到了脏数据
不可重复读 对同一记录的两次读取结果不一致,因为在两次查询期间,有另一事务对该记录做了修改
幻读 对同一张表的两次查询结果不一致,是因为在两次查询的期间,有另一事务进行了插入或者删除的操作

事务的隔离级别(mysql和orcle的默认事务隔离级别)分别可以防止哪些并发读问题

读未提交 可能出现任何事务并发问题
读已提交 --oracle默认 可以防止脏读,但不能防止不可重复读和幻读
可重复读 --mysql默认 可以防止脏读和不可重复读,但不能防止幻读
串行化 不会出现任何并发问题,因为它对同一数据的访问是串行的,非并发访问,性能最差

mysql优化

1.比如可以建表时用反三范式,当需要进行多表查询的时候,可以适当增加表的冗余字段,虽然会占用更多的空间,但是查询的性能会提升
2.一般用explain执行计划,看看他执行的各方面的数据 如果是索引没用到的话就建立索引
建立索引,(还有数据库的分库分表–不能继续深入建议不回答)
1)为频繁被查询的字段建立索引
2)尽量选择区分度高的字段建立索引(字段不重复的比例低)
3.数据库的读写分离和分库分表

慢查询和explain

用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain命令来查看。
慢查询可以看到一些执行时间超时的语句

聚簇索引和非聚簇索引的区别

聚簇索引是数据的物理存储顺序,非聚簇索引的顺序和数据物理排列顺序无关

B+树和其他的树(二叉平衡树,红黑树,b树,b-树的区别)

树高比较低 意味着io次数比较少
不同的树

myISAM和Inoodb的区别

1.MyISAM不支持事务,InooDB支持事务,且默认开启自动提交
2.MyISAM与InooDB关于锁方面的区别:
MyISAM默认用的是表级锁,不支持行级锁
3.性能开销方面,myIsam要小一些(因为inoodb要支持事务锁的粒度细)
InooDB默认用的是行级锁,也支持表级锁

一张表最多建几个索引

16

模糊查询在什么时候索引会失效

以百分号开头的时候

3.springboot

说说你对springboot的理解

Spring boot是一个脚手架,构建于Spring框架(Framework)基础之上,基于快速构建理念,提供了自动配置功能,可实现其开箱即用特性(创建完一个基本的项目以后,可零配置或者少量配置即可运行我们的项目)

springboot的自动配置原理

springboot的自动配置主要基于它的启动类上的注解也是springboot的核心注解@SpringbootApplication,
而这个注解的主要组合是三个注解:
@SpringbootConfiguration 它实现了配置文件的功能
@EnableAutoConfiguration 它可以打开自动配置的功能,也可以关闭某个自动配置的选项
@ComponentScan 它可以扫描注解 将它们(有某些注解标注的类)加载到Ioc容器中

aop的两种代理方式以及应用场景

jdk代理和cglib代理
目标对象生成了接口 默认用JDK动态代理
如果目标对象没有实现接口,采用cglib代理方式,对指定的类生成一个子类

4.数据结构方面

算法就是计算或者解决问题的步骤
数据存储于内存时,决定了数据顺序和位置关系的便是“数据结构”。

时间复杂度是什么

O 这个符号的意思是“忽略重要项以外的内容”,读音同 Order。O(n2) 的含义就是“算法的
运行时间最长也就是 n2 的常数倍”

说出你知道的排序方法

冒泡排序,选择排序,插入排序,堆排序,归并排序,快速排序

数组和链表的区别

在链表中,数据一般都是分散存储于内存中
的,无须存储在连续空间内。因为数据都是分散存储的,所以如果想要访问
数据,只能从第1个数据开始,顺着指针的指
向一一往下访问(这便是顺序访问)。

关于二叉树

hashmap是线程安全的吗

不是,CoucerentHashMap是线程安全的

5.多线程高并发

synchronized和lock底层实现的原理

简单介绍一下CAS

CAS是英文单词CompareAndSwap的缩写,中文意思是:比较并替换。CAS需要有3个操作数:内存地址V,旧的预期值A,即将要更新的目标值B。

CAS指令执行时,当且仅当内存地址V的值与预期值A相等时,将内存地址V的值修改为B,否则就什么都不做。整个比较并替换的操作是一个原子操作。

关于线程池

线程池是一种基于池化思想管理线程的工具

Runnable和Callable的区别

Runnable中是用run()方法作为线程执行体
Callable中是用call()方法作为线程执行体,
创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。
并且使用FutureTask对象作为Thread对象的target创建并启动新线程。
然后通过调用这个对象的get方法获得子线程的返回值

jdk1.8新特性

1)lambda表达式和函数式接口
省去接口名和方法名
函数式接口 – 内部只有一个抽象方法的接口
2)接口的默认方法和静态方法
默认方法不需要被实现,会被实现类继承或覆写
3)重复注解
可以在同一个地方多次使用同一个注解
4)拓宽了注解的应用场景
几乎可以用在任意元素上

6. Redis

为什么选择Redis

Redis数据类型比较丰富,有五种(哪五种?),能满足生产上更多的场景

Redis为什么这么快

…因为是在内存中的,所以 磁盘的io和操作都很快

Redis的两种持久化方式

一种是RDB,他是每隔一段时间 就会把内存快照存到硬盘里面
一种是AOF,他会把命令写到文件中去.如果断电,可以根据aof的文件去恢复数据
一般生产的时候是两个同时开启的
aof虽然数据比较全,但是恢复的比较慢
rdb虽然数据少一点,但是恢复挺快的
rdb先恢复到一个点,然后aof补全

了解过Redis的集群吗

采用redis集群,可以保证数据分散存储,同时保证数据存储的一致性.并且在内部实现高可用的机制.实现了服务故障的自动迁移.
即实现了自动分片和高可用

集群的原理

其中哨兵模式着眼于高可用,在master宕机时会自动将slave提升为master,继续提供服务
分片着眼于扩展性,在单个redis内存不足时,使用Cluster进行分片存储

关于缓存击穿和缓存穿透和缓存雪崩的理解

怎么进行redis和数据库的双写一致性

  1. 先删除缓存,再更新数据库
    采用延时双删策略
    – 先删除缓存,再写数据库,休眠一秒后再次删除缓存

2)先更新数据库,再删除缓存
也就是一个请求b先更新数据库,然后删除缓存

7.spring

spring的优点

无侵入,主要的一个功能是帮你把对象的依赖管理起来

spring的ioc和aop

spring的ioc即控制反转,就是把创建和管理对象的权利交给spring,通过依赖注入动态的创建实例对象
aop即面向切面编程,在不改变原有代码的情况下,实现功能的增强和扩展

8.springmvc

说一说springmvc的调用过程

9.mybatis

xml和dao怎么对应的

namespace+id

dao层的实现类是怎么实现的

mybatis通过JDK的动态代理方式,在启动加载配置文件时,根据配置mapper的xml去生成Dao的实现。

10. dubbo+zookeeper

dubbo的调用链路

首先是dubbo容器启动,然后服务提供者会将服务注册到注册中心,这样注册中心就会知道有哪些服务注册了,
当服务消费者启动就会去注册中心订阅需要的服务.如果有一个提供者服务下线了,注册中心还可以和消费者基于一个长链接的方式将这次变更推送给服务消费者,消费者就能实时地知道哪些服务不能调了.消费者拿到所有能调用的服务时,就可以同步的去调用提供者提供的服务,而且如果同一个业务(如查询)有多个提供者提供服务,那么就可以通过负载均衡的算法选择一个服务进行调用,
还有,服务的调用和信息等等会定时的每隔一分钟就会统计发送给监控中心,监控中心就能监控到服务的一些运行状态.
(其中,注册中心将提供者变更的信息推送给消费者和服务信息发送给监控中心是一个异步的过程)

当zk宕机后,消费者能否正确消费

可以。因为zk会动态的向客户端更新服务列表信息,当zk宕机后,由于之前已经同步了zk的服务列表信息,所以客户端可以按照自己已经缓存的清单进行访问。

11. javaSE

你了解哪些设计模式

单例模式,工厂模式,

项目中如何保证幂等性

接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。

io中用了什么设计模式

单例模式

保证一个类在内存中对象只有一个
(私有化构造器)

当问到什么时候(可以)这样时,

就是问应用场景

12.springcloud

SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并
管理起来,为各个微服务之间提供,配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞
选、分布式会话等等集成服务SpringBoot可以离开SpringCloud独立使用开发项目, 但是SpringCloud离不开SpringBoot ,属于依赖的关
系.

你知道springcloud中的哪些组件

服务需要注册与发现嘛,所以就会用到eureka,服务之间发起调用的话,就会用到fegin接口,服务部署在多台 机器上的话,我们不知道具体调用哪一个,就可以用ribbon来做负载均衡,它里面有一些算法(四个),还有 hytrix,如果b服务挂掉,a服务来调用它的话,可能也会挂掉,如果还有一些其他服务来调用的话就会出现服务雪崩,会出现一系列的连锁反应,这时候我们可以通过hytrix的熔断机制来访问一些托底信息,zuul路由的话,我们发起请求,然后用zuul来调用具体的服务,configure的话,配置中心,一般就是用它去配置的.
eureka底层:服务向eureka注册,eureka会生成服务的注册清单,每个注册的服务它也可以向它拉取下来,如果需要调用其他服务的话,就可以通过这个清单调用其他服务,从而发起一个调入

13.jvm

jvm内存区域

在这里插入图片描述

如果两个对象相互引用,会被GC回收吗

简单的做法可以在所有正在执行的线程的代码都运行到safe point之后,从全局变量和所有线程的堆栈中将所有有效的对象作为根对象集合,然后从根对象出发将所有的reachable对象都标记上,然后再遍历heap里面所有对象然后把没有标记到的垃圾释放。如果只是循环引用但是他们中没有任何一个在根对象集合中,或者没有任何一个路径可以从根对象集合中引用到这两个对象中的任何一个,那么这两个就是前面说的垃圾了。当然这是最基本的做法,真正成熟高性能的gc则会采用各种各样的技巧来降低这里的消耗。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值