面试问题总结
Posted Java小周
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试问题总结相关的知识,希望对你有一定的参考价值。
目录
七、String和StringBuilder、StringBuffer的区别?
一、HashSet为什么可以做去重的一个作用
底层是一个HashMap,HashMap是key值唯一,不可重复,所以可以去重
二、HashMap的底层实现
HashMap的Key值是唯一的,不可重复,每个Key值都有Hash算法,它会计算到每个Hash值,我们可以根据每个Hash值去找到它在内存中的一个存储情况,存放在一个数组里面,当对象多的时候,有可能会造成Hash冲突,这个时候,就会在原先的位置上形成一个链表,而链表不利于查询,所以在jdk1.8以后,当链表的长度大于8,并且数组大于64的时候,会转换成红黑树,当红黑树的节点小于6的时候会转换回链表,当数组没达到64的时候会进行扩容。
三、HashMap的容量怎么计算
HashMap的初始容量为16,当数据达到0.75也就是容量为12的时候,会进行扩容,第一次扩容为两倍,也就是到32。
四、wait和sleep有什么区别?
1、sleep是线程中的方法,但是wait是Object中的方法。
2、sleep方法不会释放lock,但是wait会释放,而且会加入到等待队列中。
3、sleep方法不依赖于同步器synchronized,但是wait需要依赖synchronized关键字。
4、sleep不需要被唤醒(休眠之后推出阻塞),但是wait需要(不指定时间需要被别人中断)。
五、什么是死锁?
两个或两个以上的线程同时抢占资源造成一种互相等待的现象称为死锁
六、怎么避免死锁?
1、时长控制:设置超时时间,超时可以退出防止死锁
2、顺序控制:按照一定的顺序加锁
3、减少锁资源对象
七、String和StringBuilder、StringBuffer的区别?
性能快慢:StringBuilder>StringBuffer>String
StringBuilder不安全,StringBuffer安全
八、回文的设计
举例 : abcba
(1)、设定一个数组,a,b,c,通过for循环根据下标遍历一遍,再把数组反过来,设定拦截最后一个下标条件,再倒着打印一遍,使用字符串拼接打印出来。
(2)、使用String反转方法 new StringBuffer(s).reverse().toString()
九、数据库优化
SQL优化,索引优化,字段代替*号,用and代替or,like关键字最好知道开头关键字,主从复制,读写分离,添加redis缓存
十、什么是穿透跟击穿以及雪崩?
穿透:在Redis缓存中与数据库中都找不到这条数据叫穿透,这个涉及到恶意攻击,可以通过过滤器把它筛选掉,也可以在Redis上给它设置一个null值,有请求的话就把null值返回
击穿:热点数据即将消失,消失了就会把大批量请求打到数据库上,指的是数据库有的数据,解决办法就是设置热点数据永不过期,其他数据可以设置多级缓存,多级缓存里面两个数据失效时间是不一致的
雪崩:redis中的数据大批量的失效,解决办法设置随机的失效时间,让它失效的时间不一致。
十一、怎么在Redis上做优化?
按时间,访问次数最低的,没人访问就直接让它失效
按次数,登录次数最少的,也让它失效
十二、怎么让Redis跟数据库的数据保持一致?
在Redis中设置一个过期时间,然后重新从数据库里面去读取,进行一个同步操作
读取都在Redis上,增删等操作还是在数据库当中
两种策略:同步更新与实时更新
十三、高并发场景怎么去设计?
1、搭建微服务项目,给它模块化,一个模块一个服务器的分出来
2、使用ribbon实现负载均衡
3、在页面上搭建nginx集群做负载均衡(轮询,权重)
4、数据库使用主从加读写分离
5、添加Redis缓存
6、通过RabbitMQ进行一个流量削峰
7、前端页面采用ajax局部刷新
十四、怎么保证数据传输的安全性?
密码:可以采用MD5加密
请求:可以通过https进行传输协议加密
用Post请求提交代替Get请求提交数据
十五、单点登录怎么实现?
暂无
十六、购物车怎么实现?
暂无
十七、token跟cookie的区别
①:token和cookie一样都是首次登陆时,由服务器下发,都是当交互时进行验证的功能,作用都是为无状态的HTTP提供的持久机制。
②:token存在哪儿都行,localstorage或者cookie。
③:token和cookie举例,token就是说你告诉我你是谁就可以
cookie 举例:服务员看你的身份证,给你一个编号,以后,进行任何操作,都出示编号后服务员去看查你是谁。
token 举例:直接给服务员看自己身份证
④:对于token而言,服务器不需要去查看你是谁,不需要保存你的会话。当用户logout的时候cookie和服务器的session都会注销;但是当logout时候token只是注销浏览器信息,不查库。
⑤:token优势在于,token由于服务器端不存储会话,所以可扩展性强,token还可用于APP中。
总结:
Token 完全由应用管理,所以它可以避开同源策略
Token 可以避免 CSRF 攻击
Token 可以是无状态的,可以在多个服务间共享
如果你的用户数据可能需要和第三方共享,或者允许第三方调用 API 接口,用 Token,如果之上自己的那就无所谓了。
十八、如何避免sql注入攻击
1、使用预编译#代替$
2、校验参数的数据格式是否合法(使用正则或特殊字符的判断)
3、发布前,利用工具进行 SQL 注入检测
4、报错信息不要包含 SQL 信息输出到 Web 页面
十九、什么是服务熔断
1.熔断关闭状态(Closed)
(1).服务没有故障时,熔断器所处的状态,对调用方的调用不做任何限制。
2.熔断开启状态(Open)
(1).在固定时间内(Hystrix默认是10秒),接口调用出错比率达到一个阈值(Hystrix默认为50%),会进入熔断开启状态。
(2).进入熔断状态后, 后续对该服务接口的调用不再经过网络,直接执行本地的fallback方法。
3.半熔断状态(Half-Open)
(1).在进入熔断开启状态一段时间之后(Hystrix默认是5秒),熔断器会进入半熔断状态。
(2).所谓半熔断就是尝试恢复服务调用,允许有限的流量调用该服务,并监控调用成功率。
(3).如果成功率达到预期,则说明服务已恢复,进入熔断关闭状态;如果成功率仍旧很低,则重新进入熔断开启状态。
二十、微服务的优缺点
什么是微服务?
1.微服务(Microservices Architecture)是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小的业务能力。
2.微服务是指开发一个单个小型的但有业务功能的服务,每个服务都有自己的处理和轻量通讯机制,可以部署在单个或多个服务器上。
3.微服务也指一种种松耦合的、有一定的有界上下文的面向服务架构。也就是说,如果每个服务都要同时修改,那么它们就不是微服务,因为它们紧耦合在一起;如果你需要掌握一个服务太多的上下文场景使用条件,那么它就是一个有上下文边界的服务。
微服务的优点?
1.每个微服务都很小,这样能聚焦一个指定的业务功能或业务需求。
2.微服务能够被小团队单独开发,这个小团队是2到5人的开发人员组成。
3.微服务是松耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是独立的。
4.微服务能使用不同的语言开发。
5.微服务易于被一个开发人员理解,修改和维护,这样小团队能够更关注自己的工作成果。无需通过合作才能体现价值。
6.微服务允许你利用融合最新技术。
7.微服务只是业务逻辑的代码,不会和html,CSS 或其他界面组件混合。
微服务架构的缺点?
1.微服务架构可能带来过多的操作。
2.可能双倍的努力。
3.分布式系统可能复杂难以管理。
4.因为分布部署跟踪问题难。
5.当服务数量增加,管理复杂性增加。
二十一、微服务之间如何通信
SpringCloud中服务之间的两种调用RESTful接口通信的方式:
1、RestTemplate
2、Feign
RestTemplate
1、配置WebMVC的依赖和Json的依赖
2、在applicationcontext.xml文件中配置RestTemplate的bean
3、使用RestTemplate对象完成RPC远程调用
Feign
Feign远程调用,核心就是通过一系列的封装和处理,将以JAVA注解的方式定义的远程调用API接口,最终转换成HTTP的请求形式,然后将HTTP的请求的响应结果,解码成JAVA Bean,放回给调用者。
在微服务启动时,Feign会进行包扫描,对加@FeignClient注解的接口,按照注解的规则,创建远程接口的本地JDK Proxy代理实例。然后,将这些本地Proxy代理实例,注入到Spring IOC容器中。当远程接口的方法被调用,由Proxy代理实例去完成真正的远程访问,并且返回结果。
二十二、MVC的执行流程
SpringMVC的工作原理:五个组件
1、DispathcherServlet:前端控制器,接受请求,分发请求
2、HandlerMapping:处理器映射器,根据url找到干活的Controller和方法
3、HandlerAdaptor:处理器适配器,就是干活的。Controller<->Serice<->Dao<->DB
4、ViewResolver:视图解析器,解析响应的数据
5、View:渲染视图,在页面上刷新数据
二十三、MVC有哪些注解
1、@Controller
@Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象
2、@RequestMapping
RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。
3、@Autowired
@Autowired做bean的注入时使用
4、@PathVariable
用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。
5、@RequestParam
@RequestParam用于将请求参数区数据映射到功能处理方法的参数上
6、@ResponseBody
作用: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
二十四、怎么监控服务
Zipkin:
Zipkin是一款开源的分布式实时数据追踪系统(Distributed Tracking System),其主要功能是聚集来自各个异构系统的实时监控数据。
ZipKin架构
ZipKin可以分为两部分,一部分是zipkin server,用来作为数据的采集存储、数据分析与展示;zipkin client是zipkin基于不同的语言及框架封装的一些列客户端工具,这些工具完成了追踪数据的生成与上报功能
二十五、线程安全
线程安全:当多个线程运行同一块代码块(或访问同一块数据)时,采用加锁的方法进行保护,使得有一个线程运行此代码块时,其他线程不能运行,直到该线程结束才能,其它线程才能依次访问。
线程不安全:多个线程同时运行一块代码块(或访问同一块数据),这样可能会造成与预期的运行结果不相符。
二十六、HashMap与HashTable的区别
1、HashMap是线程不安全的,在多线程环境下会容易产生死循环,但是单线程环境下运行效率高;Hashtable线程安全的,很多方法都有synchronized修饰,但同时因为加锁导致单线程环境下效率较低。
2、HashMap允许有一个key为null,允许多个value为null;而Hashtable不允许key或者value为null。
3、HashMap的底层数组的长度必须为2^n,这样做的好处是为以后的hash算法做准备,而Hashtable底层数组的长度可以为任意值,这就造成了当底层数组长度为合数的时候,Hashtable的hash算法散射不均匀,容易产生hash冲突
二十七、JSP有哪九大隐式对象及四个作用域
九大隐式对象:
1. request对象
2. response对象
3. out对象
4. session对象
5. application对象
6. config对象
7. pageContext对象
8. page对象
9. exception对象
四个作用域:
1.request:在当前的请求中有效
2.session:在当前的会话中有效
3.application:在所有应用程序中有效
4.page:在当前页面中有效
二十八、String常用方法
1、length():查看字符串的长度
2、charAt():定位某个字符,根据下标获取对应的字符
3、substring():截取子串
4、trim():去掉首尾空格
5、split():以指定字符进行分割
6、equals():判断两个串是否相等
7、valueOf():类型转换
8、lastIndexOf():某个字符最后一次出现的位置
二十九、业务流程
前端发送请求-->经过防火墙-->
三十、SpringBoot启动原理
@SpringBootApplication:启动类注解
包含了三个重要的组合注解
1、@SpringBootConfiguration:实现配置文件的功能
2、@EnableAutoConfiguration:根据类下面的jar包动态加载配置和注入Bean
3、@ComponentScan:组件扫描
三十一、创建对象有哪些方法?
1、使用new关键字
2、使用反射创建实例
3、使用克隆技术
4、使用反序列化创建实例
三十二、事务隔离级别
由低到高依次为Read uncommitted、Read committed、Repeatable read、Serializable
1、Read uncommitted:读未提交,可以读到未提交的内容。因此,在这种隔离级别下,查询是不会加锁的,也由于查询的不加锁,所以这种隔离级别的一致性是最差的
2、Read committed:读已提交,只能读到已经提交了的内容。这是各种系统中最常用的一种隔离级别
3、Repeatable read:可重复读,专门针对“不可重复读”这种情况而制定的隔离级别,自然,它就可以有效的避免“不可重复读”。而它也是mysql的默认隔离级别。
4、Serializable:串行化,这是数据库最高的隔离级别,这种级别下,事务“串行化顺序执行”,也就是一个一个排队执行。执行效率差,性能开销也最大,基本没人用
三十三、数据库有哪些引擎
1、InnoDB引擎
这是MySQL 5.5或更高版本的默认存储引擎。它提供了事务安全(ACID兼容)表,支持外键引用完整性约束。
2、ISAM引擎
ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。
3、MYISAM引擎
MYISAM是MYSQL的ISAM扩展格式和缺省的数据库引擎。除了提供ISAM里所没有的索引和字段管理的大量功能,MYISAM还使用一种表格锁定的机制,来优化多个并发的读写操作。
三十四、数据库事务的四大特性
四大特性:
(1)、原子性:不可分割,事务中的操作要么都执行,要么都不执行
(2)、一致性:事务前后数据保持一致
(3)、隔离性:事务并发执行,A事务与B事务是隔离运行的
(4)、持久性:事务一旦提交,就从内存中保存到硬盘上,永久有效
三十五、如何把两个集合的数据封装到一个集合里面
1、a.addAll(b)方法,直接把b集合添加到a集合中.
2、a,b两个集合,使用for循环根据下标获取b集合的数据再单个单个的添加到a集合中去
三十六、RabbitMQ有哪些模式
1、简单模式Hello World
2、工作队列模式Work Queue
3、发布/订阅模式 Publish/Subscribe
4、路由模式Routing
5、通配符模式Topic
三十七、负载均衡实现
负载均衡服务器的实现可以分成两个部分:
1、根据负载均衡算法和Web服务器列表计算得到集群中一台Web服务器的地址。
2、将请求数据发送到该地址对应的Web服务器上。
三十八、Spring中Bean的生命周期
实例化和属性赋值对应构造方法和setter方法的注入,初始化和销毁是用户能自定义扩展的两个阶段。
1、实例化 -> Instantiation
2、属性赋值 -> Populate
3、初始化 -> Initialization
4、销毁 -> Destruction
三十九、SpringBoot是什么
就是Maven项目,集成了各类项目,提供注解进行开发,并且简化了Spring众多框架中所需的大量且繁琐的配置文件,装备启动类代码,可以快速开启一个Web容器进行开发。
四十、怎么判断消息是否发送成功
1、用 Exchange 绑定相应的队列
2、消息通过 Exchange 发送到相应的队列
3、没有异常,则消息发送成功
4、消息发送失败则报错
四十一、Redis的持久化有哪些
RDB持久化: 在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储 。
AOF持久化: AOF 机制对每条写入命令作为日志,以 append-only 的模式写入一个日志文件中,在 redis 重启的时候,可以通过回放 AOF 日志中的写入指令来重新构建整个数据集。
通过RDB和AOF,都可以Redis内存中的数据持久化到磁盘中,也可以被分到其他地方,比如阿里云等。如果Redis挂了,可以从磁盘或者阿里云等地方拷贝数据到Redis中,重启Redis,Redis就会自动根据文件来重构数据。
如果同时使用RDB和AOF 两种持久化机制,那么在 redis 重启的时候,会使用 AOF 来重新构建数据,因为 AOF 中的数据更加完整。
RDB的优缺点:
优点:
一旦采用该方式,那么你的整个Redis数据库将只包含一个文件,这对于文件备份而言是非常完美的。
相对于 AOF 持久化机制来说,直接基于 RDB 数据文件来重启和恢复 redis 进程,更加快速。
缺点:
RDB 每次在 fork 子进程来执行 RDB 快照数据文件生成的时候,如果数据文件特别大,可能会导致对客户端提供的服务暂停数毫秒,或者甚至数秒。
AOF的优缺点:
优点:
AOF 可以更好的保护数据不丢失,一般 AOF 会每隔 1 秒,通过一个后台线程执行一次fsync操作,最多丢失 1 秒钟的数据。
AOF 日志文件以append-only模式写入,写入性能非常高,而且文件不容易破损。 如果我们本次操作只是写入了一半数据就出现了系统崩溃问题,不用担心,在Redis下一次启动之前,我们可以通过redis-check-aof工具来帮助我们解决数据 一致性的问题。
对于相同数量的数据集而言,AOF文件通常要大于RDB文件。RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
缺点:
类似 AOF 这种较为复杂的基于命令日志 / merge / 回放的方式,比基于 RDB 每次持久化一份完整的数据快照文件的方式,更加脆弱一些,容易有 bug。
四十二、ArrayList和LinkedList有什么区别
1、ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2、对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3、理论上来说在做新增和删除操作add和remove时,LinkedList比较占优势,因为ArrayList要移动数据。
四十三、数据库的三范式
1、列不可再分
1).每一列属性都是不可再分的属性值,确保每一列的原子性
2).两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据
2、属性完全依赖于主键
要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主键
3、属性不依赖于其它非主属性 属性直接依赖于主键
数据不能存在传递关系,即每个属性都跟主键有直接关系而不是间接关系。
四十四、项目怎么解决订单重复提交的问题
使用token机制解决
1、客户端申请token
2、服务器端生成token,并存放在session中,同时将token发送到客户端
3、客户端存储token,在请求提交时,同时发送token信息
4、服务器端统一拦截同一个用户的所有请求,验证当前请求是否需要被验证(不是所有请求都验证重复提交)
5、验证session中token是否和用户请求中的token一致,如果一致则放行
6、session清除会话中的token,为下一次的token生成作准备
7、并发重复请求到来,验证token和请求token不一致,请求被拒绝
四十五、常量池是什么
常量池是以表的形式存在(表是用来存储字符串值的,不存储符号引用),实际可以分两种,一种为静态常量池,另一种为运行时常量池,共有11中常量表,常量池的每一个常量都代表一张表。
四十六、List,Set,Map的区别以及使用场景
Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。
Map:适合储存键值对的数据
使用场景:
ArrayList是线程异步的,是不安全的。如果不考虑到线程的安全因素,一般用ArrayList效率比较高
HashSet是基于Hash算法实现的,为快速查找而设计的Set,我们通常使用HashSet
HashMap:适用于Map中插入、删除和定位元素。
四十七、JDK1.8的新特性是什么
1、Lambda表达式:Lambda允许把函数作为一个方法的参数(函数作为参数传递到方法中)。
2、默认方法:默认方法就是一个在接口里面有了一个实现的方法。
3、在HashMap底层中引入了红黑树结构
以上是关于面试问题总结的主要内容,如果未能解决你的问题,请参考以下文章