Java实战和面试宝典

news2025/2/25 3:40:48

这是一篇记录工作和学习过程中遇到的一些问题的文章,每个问题都很有代表性,值得不断回顾和深入思考的,答案未必十分准确,但可以作为一种参考,共勉!

读了这篇不一样的八股文,你将至少拥有三年经验^_^【持续更新中】

目录

一、基础篇

二、框架篇

三、中间件篇

四、算法篇

五、场景篇 


一、基础篇

 1.包装类Boolean是值传递还是引用传递?

代码:

public class TEST {
    public static void main(String[] args) {
        Boolean flag = new Boolean(true);
        setFalse(flag);
        System.out.println(flag);
    }

    private static void setFalse(Boolean flag) {
        flag = new Boolean(false);
    }

}

flag仍旧输出true;

在Java中,所有的参数都是按值传递的,而不是按引用传递的。这意味着你在传递一个对象作为参数时,实际上是将对象的副本传递给了函数。因此,在这个例子中,当你调用setFalse()方法时,它会接收到一个Boolean类型的副本,并将其设置为false。但是原始的flag仍旧保持着原来的值,因为它没有被直接修改。

如果你想在方法中更改原始变量的值,你需要使用一个可变对象类型,例如一个数组或者一个自定义类。你可以将Boolean对象包装在一个数组中,然后将该数组作为参数传递给setFalse()方法。这样就可以修改数组第一个元素,从而更改原始的Boolean值。

结论:当你把整个对象作为引用赋值给参数对象时,实际上只是传递进来的一个拷贝,你修改这个拷贝并不影响这个被传递的引用对象本身,但它如果有内部属性的话,是可以被重新设置的。

参考:【JAVA】值传递与引用传递_java值传递和引用传递-CSDN博客

 2. HashMap链表转红黑树为什么是大于8?

 HashMap链表转红黑树的操作,以提高查找的速度,红黑树的时间复杂度O(logn),而链表是O(n/2),因此只在O(logn)<O(n/2)时才会进行转换,也就是以8作为分界点。HashMap的链表是双向的,寻找小于链表长度一半的节点从头节点检索,否则从尾节点检索。

3.内存告警,但CPU不高,dump中的也只有30M,我们2核4G的机器上配置了3G的内存

启动指令:

nohup nice java -jar -DfileEncoding=utf-8 -Dserver.port=$RUN_PORT -Xms3000m -Xmx3000m -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+PrintGCDetail -jar ${JAR_FULLNAME}>dev/null 2>&1 &

具体表现:

普罗米修斯显示堆内存占用82%,但是老年代还没达到GC的阈值,所以不能触发FULL GC,

但是我们机器的物理内存确占用大于96%,再下去可能宕机。

进程在申请内存时并不是直接分配物理内存的,而是分配一块虚拟空间,到真正堆这块虚拟空间写入数据时才会通过缺页异常(Page Fault)处理机制分配物理内存,也就是我们看到的进程Res指标。

当我们服务启动时,物理内存时一条上升的线,在不断生成对象的过程中堆内存达到-Xmx,然后物理内存就不会释放了,就会看到一条直线,而且FULL GC不会释放物理内存,因为频繁对内存扩容和缩容很耗费性能。

结论:这个内存使用变化是正常的,只是-Xmx设置的太大了,然后java对象占用的内存达到之后这个值以后,物理内存就下不来了,重新指定-Xmx的值就行了。
 参考:JAVA 服务内存占用太高_java内存占用高怎么解决_summer_west_fish的博客-CSDN博客

 4.MySQL索引最佳实践有哪些?

①最左匹配原则

指的是查询从索引的最左前列开始并且不跳过索引中的列。

联合索引在查询的时候会先去比对第一个字段,第一个字段比对完成之后再去比对第二个字段,以此类推,不根据索引顺序查询无法精确定位到索引树的某个节点,导致无法根据索引树查找。


所以使用了联合索引,查找条件必须要按照联合索引字段出现的顺序排列,否则会导致索引失效。

②不在索引列上做任何操作(计算、函数、自动或者手动类型转换),会导致索引失效而转向全表扫描

SQL中对name字段取了前3位,索引树中没有执行函数之后的值,所以根本走不到索引。

需要考虑使用函数的结果是否可以在索引树中定位,而且还可以保持索引树依然有序。
③存储引擎不能使用索引中范围条件右边的列

SQL走了部分字段,key_len为78是name字段和age字段之和,position字段并没有走索引。
范围后面的字段都不会再走索引。如果是大于等于则能使用到后面的两个字段索引。

④尽量使用覆盖索引(索引列包含查询列),减少select * 语句
查询尽量指明具体的字段,且尽可能被联合索引覆盖,覆盖索引可以避免回表查询

⑤在使用<>,not in, not exists的时候无法使用到索引
当使用>,<,<>这些时,MySQL内部优化器会根据检索比例、表大小等多个因素整体评估是否使用索引

⑥is null,is not null一般情况下也无法使用索引
因为null值比较特殊,在索引树中的字段不好比对。一般建议将字段设置为not null,即便字段没有值,也要设置一个默认值,方便走索引,提高效率。

⑦like以通配符开头,mysql索引失效会变成全表扫描操作

%在前面相当于查询是跳过了前面的部分字符,截取部分去查询,这剩下的部分已经不再有序了,所以不会用到索引。

而%在后面相当于最左前缀,从最开始的字符串匹配,在索引树中的数据还是有序的,所以可以使用索引。
⑧字符串不加单引号索引失效
查询的时候尽量使用相同类型,否则mysql在检测到类型不匹配时,底层可能会强转类型或者使用函数进行转换从而被放弃走索引。

二、框架篇

1.Spring如何解决循环依赖问题?

Spring能解决的循环依赖场景是setter注入的单例Bean,Spring通过三级缓存方案进行解决。

初始化的Bean先放入三级缓存(singletonFactory),填充依赖时从三级缓存中取出并放入二级缓存(early半成品),在此过程中可升级bean(SmartInstantiationAwareBeanPostProcessor.getEarlyBeanReference,如AOP中的AbstractAutoProxyCreator),最终完成填充后放入一级缓存(成型的singleton)。

还有一些失效场景:启用@Async+@EnableAsync,A和B相互依赖,但是A中含有@Async修饰的方法,按照缓存解决循环依赖的思路,A初始,填充B,B初始,填充时从三级缓存拿到A,并放到二级缓存(中途在getEarlyBeanReference中可以执行增强操作),最终B完成放入一级缓存,再回到A的填充阶段,一级缓存中拿到了B并填充,最终A填充完毕,执行初始化动作,因为被@Async修饰,因此需要被AOP动态代理,需要用到Bean对象增强处理器(AsyncAnnotationBeanPostProcessor,后置处理器。它只在一处postProcessorAfterInitization()实现了对代理对象的创建,未实现getEarlyBeanReference),最终A被增强了,但是B填充的A是普通对象,因此就失效了。
参考:今天一定要搞清楚Spring怎么解决循环依赖 - 掘金

2.Spring中@Lazy注解加在类上不起作用?

@Lazy是复制阶段的beanPostProcessor做的。
A依赖B期待B延迟初始化,即使B上面加了延迟初始化,它也会进行初始化。因为@Autowire没有增加@Lazy注解去标识这个属性不需要注入,所以会强行注入。

@Lazy注入的是代理对象,只有真正调用它方法时才会创建对象。
很多解决循环依赖的方法,归根到底都是推迟依赖bean的创建。

三、中间件篇

1.Redis预扣库存在并发场景下怎么将库存同步到数据库

可以考虑两种方式:
一是通过定时任务同步,redis预减在并发环境下是可靠的,然后每秒钟同步一下,保证最终一致就行。

二是redis扣减后,发布MQ消息,然后再更新数据库,sql应为set stock = stock - 1,通过行级锁保证数据的准确性。

2.RabbitMQ中防止消息被重复消费,方案:使用redis存储已消费的数据,每次消费时判断redis中是否有该条数据,如果有则不消费,没有则消费,那么当redis宕机了怎么办判断消息是否重复消费呢?

一是在业务侧处理时,业务状态做流转变更,缓存判断后再通过业务状态进行判断。

二是保证消息可查,消息除缓存外做持久化,消息被消费后重新进行标记,这样可以对重复消息或者未消费消息进行最终一致性补偿。

四、算法篇

1. 余弦相似度(COS)计算测试

 

 根据题目公式实现算法,三行为一组然后两两计算余弦相似度,再取三个最大值输出。具体步骤如下:

1.相同的caseid为一组,选取两组
2.两组的weight分别相乘求和作为分子
3.一组的weight平方相加再开方与另外一组相乘作为分母。
4.求出多个余弦相似值,然后进行排序,取出最大三个值输出。

2. 抽奖系统设计要求百万分之几的中奖概率如何设计?

第一种:在0-999999中取一个随机数,如果它的大小在0-3之间即为中奖。

第二种:如果当前的中奖概率是3/1000000,那就以1~1000000的范围去随机生成三个数,比如生成的三个随机数是10、20、30分别当做key存到redis中,开始抽奖的时候就同样在1~1000000的范围中随机生成一个数,然后去redis中匹配,匹配到就算中奖。

五、场景篇 

1. 公司要做一个服务区车辆出入检测的项目,现在要从别的公司的数据库表(一张表,只能查)里拿数据,拿到以后做分类整理,根据需求存入到不同的表里。这个项目里有一个可视化大屏,如何去实时获取数据比较好呢?定时任务存在延迟,mq的话感觉又太频繁了(这个服务区的车流量大概每天3000)

平均每分钟两三辆车出入服务区,高峰期可能要多些,可以按照这个频率或者大屏图表刷新的频率调度定时任务。如果有条件使用MQ的话更好,而且我认为也不存在太频繁的问题,自带削峰填谷特性可以很好满足这个场景。

2.1000万数据如何导出到Excel 

 一个Excel可以放10万条数据,循环开启线程,每个线程负责将数据取出并导出到一个Excel或者Sheet,线程编号以保证文档数据有序,每次查询的数据不宜过大,以避免OOM。

 3.SpringCloud项目中如何对接口进行鉴权?

 一种常见的实现方式是,将所有的请求都经过网关,网关作为所有请求的入口,在网关中对请求进行权限验证和路由转发。在这种方式下,网关是唯一的接口入口,可以在网关中进行全局的权限控制,包括对请求的身份认证和授权等。

另一种实现方式是,在每个服务模块中都实现自己的权限控制逻辑。这种方式下,每个服务模块都有独立的接口入口,可以在服务模块中控制对其提供的接口的访问权限。这种方式下,网关仅仅起到了路由转发的作用,没有对请求进行权限控制。
以上两种实现方式各有优劣,取决于具体的业务场景和需求。如果需要对所有请求进行全局的权限控制,第一种方式更为适合;如果每个模块需要单独控制对其提供接口的访问权限,第二种方式更为适合,另外这种方式下定时任务中的feign调用需要另开内部调用接口。

 4.你遇到一个解决不了的问题怎么办?

如果上网搜索不到相关资料,身边也没有人解决,那么可以考虑寻找替代的方案实现相近的效果。如果其它人可以解决,只是自己没有思路,就要加强学习。如果大家都解决不了,要及时向上级反馈,暴露风险,调整方案。

 4.hr面试需要注意什么?

(1)喜欢加班的人,能吃苦耐劳不计较报酬
(2)喜欢中庸,不要表现自己的特性
(3)喜欢稳定的,稳定超过一切包括技术、包括是否能做事
(4)性格不能过激,不要刻意表现出自己的过激个性,要适当克制自己情绪
(5)团队合作很重要,注重集体意识和团队合作的表达,切忌体现个人主义
(6)遇到善于领导他人、有组织力、健谈等表现你的领导力
(7)抗压,承担高压力工作,大事面前不慌张等表现优良工作品质的
(8)守时,按时完成任务
(9)是否有创造力等问题,选轻微同意或者轻微不同意,以免太抢眼容易挂
(10)前后不要矛盾,注意前后的连贯性,有些题目前面出现后面又会变形出现
(11)好交际的×
(12)喜欢人陪伴的×
(13)积极乐观√
(14)诚实守信√
(15)注重创新的形象√

 面试分享
1.介绍一下做过的项目及工作业绩
2.聊一个rpc框架的实现原理及架构设计
3.服务间调用慢处理方式,怎么定位问题
4.做微服务重构的时候遇到过哪些问题
5.还有一个就是框架里面tomcat框架线程设置多少,多线程怎么评估使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/619127.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

社交媒体品牌:如何通过11个步骤提升您的战略

您是否正在努力在社交媒体上留下自己的印记&#xff1f;您是否觉得您的品牌在无尽的视频和表情包中迷失了方向&#xff1f;在本文中&#xff0c;我们将为您提供11个技巧&#xff0c;帮助您制定社交媒体品牌战略并脱颖而出。但首先&#xff0c;让我们探讨什么是社交媒体品牌&…

正版软件 | DaisyDisk:Mac 电脑一流的磁盘空间管理工具

使用 Mac 工作时&#xff0c;平时创建并下载大量文件&#xff0c;但很容易忘记或者很少删除这些内容。但是有一天&#xff0c;您发现启动磁盘已红&#xff0c;但是自己又好似没有安装啥软件&#xff0c;这时候就会想到底是哪些数据占用了这么大的空间&#xff1f;&#xff01; …

【TA 100】2.3 HLSL常用函数介绍

一、基本数学运算 ● max&#xff08;a&#xff0c;b&#xff09; ○ 返回较大的 ● min&#xff08;a&#xff0c;b&#xff09; ○ 返回较小的 ● mul&#xff08;a&#xff0c;b&#xff09; ○ 两向量相乘&#xff0c;常用于矩阵运算 ● abs&#xff08;a&#xff09; ○ …

ThreeJS教程:地图案例(包围盒、正投影)

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 地图案例(包围盒、正投影) 地图案例(包围盒、正投影) 地图案例会涉及到几何体、包围盒、正投影相机三方面知识点。 平面填充几何体ShapeGeometry包围盒Box3正投影相机Orthograph…

MTK开发板-4G/5G联发科开发板相关方案定制

开发板是用于嵌入式系统开发的电路板&#xff0c;包括中央处理器、存储器、输入设备、输出设备、数据通路 / 总线和外部资源接口等一系列硬件组件。一般来说&#xff0c;开发板由嵌入式系统开发者根据开发需求自主定制&#xff0c;也可以由用户自己研究设计。开发板不仅是初学者…

进阶篇丨链路追踪(Tracing)很简单:链路成本指南

广义上的链路成本&#xff0c;既包含使用链路追踪产生的数据生成、采集、计算、存储、查询等额外资源开销&#xff0c;也包含链路系统接入、变更、维护、协作等人力运维成本。为了便于理解&#xff0c;本小节将聚焦在狭义上的链路追踪机器资源成本&#xff0c;人力成本将在下一…

十二、光照基础

第一部分概念 OpenGL ES的基础光照模型&#xff0c;目前opengl还无法模拟现实世界的复杂光照效果&#xff0c;但是为了效果上的逼真&#xff0c;还是引入了一些简单的模型来模拟光照效果&#xff0c; 这里介绍冯氏光照模型(Phong Lighting Model)模型&#xff0c;他是由三种元…

大数据:spark RDD编程,构建,RDD算子,map,flatmap,reduceByKey,mapValues,groupBy,

大数据&#xff1a;spark RDD编程 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&#xff0c;尤其s…

618有什么数码好物值得购买?2023值得入手的数码好物推荐

在618期间&#xff0c;有哪些值得入手的数码好物&#xff1f;很多人还不知道有哪些数码好物值得买的&#xff0c;本文推荐几款质量不错数码好物&#xff0c;助您尽情享受618购物买买买。 一、南卡OE不入耳蓝牙耳机 推荐理由&#xff1a; 南卡OE耳机是一款性价比超高的不入耳蓝…

进公司第一天当老板问:“测得怎么样了?”我懵逼了

当我入行做测试头两份年&#xff0c;觉的测试工作有时候似乎挺苦逼的&#xff0c;我太难了…… 前言 说实话&#xff0c;我真想从上面去掉"似乎"两个字&#xff0c;软件测试人&#xff0c;就是苦逼&#xff01;有的人曾抱怨过开发很糟糕&#xff0c;但我们没办法要求…

用AI生成思维导图的方法

写在前边&#xff1a; 这篇文章很简单&#xff0c;只为给自己做个记录。并且做一个简单的思考&#xff1a;明明很容易的东西&#xff0c;一旦陷入了思维困境中&#xff0c;就无法找到出去的路。这时候需要扩展思维或者他人提点。 正文&#xff1a; 就挺尴尬&#xff0c;之前…

计算机毕业论文内容参考|基于python的农业温室智能管理系统的设计与实现

文章目录 导文文章重点前言课题内容相关技术与方法介绍技术分析技术设计技术设计技术实现方面系统测试和优化总结与展望本文总结后续工作展望导文 计算机毕业论文内容参考|基于python的农业温室智能管理系统的设计与实现 文章重点 前言 本文介绍了一种基于Python的农业温室智…

玩过Tauri和Electron,最终我选择Flutter进行跨平台应用开发

Flutter、Tauri 和 Electron 都是现代桌面应用程序开发的流行选择&#xff0c;每种技术有其独特的优缺点&#xff0c;下面我们就来对它们进行一个全面的技术对比。 一、Flutter Flutter 是 Google 推出的一款开源的 UI 工具包&#xff0c;用于构建高性能、高保真度的移动、We…

2023年6月杭州/广州/深圳NPDP产品经理认证找这里

产品经理国际资格认证NPDP是新产品开发方面的认证&#xff0c;集理论、方法与实践为一体的全方位的知识体系&#xff0c;为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会&#xff08;PDMA&#xff09;成立于1979年&#xff0c;是…

从搜索电商,社交电商到兴趣电商如何进化

【搜索电商】需求>联结>信任 淘宝、天猫、京东这些是属于什么电商&#xff1f; 答&#xff1a;这些都是属于搜索电商。 某宝&#xff0c;某东等用户有需求&#xff0c;才能产生主动寻找商品的触点&#xff0c;由第三方担保&#xff0c;产生信任。 试想一下&#xff0c;我…

高逼格的 SQL 写法:行行比较

码农code之路 2023-06-01 08:28 发表于天津 环境准备 需求背景 循环查询 OR 拼接 混查过滤 行行比较 总结 环境准备 数据库版本&#xff1a;MySQL 5.7.20-log 建表 SQL DROP TABLE IF EXISTS t_ware_sale_statistics; CREATE TABLE t_ware_sale_statistics (id bigin…

面向过程 VS 面向对象

学习编程&#xff0c; 基本功是掌握编程语言&#xff0c;但编程的本质是逻辑&#xff0c;所以编程思维的培养也很重要。面向过程和面向对象是两种重要的编程思想&#xff0c;下面讲述一下这两者的区别和优缺点比较。 1. 面向过程 面向过程是一种以事件为中心的编程思想&#…

cmake编译报错

CMake Error &#xff1a;The source.. 此处大概意思是一个文件地址does not match the 另外一个文件地址so used to generate cache. Rerun cmake...解决方法&#xff1a; vscode 快捷键ctrl shift P &#xff0c;点击第一行的删除cmake 缓存 或者将 build 下的 CMakeCac…

算法百花齐放:探索常见算法的精妙之道

在计算机科学的领域中&#xff0c;算法是一项关键而令人着迷的技术。它们是解决问题、优化效率以及创造智能系统的核心。从简单的排序和搜索任务到复杂的机器学习和深度学习应用&#xff0c;常见算法为我们提供了解决各种挑战的有力工具。在本篇博客中&#xff0c;我们将探索常…

chatgpt赋能python:Python如何过滤某个字母——关于SEO的建议

Python如何过滤某个字母——关于SEO的建议 SEO&#xff08;搜索引擎优化&#xff09;是现代网络营销中的一个重要概念。为了让自己的网站在搜索引擎排名中更加靠前&#xff0c;许多管理员和开发人员都在使用Python等编程语言来过滤特定的字母或符号&#xff0c;以优化关键词的…