1.你对Java的容器有什么了解?Java容器类包含List、ArrayList、Vector及map、HashTable、HashMap、Hashset线程安全的list:CopyOnWriteArrayList2.Set和Map使用场景有什么差别Map是键值对,Set是值的集合,set可以用来判断元素是否出现,map可以记录元素出现的次数3.他们的底层实现你了解吗HashSet的底层实现是HashMap,数组+链表&红黑树4.他们底层确实有关联,你刚刚提到Hashcode,它在hashmap中的作用是什么?哈希码的作用是确定对象在hash表中的位置;任何类都有hashCode()方法5.你说一下hashmap底层的结构数组+链表+红黑树6.用hashcode怎么判断是否是有冲突的呢? hashCode() && equals()7.Hashcode的计算目标可能是对象,怎么判断是否相等(equals) 8.在长度大于多少的时候链表转为红黑树 89.删元素的话红色树是否会转回链表呢?会的10.hashmap如果发生线程不安全的情况会出什么问题?(这些问题出现在jdk1.7和1.8中)多线程put导致元素丢失put和get并发时,可能导致get为null,因为put导致扩容,此时线程get可能为空11.追问:还有其他问题吗?您用的是JDK什么版本?1.8,扩容的时候可能会出问题,链表删除的时候会出现问题12.你说一下hashmap的扩容过程?扩容有什么优化可以让他变得更快?HashMap是一种基于哈希表实现的键值对存储结构。在HashMap中,每个键值对都被映射到一个桶中,桶是哈希表的基本单位,多个键值对可能被映射到同一个桶中。在HashMap的内部实现中,当哈希表的元素个数超过了负载因子(load factor)与容量的乘积时,就会触发扩容操作。HashMap的扩容过程主要包括以下几个步骤:【1】创建一个新的哈希表,其容量是原来的两倍,同时重新计算每个键值对在新哈希表中的桶位置。【2】将原哈希表中的所有键值对重新分配到新哈希表的相应桶中。【3】将原哈希表的引用指向新哈希表,完成扩容操作。为了优化HashMap的扩容过程,可以考虑以下几点:使用位运算代替取模运算:在计算哈希值时,位运算比取模运算更快速,可以减少计算哈希值的时间,从而加速哈希表的插入和查询操作。假设哈希表的容量为n,计算哈希值时可以使用以下位运算:对于2的整数次幂n,可以使用按位与(&)运算代替取模运算。h&(n-1)对于任意正整数n,可以使用位移运算和按位与(&)运算代替取模运算。index = (h ^ (h >> 16)) & (n - 1)13.了解过多线程么?线程创建方式有哪几种?Extends thread,实现runnable,利用线程池14.如果打断线程?wait,join(等另一个线程执行结束才会往下执行),interrupt(中断)15.线程池的核心参数?16.线程池在什么情况下会触发拒绝策略?17.对数据库有多少了解?说一下事务的四大特性事务具有4个基本特征,分别是:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Duration),简称ACID【A】事务的原子性是指事务必须是一个原子的操作序列单元。事务中包含的各项操作在一次执行过程中,只允许出现两种状态之一,要么都成功,要么都失败【C】一个事务在执行之前和执行之后,数据库都必须处以一致性状态,比如A扣了钱,B就应该加钱【I】事务的隔离性是指在并发环境中,并发的事务是互相隔离的,一个事务的执行不能被其它事务干扰。【D】事务的持久性是指事务一旦提交后,数据库中的数据必须被永久的保存下来18.mysql的存储引擎InnoDB存储引擎--【事务安全】MyISAM---默认存储引擎19.有个sql执行的比较慢,你有哪些优化策略?Explain20.组合索引什么时候生效?(a,b,c)如果组合索引中的索引都在,则索引全部生效如果想要使用一个或者两个字段在where条件上,必须有组合索引里的第一个字段order by 只能使用a,才能用到索引21.有个表,(姓名,年龄,性别,),我想查性别为女的姓李的女性,怎么建索引?建索引是建在值比较分散的属性上的,比如性别,是不应该在这个属性上建索引的拓展:在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。22.我想查姓李的所有人的名字,select * from table和select name from table是一样的吗?回答要从聚簇性索引和非聚簇性索引方面考虑,把这个*的内容都返回,底层会做什么操作呢?总结问题:返回的时候返回所有列和单独返回一个列,对数据库底层来说有什么区别从聚簇索引的角度来看,如果表table已经按照name列进行了聚簇索引,则SELECT name FROM table WHERE name LIKE '李%'查询会更有效率。因为聚簇索引将数据物理上按照索引列的顺序进行排序,相同的值会被存储在相邻的位置,这样就可以更快地查找和扫描查询,因为它们可以减少I/O操作的次数。当我们执行SELECT name FROM table WHERE name LIKE '李%'时,由于只需要返回name列的值,聚簇索引可以更快地扫描满足条件的行,并返回结果。相比之下,SELECT * FROM table WHERE name LIKE '李%'则需要查找整个行,这意味着需要更多的I/O操作,从而可能降低效率。因此,从聚簇索引的角度来看,SELECT name FROM table WHERE name LIKE '李%'查询更有效率。23.如何保证redis和Caffeine数据是一致的?如果db更新成功,缓存更新失败怎么办24.如何保证本地缓存的一致性?#牛客解忧铺##面经# #秋招##牛客在线求职答疑中心# #软件开发2024笔面经# #软件开发笔面经#