你舔的HR,也许在舔别人
共 8071字,需浏览 17分钟
·
2024-04-18 14:44
大家好,我是二哥呀。
牛客上刷到这条帖子:“你添的 HR,也许在添别人”,牛友把学校改成浙大后,一大波 HR 争先恐后地“我们公司正在招贤纳士,求一份你的简历啊!”
甚至还有贴心的牛友将其总结成了样板代码:
if (学校 equals 985) {
HR.sendMessageToyou("求一份简历")
}
else {
if (youSendResumeToHR().学校 not equals 985)
print("您的简历与职位不匹配")
}
估计很多 211、双非的同学看到这就直接破防了,但我还是想给大家加加油打打气,只要你有计划有目标的执行,结果就不会差。因为 985 的同学还是极少数,要知道我们河南省就一所 211(😭)
星球里去年就有很多双非的同学,最后秋招的结果都很不错。就像下面球友,我相信他研二秋招的时候也一定能够拿到理想的 offer,不然你过来把我脸打肿,我绝不还手。
还是那句话,踏踏实实准备,自助者天助之。如果你能够按照我的要求把 Java 后端四大件吃透,搞两个项目,一个业务一个轮子,LeetCode 刷个 200 题,计算机网络和操作系统中常见的那几个八股背会(面渣逆袭上有标注),校招就能轻松拿捏~
好,这次我们就以球友向往的宇宙厂字节跳动为例,来看看同学 3 的 Java 后端二面为例,来看看字节面试官都喜欢问哪些问题。
大家在准备的时候一定要有的放矢,内容较长,建议大家先收藏起来,面试的时候大概率会碰到,我会尽量用通俗易懂+手绘图的方式,让天下所有的面渣都能逆袭 😁
1、二哥的 Linux 速查备忘手册.pdf 下载 2、三分恶面渣逆袭PDF离线版:https://t.zsxq.com/04FuZrRVf 3、三分恶面渣逆袭在线版:https://javabetter.cn/sidebar/sanfene/nixi.html
字节跳动面经(详细)
什么是三大范式,为什么要有三大范式,什么场景下不用遵循三大范式,举一个场景
三大范式的作用是为了减少数据冗余,提高数据完整性。
①、第一范式(1NF):确保表的每一列都是不可分割的基本数据单元,比如说用户地址,应该拆分成省、市、区、详细信息等 4 个字段。
②、第二范式(2NF):在 1NF 的基础上,要求数据库表中的每一列都和主键直接相关,而不能只与主键的某一部分相关(主要针对联合主键)。
比如说在一个订单表中,可能会存在订单编号和商品编号,设计出来的表可能是这样的。
这个订单表中就存在冗余数据,比如说商品名称、单位、商品价格等,应该将其拆分为订单表、订单商品关联表、商品表。
③、第三范式(3NF):在 2NF 的基础上,消除非主键列对主键的传递依赖,即非主键列只依赖于主键列,不依赖于其他非主键列。
比如说在设计订单信息表的时候,可以把客户名称、所属公司、联系方式等信息拆分到客户信息表中,然后在订单信息表中用客户编号进行关联。
在实际开发过程中,三大范式有时候反而成为了老太婆的裹脚布,让表的设计变得复杂而又啰嗦,就像第二范式中提到的订单详情表,把商品价格和名称放在订单表中可以减少额外的 JOIN 操作,提高查询效率。
什么是SQL注入,怎么避免,什么是参数化
SQL 注入是一种代码注入技术,通过在输入字段中插入专用的 SQL 语句,从而欺骗数据库执行恶意 SQL,从而获取敏感数据、修改数据,或者删除数据等。
比如说有这样一段代码:
studentId = getRequestString("studentId");
lookupStudent = "SELECT * FROM students WHERE studentId = " + studentId
用户在输入框中输入 117 进行查询:
实际的 SQL 语句类似于:
SELECT * FROM students WHERE studentId = 117
这是我们期望用户输入的正确方式。但是,如果用户输入了117 OR 1=1
,那么 SQL 语句就变成了:
SELECT * FROM students WHERE studentId = 117 OR 1=1
由于1=1
为真,所以这个查询将返回所有学生的信息,而不仅仅是 ID 为 117 的学生。
为了防止 SQL 注入,可以采取以下措施:
①、使用参数化查询
使用参数化查询,即使用PreparedStatement
对象,通过setXxx
方法设置参数值,而不是通过字符串拼接 SQL 语句。这样可以有效防止 SQL 注入。
String query = "SELECT * FROM users WHERE username = ?";
PreparedStatement pstmt = connection.prepareStatement(query);
pstmt.setString(1, userName); // userName 是用户输入
ResultSet rs = pstmt.executeQuery();
?
是一个参数占位符,userName 是外部输入。这样即便用户输入了恶意的 SQL 语句,也只会被视为参数的一部分,不会改变查询的结构。
②、限制用户输入
对用户输入进行验证和过滤,只允许输入预期的数据,不允许输入特殊字符或 SQL 关键字。
③、使用 ORM 框架
比如,在 MyBatis 中,使用#{}
占位符来代替直接拼接 SQL 语句,MyBatis 会自动进行参数化处理。
<select id="selectUser" resultType="User">
SELECT * FROM users WHERE username = #{userName}
</select>
假如 userName 传入的值是 9;DROP TABLE SYS_USER;
,传入的删除表 SQL 也不会执行,因为它会被当作参数值。
SELECT * FROM users WHERE username = '9;DROP TABLE SYS_USER;'
mysql怎么存emoji,怎么编码
MySQL 的 utf8 字符集仅支持最多 3 个字节的 UTF-8 字符,但是 emoji 表情(😊)是 4 个字节的 UTF-8 字符,所以在 MySQL 中存储 emoji 表情时,需要使用 utf8mb4 字符集。
ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
MySQL 8.0 已经默认支持 utf8mb4 字符集,可以通过 SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
查看。
什么是深分页,select * from tbl limit 1000000000这个有什么问题,如果表大或者表小分别什么问题
深分页指的是在分页查询中,请求的页数非常大,例如请求第100万页的数据。在这种情况下,数据库需要跳过前999999页的数据,会消耗大量的CPU和I/O资源,导致查询性能下降。
select * from tbn limit 1000000000
正是一个深分页查询。
-
如果表的数据量非常大,那么这个查询可能会消耗大量的内存和CPU资源,甚至可能导致数据库崩溃。 -
如果表的数据量非常小,比如说只有 100 条,那就会返回这前 100 条,虽然没什么性能影响,但这个查询本身没什么意义。
一个表(name, sex,age,id),select age,id,name from tblname where name='paicoding';怎么建索引
索引的建立应当基于查询中的过滤条件(WHERE 子句)以及查询的选择列(SELECT 子句)。
由于查询条件是name='paicoding'
,所以应当为name
字段建立索引。
CREATE INDEX idx_name ON tblname(name);
查询中选择了age
、id
和name
字段,如果这三列经常一起使用,可以考虑建立包含这些字段的联合索引。可以将查询条件中的字段放在联合索引的首位,这样查询时可以利用索引覆盖,直接从索引中获取数据,而不需要再去查找数据行。
CREATE INDEX idx_name_age_id ON tblname (name, age, id);
http和https的区别,https是怎么建立连接,https是对称还是非对称加密
-
HTTPS 是 HTTP 的增强版,在 HTTP 的基础上加入了 SSL/TLS 协议,确保数据在传输过程中是加密的。SSL/TLS 需要向 CA(证书权威机构)申请数字证书,用于验证服务器的身份。 -
HTTP 的默认端⼝号是 80,URL 以 http://
开头;HTTPS 的默认端⼝号是 443,URL 以https://
开头。
HTTPS 的连接建立在 SSL/TLS 握手之上,主要分为以下几个步骤:
①、客户端向服务器发起请求
②、服务器接收到请求后,会返回自己的数字证书,包含了公钥、颁发机构等信息。
③、客户端收到服务器的数字证书后,会验证证书的合法性,如果合法,就会生成一个随机码,然后用服务器的公钥加密这个随机码,发送给服务器。
④、服务器收到会话密钥后,用私钥解密,得到会话密钥。
⑤、客户端和服务器通过会话密码对通信内容进行加密,然后传输。
如果通信内容被截取,但由于没有会话密钥,所以无法解密。当通信结束后,连接会被关闭,会话密钥也会被销毁,下次通信会重新生成一个会话密钥。
HTTPS 在不同阶段会使用不同的加密方式:
-
非对称加密:在握手阶段使用,特别是在密钥交换过程中。非对称加密使用公钥和私钥,其中公钥可以公开,私钥保密。客户端使用公钥加密信息,服务器使用私钥解密。 -
对称加密:在完成握手后,所有的数据传输都使用对称加密。对称加密使用相同的密钥进行加密和解密,这种加密方式比非对称加密更快。
http的响应号有哪些
HTTP 响应状态码是由服务器返回给客户端,用于表示对请求的响应结果。
这些状态码分为五个不同的类别,每个类别用一个数字开头,共有三位数:
-
1XX:临时的响应,客户端应继续请求。 -
2XX:请求已成功被服务器接收。 -
3XX:用来重定向。 -
4XX:请求可能出错。 -
5XX:服务器在尝试处理请求时发生了错误。
http有哪些方法,http的get方法可以实现写操作吗,https传递url安全吗,为什么数据在浏览器中,中间人攻击是什么
HTTP 协议定义了多种请求方式,用以指示请求的目的。常见的请求方式有 GET、POST、DELETE、PUT。
-
GET:请求检索指定的资源。应该只用于获取数据,并且是幂等的,即多次执行相同的 GET 请求应该返回相同的结果,并且不会改变资源的状态。 -
POST:向指定资源提交数据,请求服务器进行处理(如提交表单或上传文件)。数据被包含在请求体中。可能会创建新的资源或修改现有资源。 -
DELETE:删除指定的资源。 -
PUT:用于替换指定的资源。如果指定的资源不存在,创建一个新资源。
HTTP 的 GET 方法可以实现写操作吗?
可以是可以,但是不推荐。
使用 GET 执行写操作可能导致严重的安全问题,如跨站请求伪造(CSRF)。
实际开发中,也应该杜绝使用 GET 方法执行写操作。在技术派实战项目中,我们会在接口上明确规定应该使用哪种请求方式。
客户端一旦使用错误❎,将会收到一个 405 Method Not Allowed 的响应。
HTTPS 会加密 URL 吗?
HTTPS 通过 SSL/TLS 协议确保了客户端与服务器之间交换的数据被加密,这包括 HTTP 头部和正文。
而 URL 是 HTTP 头部的一部分,因此这部分信息也是加密的。
但因为涉及到 SSL 握手的过程,所以域名信息会被暴露出来,需要注意。
另外,完整的 URL 可能在 Web 服务器的日志中记录,这些日志可能是明文的。还有,URL 在浏览器历史记录中也是可见的。
因此,敏感信息永远不应该通过 URL 传递,即使是在使用 HTTPS 的情况下。
什么是中间人攻击?
中间人攻击(Man-in-the-Middle, MITM)是一种常见的网络安全威胁,攻击者可以在通信的两端插入自己,以窃取通信双方的信息。
在很多电影中,都会存在这样的场景:主角通过某种方式,将自己伪装成中间人,然后窃取通信双方的信息,阿汤哥的碟中谍中就有很多类似的手笔。
中间人攻击是一个缺乏相互认证的攻击,因此大多数加密协议都会专门加入一些特殊的认证方法,以防止中间人攻击。像 SSL 协议,就是通过验证服务器的数字证书,是否由 CA(权威的受信任的数字证书认证机构)签发,来防止中间人攻击的。
参考链接
-
三分恶的面渣逆袭:https://javabetter.cn/sidebar/sanfene/nixi.html -
二哥的 Java 进阶之路:https://javabetter.cn
ending
一个人可以走得很快,但一群人才能走得更远。二哥的编程星球已经有 5000 多名球友加入了,如果你也需要一个良好的学习环境,戳链接 🔗 加入我们吧。这是一个编程学习指南 + Java 项目实战 + LeetCode 刷题的私密圈子,你可以阅读星球专栏、向二哥提问、帮你制定学习计划、和球友一起打卡成长。
两个置顶帖「球友必看」和「知识图谱」里已经沉淀了非常多优质的学习资源,相信能帮助你走的更快、更稳、更远。
欢迎点击左下角阅读原文了解二哥的编程星球,这可能是你学习求职路上最有含金量的一次点击。
最后,把二哥的座右铭送给大家:没有什么使我停留——除了目的,纵然岸旁有玫瑰、有绿荫、有宁静的港湾,我是不系之舟。共勉 💪。