Java面试通关宝典(一)

Wesley13
• 阅读 477

前言

年后是跳槽的高峰期,相信有不少朋友已经跃跃欲试了。想要找到好工作,离不开充分的面试准备。刚好沉思君最近在网上看到一份Java面试知识点,觉得很不错,所以摘录了其中比较典型的面试题并给出我的参考答案,供大家参考,如果有不同意见,可以在下方留言,我看到了会一一回复。废话不多说了,接下来我们就直奔主题。

面试题精选

1.HTTP请求的GET方法与POST方法的区别

根据RFC7231的定义,HTTP请求方法是用来表示客户端发送该请求的目的以及当请求成功时客户端期望从服务器获取的结果。 HTTP请求方法有如下特性:安全性、幂等性与可缓存性。安全性指的是客户端向服务端的资源发起的请求如果使用了安全的方法,就不应该引起服务端任何的状态变化,如果一个方法的语义在本质上是只读的,那么这个方法就是安全的。幂等性指的是同一个请求方法执行多次和仅执行一次的效果完全相同,引入幂等主要是为了处理同一个请求重复发送的情况,比如在请求响应前失去连接,如果方法是幂等的,就可以放心地重发一次请求。可缓存性顾名思义就是一个方法的响应内容是否可以被缓存。

GET方法用于用户向服务器请求特定的资源,因此没有请求体,是安全、幂等、可缓存的。POST方法的语义是向服务器发送数据,可以有请求体,它不是安全的,因为其可能引起服务器状态变化,也不是幂等的,所以重复发送请求会产生不同的效果,它一般是不可缓存的,除非在响应体中包含了“新鲜度”信息。

关于HTTP缓存,可以阅读沉思君之前的文章《详解HTTP缓存》进行深入学习。

2. Session与Cookie的区别

由于HTTP是无状态的,在HTTP通信过程中为了实现状态保持,可以使用Session机制。Session存储了用户或客户端的状态信息,其通常是保存在服务端的内存中,并会设置一个过期时间。那么服务端如何确定哪个用户或客户端对应哪个Session呢?很简单,只要客户端发送HTTP请求时带上一个SessionId过来就行了。这个SessionId一般存储在Cookie中,而Cookie是存储在浏览器或客户端的,通常也会设置一个过期时间,还会指定某个Cookie对应哪个域名,当浏览器向该域名下的服务器发送HTTP请求时,会自动带上未过期的Cookie,这样一来服务端就能从Cookie中拿到SessionId,将该次HTTP请求与服务端保存的Session关联起来,从而实现状态保持。

关于HTTP的状态保持,可以阅读沉思君之前的文章《谈谈HTTP状态保持》进行深入学习。

问题延伸:如果浏览器禁用了Cookie,如何实现Session状态保持?

3.Session分布式处理

在上一题中说到,Session信息默认是存储在服务器内存中的,而在生产环境中,我们通常会部署多台服务器,客户端发送的HTTP请求一般要先通过负载均衡器才能到达具体的后台服务器,这就会导致每次HTTP请求可能落到不同的服务器上,因此就会出现Session在分布式环境下失效的问题。Session分布式处理一般有如下几种思路:

  1. 将每个相同客户端都路由到同一台服务器。比如通过计算ip的Hash值,将来自相同ip的HTTP请求都路由到同一台服务器上,这样一来从相同ip发起的HTTP请求都能到达同一台服务器,也就每次都能获取到Session信息了。

  2. Session同步。这种方式的Session信息还是保存在服务端内存,但是每个服务器之间需要进行Session同步,这样一来每台服务器上都有所有用户的Session信息,也就不会出现Session失效的问题了。

  3. Session集中存储。这种方式指的是不将Session存储在服务器内存,而是进行集中存储,比如存储在分布式缓存Redis中,这样的话就可以实现Session共享,也能够解决Session失效问题。

问题延伸:上述三种Session分布式处理方案各有什么优缺点?

4.ThreadLocal原理分析

ThreadLocal是一个保存线程本地化变量的容器,当在多线程环境下使用ThreadLocal维护变量时,其会为每个线程分配一个独立的变量副本,这样一来每个线程都只能对其变量副本进行读写而不会影响到其他线程的变量副本,从而保证了线程安全。ThredLocal的实现是这样的,首先在每个线程对象内部保存了一个map,这个map的key是ThreadLocal实例,value是ThreadLocal中要保存的值,每当使用ThreadLocal对变量副本进行set的时候,首先会从当前线程对象内部拿到相应的map,然后将ThreadLocal实例自身作为key,要保存的值作为value,put进map中,这样一来就实现了每个线程保存了独立的变量副本,它们之间互不影响。

问题延伸:聊聊ThreadLocal的内存泄露问题。

由于篇幅所限,后续再介绍更多经典的面试题。

如果觉得写得不错,可以扫描下方二维码进行关注:

Java面试通关宝典(一)

如果想与各行各业的技术大牛一起指点江山、激扬文字,可以在公众号后台回复“进群”,即可获得与大牛近距离交流的机会。

此外,沉思君利用业余时间整理了海量的视频学习资源,涵盖前后端、大数据、机器学习、运维、微服务、算法……在此免费赠送给各位爱学习的小伙伴们,领取方式很简单,只需在公众号后台回复“学习”二字或者点击文末“阅读原文”链接即可领取。

本文分享自微信公众号 - 码农沉思录(code-thinker)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这