面试问题总结

Posted Java小周

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试问题总结相关的知识,希望对你有一定的参考价值。

目录

一、HashSet为什么可以做去重的一个作用

二、HashMap的底层实现

三、HashMap的容量怎么计算

四、wait和sleep有什么区别?

五、什么是死锁?

六、怎么避免死锁?

七、String和StringBuilder、StringBuffer的区别?

八、回文的设计

九、数据库优化

十、什么是穿透跟击穿以及雪崩?

十一、怎么在Redis上做优化?

十二、怎么让Redis跟数据库的数据保持一致?

十三、高并发场景怎么去设计?

十四、怎么保证数据传输的安全性?

十五、单点登录怎么实现?

十六、购物车怎么实现?

十七、token跟cookie的区别

十八、如何避免sql注入攻击

十九、什么是服务熔断

二十、微服务的优缺点

二十一、微服务之间如何通信

二十二、MVC的执行流程

二十三、MVC有哪些注解

二十四、怎么监控服务

一、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基于不同的语言及框架封装的一些列客户端工具,这些工具完成了追踪数据的生成与上报功能

以上是关于面试问题总结的主要内容,如果未能解决你的问题,请参考以下文章

面试问题总结(一)Golang

Java常见面试问题总结

Java开发基础面试题,java研发工程师年终总结

面试问题总结

在Java面试中常会遇到的技术问题总结

Nginx常见面试问题总结