Java开发者需要掌握的知识点

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 不全是Java相关,但你都应该掌握

宝子们,你们要的面试题续集终于来啦~

很多小伙伴反馈过,以前这篇 Java核心知识点精心整理 太长了,打开时页面都要卡一下 所以为了提升阅读体验,这次的面试题会分成若干小章节,每章只装十道题~

开始吧!!


1、java有哪些类加载器?

  • 启动类(Bootstrap)加载器 BootClassPathHolder: 加载<JAVA_HOME>/lib下的jar包
  • 扩展类(Extension)加载器ExtClassLoader:加载<JAVA_HOME>/lib/ext下的jar包
  • 系统类(System)加载器AppClassLoader:加载我们自己项目中写的java文件编译而成的class文件,位于target/classes下


2、int和Integer有什么区别?

Integer是int的包装类,int则是java的一种基本数据类型,Integer的默认值是null,int的默认值是0; JavaBean中我们应尽量使用Integer,打个比方,学生成绩如果用int,缺考怎么表示,0?那考0分的呢;-1?也可以,但没有null直观;


3、你在项目中如何保证缓存和数据库的一致性?

记住一句话,只要有引入缓存的地方,都不可能保证强一致性,所以这里的一致性是指最终一致性

方法很多,最常用的就是延时双删,先删除缓存,再操作数据库,完事儿再删除一次缓存

第二次删除缓存是为了避免 在第一次删除缓存之后,到操作数据库完成之前,这期间有新的查询过来,导致再次把旧数据生成缓存


4、如果你发现某个接口响应很慢,该怎么排查?

导致接口响应慢的原因太多了:网络、应用层、数据库事务、服务器自身、慢sql等

逐个来说

  • 网络:对于单个请求来讲,网络因素影响其实很小,除非网络挂了导致请求超时才能意识到;而对于大批量请求,每个请求慢10ms,请求多了,时间也就长了,这种情况可以检查下你的应用部署机和数据库机地理位置是不是隔得很远,比如一个在华东一个在西南,地理距离也会对请求响应时间产生影响,请求量越大越明显;
  • 应用层:就是我们敲的controller、service那些代码,这一层出问题很好解决,因为代码毕竟都是我们敲的嘛,一看日志就大概知道什么原因,最多的就是出现死循环(当然一旦出现死循环也不只是响应慢那么简单了);代码逻辑写的差点其实不会太影响性能,现在的cpu执行效率你尽管放心,再怎么优化也顶不了少一次io;
  • 数据库事务:检查下你的数据库是不是卡事务了,导致锁了很多表;
  • 服务器自身:服务器是不是卡了,cpu是不是炸了,内存是不是满了;
  • 慢sql:这一层出问题的几率很大,同一组查询结果,由于sql不同,耗时能相差几百上千倍,可以通过查看sql执行计划来排查问题,详见 mysql执行计划解析


5、调用ReentrantLock的lock方法后,如果当前线程没有获取到锁,它会怎么办?

不管是公平锁与否,都会进入clh队列,但是注意,线程不会在获取锁失败后立马入队,在真正入队之前会多次尝试再次获取锁,尝试次数跟是否公平锁有关

公平锁

先tryAcquire尝试获取锁,如果失败,执行acquireQueued,acquireQueued内部会再次执行tryAcquire尝试获取锁,如果再失败,就入队;

非公平锁

先cas尝试获取锁,如果失败,执行tryAcquire再次尝试获取锁,如果还失败,执行acquireQueued,acquireQueued内部会再次执行tryAcquire尝试获取锁,如果再失败,入队;

6、判断一块内存空间是否会被垃圾回收器回收的标准有哪些?

  • 对象的引用被赋值为null,并且后面不再调用
  • 对象的引用被重新分配了内存空间
  • 对象的引用被赋予了新值


7、redis的持久化机制

所谓持久化机制就是保证 redis 挂掉再重启后,可以恢复数据

快照(默认)

默认开启,无需设置,有个参数 save m n,这表示m秒内进行了n次写操作就进行备份,而且可以设置多组,满足不同场景;这里备份有两种,一个是save(阻塞),一个是bgsave(异步),还有一种是自动化,redis的快照是采用bgsave;

AOF(AppendOnlyFile:只追加文件)

需手动开启,在redis.conf中开启appendonly,默认是no,改为yes,生成的日志文件名默认为appendonly.aof,可以修改,然后配置appendfsync,有三个选项,always、everysec和no: 默认是everysec,表示每秒同步一次,性能和数据可靠性都能兼顾,最坏情况会丢失不到2秒的数据; no表示平时不进行同步,只会在redis关闭或者aof被关闭时同步,性能最佳,但是丢数据风险高; always表示每次写操作都会同步,性能差,但是丢数据风险低;

8、Java变量的本质是什么?

String str = new String("123");

我们常说的变量,也就是上面这个str,其实就是个内存地址,真正的String对象在堆上


9、ConcurrentHashMap在jdk1.8相对于之前版本有什么区别?

1.7

基于Segment数组和HashEntry,Segment继承自ReentrantLock,懂了吧,它自然就有了锁的基本功能;每个Segment数组中都有多个HashEntry,我们的数据都存在HashEntry里面,每次需要修改数据时,先对HashEntry所在的Segment加锁,其它Segment不受影响,分段锁就是这么来的;

1.8

整体实现很像HashMap,在它基础上引入了synchronized,和大量的CAS操作,以及大量的volatile关键字,所以1.8中ConcurrentHashMap的优势在于锁的粒度更小;

10、mysql支持哪些索引结构?

mysql虽然写着支持B+树和hash

但是!!!

其实我们只能建BTREE索引,hash索引是不能人为创建的,mysql官方文档中有提到

InnoDB utilizes hash indexes internally for its Adaptive Hash Index feature 贴心翻译:InnoDB内部利用哈希索引实现其自适应哈希索引功能

只有mysql认为应该建hash索引的时候才会建,不信的话你建个hash索引保存,会发现变成了BTREE

再来个冷知识,hash索引全称:innodb_adaptive_hash_index,翻译成人话就是 innodb自适应hash索引,懂了吧


如文中有错,请及时指出~

ok我话说完

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
4月前
|
SQL Java 数据库连接
为何JDBC是Java开发者的“心头好”?原因竟然这么简单!
为何JDBC是Java开发者的“心头好”?原因竟然这么简单!
41 3
|
4月前
|
安全 Java 编译器
揭秘JAVA深渊:那些让你头大的最晦涩知识点,从泛型迷思到并发陷阱,你敢挑战吗?
【8月更文挑战第22天】Java中的难点常隐藏在其高级特性中,如泛型与类型擦除、并发编程中的内存可见性及指令重排,以及反射与动态代理等。这些特性虽强大却也晦涩,要求开发者深入理解JVM运作机制及计算机底层细节。例如,泛型在编译时检查类型以增强安全性,但在运行时因类型擦除而丢失类型信息,可能导致类型安全问题。并发编程中,内存可见性和指令重排对同步机制提出更高要求,不当处理会导致数据不一致。反射与动态代理虽提供运行时行为定制能力,但也增加了复杂度和性能开销。掌握这些知识需深厚的技术底蕴和实践经验。
87 2
|
4月前
|
安全 Java API
告别繁琐编码,拥抱Java 8新特性:Stream API与Optional类助你高效编程,成就卓越开发者!
【8月更文挑战第29天】Java 8为开发者引入了多项新特性,其中Stream API和Optional类尤其值得关注。Stream API对集合操作进行了高级抽象,支持声明式的数据处理,避免了显式循环代码的编写;而Optional类则作为非空值的容器,有效减少了空指针异常的风险。通过几个实战示例,我们展示了如何利用Stream API进行过滤与转换操作,以及如何借助Optional类安全地处理可能为null的数据,从而使代码更加简洁和健壮。
119 0
|
2月前
|
前端开发 Java 数据库连接
Spring 框架:Java 开发者的春天
Spring 框架是一个功能强大的开源框架,主要用于简化 Java 企业级应用的开发,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,并由Pivotal团队维护。
58 1
Spring 框架:Java 开发者的春天
|
2月前
|
Java 数据库连接 开发者
Spring 框架:Java 开发者的春天
【10月更文挑战第27天】Spring 框架由 Rod Johnson 在 2002 年创建,旨在解决 Java 企业级开发中的复杂性问题。它通过控制反转(IOC)和面向切面的编程(AOP)等核心机制,提供了轻量级的容器和丰富的功能,支持 Web 开发、数据访问等领域,显著提高了开发效率和应用的可维护性。Spring 拥有强大的社区支持和丰富的生态系统,是 Java 开发不可或缺的工具。
|
2月前
|
存储 算法 Java
Java的Set集合以其严格的“不重复性”著称,使开发者既好奇又困惑
Java的Set集合以其严格的“不重复性”著称,使开发者既好奇又困惑。本文将探讨Set为何如此“挑剔”。Set接口不包含重复元素,适用于需要唯一性约束的场景。其内部通过哈希表或红黑树等数据结构和哈希算法、equals()方法来确保元素的唯一性。示例代码展示了Set如何自动过滤重复元素,体现了其高效性和便利性。
37 2
|
2月前
|
安全 Java 编译器
Java基础-知识点(二)
Java基础-知识点(二)
13 0
|
2月前
|
存储 缓存 安全
Java基础-知识点(一)
Java基础-知识点(一)
19 0
|
3月前
|
监控 算法 Java
深入理解Java中的垃圾回收机制在Java编程中,垃圾回收(Garbage Collection, GC)是一个核心概念,它自动管理内存,帮助开发者避免内存泄漏和溢出问题。本文将探讨Java中的垃圾回收机制,包括其基本原理、不同类型的垃圾收集器以及如何调优垃圾回收性能。通过深入浅出的方式,让读者对Java的垃圾回收有一个全面的认识。
本文详细介绍了Java中的垃圾回收机制,从基本原理到不同类型垃圾收集器的工作原理,再到实际调优策略。通过通俗易懂的语言和条理清晰的解释,帮助读者更好地理解和应用Java的垃圾回收技术,从而编写出更高效、稳定的Java应用程序。
|
3月前
|
Java API 开发者
【Java字节码的掌控者】JDK 22类文件API:解锁Java深层次的奥秘,赋能开发者无限可能!
【9月更文挑战第8天】JDK 22类文件API的引入,为Java开发者们打开了一扇通往Java字节码操控新世界的大门。通过这个API,我们可以更加深入地理解Java程序的底层行为,实现更加高效、可靠和创新的Java应用。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来,并积极探索类文件API带来的无限可能!