面经-借钱包交易平台Java开发实习
如果对于jdk版本升级,对于jvm的一些参数修改有哪些?
- -Xmx 和 -Xms:这些参数用于设置 JVM 的最大堆内存和初始堆内存大小。在 JDK 版本升级后,由于可能存在新的特性或改进,建议重新评估应用程序的内存需求,并相应地调整这些参数。
- -XX:NewRatio 和 -XX:SurvivorRatio:这些参数用于调整新生代(Young Generation)和老年代(Old Generation)的比例和新生代中 Eden 区和 Survivor 区的比例。在 JDK 版本升级后,新的默认比例可能会有所变化,可能需要重新设置这些参数以优化垃圾回收性能。
- -XX:+UseConcMarkSweepGC 和 -XX:+UseG1GC 等:这些参数用于选择不同的垃圾回收器。随着 JDK 版本的升级,可能会引入新的垃圾回收器或对现有的回收器进行优化,因此需要根据应用程序的特性和需求选择合适的垃圾回收器和相应的参数。
- -XX:MaxMetaspaceSize:在 JDK 8 及之前的版本中,用于设置永久代(Permanent Generation)的最大大小。但从 JDK 8 开始,永久代被移除,取而代之的是 Metaspace。因此,在 JDK 版本升级后,如果之前使用了永久代的参数,需要调整为 Metaspace 相关的参数。
- 其他新的 -XX 开头的参数:随着 JDK 版本的升级,可能会引入新的 JVM 参数,用于控制新的特性或优化性能。因此,在升级后应该查阅新的文档,了解这些新参数的用法和影响,并根据需要进行配置。
介绍包装类和基本数据类型的自动拆箱和自动装箱?
自动装箱:将基本数据类型转换成对应的包装类型
自动拆箱:将包装类型转换成对应的基本数据类型
1 | Integer i = 10;//装箱 Integer.valueOf(10); |
什么常见场景会自动触发自动装箱和自动拆箱?
自动装箱场景:
- 将基本数据类型赋值给对应的包装类型,比如:Integer i = 10;
- 将基本数据类型作为参数赋值给接受包装类型的方法。
自动拆箱场景:
- 将包装类型赋值给对应的基本数据类型,比如
Integer i = 10; int n = i;
- 将包装类型作为参数赋值给接受对应基本数据类型的方法。
对于Integer类型的数据进行比较大小需要注意哪些问题?
1、比较大小:使用equals方法,因为equals方法比较的是对象的值,而==比较的是对象的引用地址。
1 | Integer n = 100; |
2、尽量避免频繁的拆箱装箱,频繁的拆装箱会造成一些不必要的资源损耗。
3、避免空指针异常:如果包装类型定义了null,此时进行自动拆箱的时候会抛出NPE。
1 | Integer n= null; |
为什么是选择equals方法去比较Integer这一类包装类类型的数据?
使用==号的时候,如果Integer是通过创建对象或者自动装箱的数据在-128~127的范围就会返回false
,==比较的是两个Integer对象的引用地址,如果出现刚刚所述的两种情况,是因为他们此时的所属对象的引用地址不一样导致的。
而使用equals方法比较的是两个对象之间的值,而不是引用地址。
在重写一个对象的时候为什么要重写equals()以及hashcode()?
因为两个相等的对象的hashCode必须相等,不然如果重写了equals方法而没有重写hashCode方法的话可能会出现equals方法判断两个对象相等,但是其hashCode不相等的情况。
hashmap如何解决哈希碰撞(哈希冲突)问题?
hashmap在存放一个键值对的时候过程是怎么样的?
1、对键进行hash计算来确定键值存放的位置
2、通过取模运算找到具体存储哈希键值对的位置即桶
3、将键值对存储在对应的桶中,如果产生了哈希冲突就会作为一个节点存入到链表或者红黑树的头部。
当hashmap转换成红黑树后什么情况下会转回链表?
当红黑树的节点数小于等于6的时候,会转回链表的形式进行键值对的存储,因为hashCode符合泊松分布,哈希冲突造成链表长度等于6的情况比较高,且红黑树维护节点开销会比链表维护所需开销大,如果是长度等于7的情况的话,可能会导致频繁的链表和红黑树的转换开销和资源浪费。
为什么是链表等于8的时候转?
因为经过统计,当hashCode遵循泊松分布时,因为哈希冲突造成桶的链表长度大于等于8的概率只有0.00000006,所以根据数学推算决定当链表长度等于8时转换成红黑树。而且转换成红黑树之后的维护开销会比链表高很多,所以不会随随便便进行红黑树和链表之间的互相转换。
常见集合list、map、set、queue之间的区别
list:元素有序,可重复
set:元素无序,不可重复
map:以key-value方式存储,key无序、不可重复,value无序、可重复,每个键最多映射到一个值。
queue:元素有序,可重复。
关于构建一个线程池我们需要配置的核心参数有哪些?
ThreadPoolExecutor
3 个最重要的参数:
corePoolSize
: 任务队列未达到队列容量时,最大可以同时运行的线程数量。maximumPoolSize
: 任务队列中存放的任务达到队列容量的时候,当前可以同时运行的线程数量变为最大线程数。workQueue
****: 新任务来的时候会先判断当前运行的线程数量是否达到核心线程数,如果达到的话,新任务就会被存放在队列中。
ThreadPoolExecutor
其他常见参数 :
keepAliveTime
:线程池中的线程数量大于corePoolSize
的时候,如果这时没有新的任务提交,核心线程外的线程不会立即销毁,而是会等待,直到等待的时间超过了keepAliveTime
才会被回收销毁;unit
:keepAliveTime
参数的时间单位。threadFactory
:executor 创建新线程的时候会用到。handler
:饱和策略。
InnoDB的索引数据结构是什么?介绍一下b+树
B+树
- B+ 树的非叶子节点不存放实际的记录数据,仅存放索引,因此数据量相同的情况下,相比存储即存索引又存记录的 B 树,B+树的非叶子节点可以存放更多的索引,因此 B+ 树可以比 B 树更「矮胖」,查询底层节点的磁盘 I/O次数会更少。
- B+ 树有大量的冗余节点(所有非叶子节点都是冗余索引),这些冗余索引让 B+ 树在插入、删除的效率都更高,比如删除根节点的时候,不会像 B 树那样会发生复杂的树的变化;
- B+ 树叶子节点之间用链表连接了起来,有利于范围查询,而 B 树要实现范围查询,因此只能通过树的遍历来完成范围查询,这会涉及多个节点的磁盘 I/O 操作,范围查询效率不如 B+ 树。
为什么B+树千万级别在MySQL只有3-4层?
非叶子结点一般只有键+指针,也就是8+6 = 14byte,那么一个非叶子结点可以存储的键+指针个数是161024/14=1170个单元数,如果一条记录是1k,那么一个节点能存16条记录,那么两层的B+树就是16 * 1170=18720条记录,3层的话就是161170*1170=2190w+条记录。
Innodb的默认隔离事务级别是什么?什么是可重复读?
可重复读。
指一个事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的
在可重复读的事务隔离级别下,什么场景下会出现幻读的情况?
场景一(针对快照读):
以下表为例:
事务A执行查询id = 5的记录,此时表中没有此记录,所以查不出来
1 | #事务A |
此时事务B添加一条id = 5的记录,并提交
1 | #事务B |
此时,事务A更新id=5的记录,并查询id=5的记录,此时就能看到事务B插入的记录。
1 | # 事务 A |
时序图如下:
场景二(针对当前读):
- T1时刻,事务A先执行了快照读语句:select * from t_test where id > 100 得到了 3 条记录;
- T2时刻,事务B插入了一条id = 200的记录并提交
- T3时刻,事务A执行当前读:select * from t_test where id > 100;就会得到4条记录
Maven添加资源包的时候,如何操作?
在Maven项目中添加资源包(例如配置文件、图像文件、文本文件等)通常涉及以下步骤:
创建资源文件夹:
在项目的源代码目录(src/main/java)旁边创建一个资源文件夹,通常命名为”resources”,这是Maven默认的资源文件夹。
将资源文件放入资源文件夹:
将您的资源文件(例如配置文件、图像等)放入刚刚创建的”resources”文件夹中。
更新项目配置文件(pom.xml):
打开项目的
pom.xml
文件,并在<build>
标签下的<resources>
标签中配置资源文件夹。示例如下:
1 | <build> |
此配置告诉Maven在构建项目时将资源文件夹中的内容包含在生成的JAR或WAR文件中。
运行Maven构建命令:
打开终端或命令提示符,进入项目根目录,然后运行以下命令来执行Maven构建:
1 | mvn clean install |
或者如果只需要将资源添加到生成的JAR或WAR中,可以使用以下命令:
1 | mvn resources:resources |
访问资源文件:
在Java代码中,您可以使用类加载器来访问位于资源文件夹中的资源文件。例如,使用以下代码来加载资源文件:
1 | InputStream inputStream = getClass().getClassLoader().getResourceAsStream("path/to/resource.file"); |
其中,path/to/resource.file
是资源文件在资源文件夹中的相对路径。
Maven的常用命令有哪些?
缓存雪崩、缓存和数据库一致性问题的解决方案?
如果此时使用的是cookie-session机制,而且是分布式系统的话,怎么实现用户鉴权问题?
1、SSO单点登录
2、集中式Session存储