2021-07-17 【Java面经】【解答】更新中

看到这个面经,自己决定来回答下
面经来自
https://leetcode-cn.com/circle/discuss/oKOqNk/

文章目录

【一面】

1. String类型的几种存储方式,是否是线程安全的,两个字符串相加是否是新的实例?

我猜是想问StringBuilder(线程不安全)、StringBuffer(线程安全)
StringBuffer和StringBulider都继承自AbstractStringBuilder。StringBuffer的方法前有synchronized,是线程安全的。

String常量+String常量是新实例

2. Stringbuffer用append方式,对象是否发生变化?

不一定,看是否超出当前数组最大容量

AbstractStringBuilder的实现原理:我们知道使用StringBuffer等无非就是为了提高java中字符串连接的效率,因为直接使用+进行字符串连接的话,jvm会创建多个String对象,因此造成一定的开销。
AbstractStringBuilder中采用一个char数组来保存需要append的字符串,char数组有一个初始大小,当append的字符串长度超过当前char数组容量时,则对char数组进行动态扩展,也即重新申请一段更大的内存空间,然后将当前char数组拷贝到新的位置,因为重新分配内存并拷贝的开销比较大,所以每次重新申请内存空间都是采用申请大于当前需要的内存空间的方式

3. Java的值传递

**值传递:** 方法调用时,实际参数把它的值传递给对应的形式参数,函数接收的是原始值的一个copy,此时内存中存在两个相等的基本类型,即实际参数和形式参数,后面方法中的操作都是对形参这个值的修改,不影响实际参数的值。

引用传递: 也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,函数接收的是原始值的内存地址;
可拿基本类型int引用类型Integer打比方

4. Java内存区域的划分,线程共享的部分,哪些部分会有溢出的情况?

在这里插入图片描述

  • 线程共享区:方法区、堆
  • 线程私有区:虚拟机栈、本地方法栈、程序计数器

堆栈溢出

更多可参考:https://blog.csdn.net/qq_36470686/article/details/82957221

5. final类

不能被继承

拓展:final修饰变量
对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

6. static修饰符

static变量和main方法
1,执行static修饰的变量,首先寻找被static修饰的静态变量和静态代码块。
2,执行main()方法。被stiatic修饰的变量执行完毕后,执行main()方法(注:static方法没用调用不会执行),实际上main()也是被static修饰。

子类父类执行顺序:
1.父类的 static 语句和 static 成员变量
2.子类的 static 语句和 static 成员变量
3.父类的 非 static 语句块和 非 static 成员变量
4.父类的构造方法
5.子类的 非 static 语句块和 非 static 成员变量
6.子类的构造方法

7. 深拷贝和浅拷贝

举个例子
有个Person类实例person1,内有基本数据类型int对象age,和Address对象address
浅拷贝拷贝person1只会拷贝address的引用。深拷贝会新创建一个Address,并拷贝address的值

8. 简述map,set,list概念及用途。详述hashmap的存储结构

map:键值对映射
set:集合
list:线性列表

数组+链表
链表长度>=8时:红黑树
红黑树时间复杂度优于数组+链表,空间复杂度比数组+链表差

红黑树:

9. 创建线程方式,run和start的区别。几种线程池设计模式

run:就绪状态
start:运行状态

???不是很懂
难道是线程池设计模式?

10. mysql的char和varchar的区别;行级锁和表级锁的概念,以及给项目带来的影响

CHAR的长度是固定的,而VARCHAR的长度是可以变化的
char效率比varchar高
char输入不满后面会补空格,varchar不补
char(10)和varchar(10),同样输入“abc”,char10字节,varchar3字节

  1. 行级锁:引擎innoDB,对一行记录进行加锁。
  2. 表级锁:引擎 MyISAM,对整个表进行加锁。
  3. 页级锁:引擎 BDB,对查询出来的一页数据进行加锁。

表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高;
参考链接

【二面】

11. 介绍自己做的项目,其中的技术点、难点。关于项目的技术点,拓展聊了聊

12. TCP/IP握手过程,重传相关知识

网络经典知识,3次握手,4次握手,不赘述

13. TCP与UDP区别,TCP可靠性保证,拥塞控制与流量控制

网络经典问题,不赘述

14. http与https的区别,加密怎么加的?

15. 各种排序算法的方式、时间复杂度

手撕快排

堆排序

16. 哈希冲突解决方案,各个优缺点

17. 大文件里进行去重

首先基本思路是按行扫描,每行 hash,问题在于怎么比对这个 hash 值。

最简单自然放数组里,遍历遍即可。
也可以放 map 里,hash 值作为 key。
也可以把 hash 值简历成个字典树,查重时扫描这个树即可。
也可以直接用个布隆筛来做,把每行映射到布隆筛里,有 bit 不存在自然就不在,不过有一定几率误判。
也可以提前欲排序下,不过这个最后的结果是排序后的,不知道限制条件行不行,排序后再遍历遍判断前后是否有相等的即可。

链接:https://www.nowcoder.com/discuss/672000?channel=-1&source_id=profile_follow_post_nctrack
回答来源:牛客网

18. 进程和线程区别

进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响。
线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间。

19. 进程有哪些状态,sleep、yield、wait、join的区别

20. fork函数

21. 父子进程的区别,孤儿进程,僵尸进程会有什么问题,

22. 进程通信方式,进程间怎么同步,通信,消息队列,管道怎么实现的,

进程通信方式:
管道、消息队列、信号量、共享内存

23. 进程调度算法,各有什么优缺点

24. 用户态和内核态区别

25. Java双亲委派机制,打破双亲委派

26. volatile和synchronized区别

27. 数据库索引的选取

28. 设计模式,主要问单例模式、观察者模式、工厂模式及抽象工厂模式。

单例模式

懒汉模式
饿汉模式

观察者模式

工厂模式

抽象工厂模式

数据库
1.mysql索引是怎么实现的?b+树有哪些特点?真实的数据存在哪里?
2.哪些情况下建索引?解释下最左匹配原则?
现在一个表有三列a b c,组合索引(a,b,c)查询的时候where a like ? and b=? and c=?能用到这个组合索引吗?为什么?
3.explain执行计划看过没有?其中type字段都有哪些值?分别代表什么?
4.你有哪些sql调优经验?
mysql 有那些存储引擎,有哪些区别
mysql 索引在什么情况下会失效
mysql 的索引模型

Redis
1.redis有哪几种数据结构?给你一个key怎么知道是用的哪种结构?
2.怎么查看所有的key?redis怎么切换库?怎么清数据?
3.描述下redis淘汰策略?如果没有数据可以淘汰活着没有配置淘汰策略读请求可以正常执行吗?
4.你们项目里redis是单节点的吗?如果多节点怎么同步?
5.项目里用redis存哪些数据?为什么用redis?和jetty本地缓存有什么区别?

innodb 与myisam 的区别?
mysql 主从同步怎么搞的?分哪几个过程?如果有一台新机器要加到从机里,怎么个过程。
乐观锁与悲观锁的区别?
binlog 日志是 master 推的还是 salve 来拉的?
redis 持久化有哪几种方式,怎么选?
redis 主从同步是怎样的过程?
redis 的 zset 怎么实现的?
redis key 的过期策略
tcp 的握手与挥手
select 和 epoll的区别
http与https的区别,加密怎么加的?
raft算法和zk选主算法
Kafka 选主怎么做的?
kafka 与 rabbitmq区别
kafka 分区怎么同步的
kafka 怎么保证不丢消息的
kafka 为什么可以扛住这么高的qps
http各种返回码,401和406啥区别?
redis 哨兵和集群
kafka partition broker consumer consumer group topic 等都是啥关系?
两个单向链表,返回求和后的链表结构,例如2->3->1->5,和3->6,结果返回2->3->5->1

java面经-百度准入职老哥整理.pdf》是一份关于百度准入职面试的Java面经整理。这份面经是由百度准入职的老哥整理而成,其记录了一些面试时可能会遇到的问题以及解答方法。 这份面经对于准备参加百度准入职面试的人来说非常有价值。首先,它列出了一些常见的面试问题,涵盖了Java语言的各个方面,包括基础知识、数据结构与算法、设计模式、多线程、网络编程等等。通过仔细研究和复习这些问题的答案,可以帮助面试者全面了解Java语言的特性和应用。 其次,这份面经还提供了问题的解答思路和方法,帮助面试者理清思路,正确回答问题。这对于很多面试者来说特别有帮助,因为在面试时有时会遇到一些棘手的问题,有了这份面经的指导,面试者可以更好地掌握应对策略。 不过需要注意的是,面经作为一份参考资料,不能完全依赖于它来准备面试。面试官可能会问一些不在面经列出的问题,因此考生还是需要自己对Java语言有充分的了解,并能够熟练运用。同时,面试官还会关注考生的沟通能力、解决问题的能力以及对新技术的学习和掌握能力。 总体来说,《java面经-百度准入职老哥整理.pdf》是一份非常宝贵的资料,可以帮助面试者对Java面试可能会遇到的问题有更深入的了解,提供了解答思路和方法。但记住,面试准备还需要多方面的知识积累和实践经验的积累,才能在面试展现自己的优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值