avatar-decorate
获赞
177
粉丝
276
关注
14
看过 TA
2064
门头沟学院
2025
Java
IP属地:北京
暂未填写个人简介
私信
关注
头像
08-29 09:30
已编辑
小米集团_软件开发工程师
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笔面经# #软件开发笔面经#
0 点赞 评论 收藏
分享
头像
08-28 12:12
已编辑
小米集团_软件开发工程师
1. 了解MQ出现的原因或者主要使用的场景吗?削谷填峰。对于一些实时性要求不是那么高的业务,交给消息队列可以提高业务的整体速度。2. 分布式锁的实现3. 【没记下来,个人项目相关的问题】4.Spring,SpringMVC以及SpringBoot的区别Spring它是一个开源的应用程序框架,主要做的是管理这些对象,包括它的创建,销毁等。Spring MVC是Spring的一部分,主要处理web开发的路径映射和视图渲染SpringBoot:Spring越来越庞大,其配置文件也越来越繁琐,于是推出实现自动配置,降低项目搭建的复杂度Spring MVC和Spring Boot都属于Spring,Spring MVC 是基于Spring的一个Web层框架,而Spring Boot 是基于Spring的一套快速开发整合包5. SpringBoot简化了哪些操作【1】内嵌了tomcat等容器,只需要用jar包就能部署项目【2】Spring Boot提供了一些列starter的pom,当确定使用类型后可以自动导入依赖【3】提供一些监控的服务【4】用注解代替xml文件6.SpringBoot如何实现自动配置【什么是自动装配】springboot的自动装配实际上就是为了从spring.factories文件中获取到对应的需要进行自动装配的类,并生成相应的Bean对象,然后将它们交给spring容器来帮我们进行管理【如何实现自动装配】利用注解。首先,将主配置类(@SpringBootApplication标注的类)所在包以及子包里面的所有组件扫描并加载到spring的容器中,将需要自动装配的类以全类名的方式返回,(在spring.factories里去找),使用反射创建对象,对对象进行管理。【更详细的流程】1、main方法中SpringApplication.run(HelloBoot.class,args)的执行流程中有refreshContext(context)。2、而这个refreshContext(context)内部会解析,配置类上自动装配功能的注解@EnableAutoConfiguration中的,@EnableAutoConfiguration中的,引入类AutoConfigurationImportSelector。3、AutoConfigurationImportSelector这个类中的方法SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader()会读取jar包中的/项目中的META-INF/spring.factories文件。7.SpringBoot的启动流程new了一个SpringApplication对象【1】确定项目的类型 【2】载入spring.factory配置 【3】从载入的配置中获取项目监听器调用它的run方法【1】启动listner 【2】配置相关环境8.Mybatis的优点【1】SQL语句和代码分离【2】提供了很多xml标签方便我们编写动态SQL语句9.CAS,compare and swap——比较并替换,乐观锁的一种实现。CAS适用于并发冲突发生频率较低的场合。操作步骤如下:【1】修改前记录数据的内存地址V;【2】读取数据的当前的值,记录为A;【3】修改数据的值变为B;【4】查看地址V下的值是否仍然为A,若为A,则用B替换它;若地址V下的值不为A,表示在自己修改的过程中,其他的线程对数据进行了修改,则不更新变量的值,而是重新从步骤2开始执行,这被称为自旋;CAS可以确保数据修改的原子性在java.util.concurrent.atomic包下有很多的原子类,如AtomicInteger、AtomicBoolean......这些类提供对int、boolean等类型的原子操作,而底层就是通过CAS机制实现的。比如AtomicInteger类有一个实例方法,叫做incrementAndGet,这个方法就是将AtomicInteger对象记录的值+1并返回,与i++类似。但是这是一个原子操作,不会像i++一样,存在线程不一致问题,因为i++不是原子操作。【CAS】存在的问题:ABA问题,解决:加版本号。10. 常用的设计模式11. @Autowired和@Resource的区别@Autowired默认按类型进行装配,@Resource默认按照名称进行装配。12.类加载机制Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、解析和初始化,变成虚拟机可以使用的类型,这个过程就叫做类的加载机制。当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、链接、初始化3个步骤来对该类进行初始化,这也就是类的加载机制。【1.加载】:通过类的全限定名获取字节流,将字节流转化为数据结构,然后生成java.lang.Class对象,作为方法区这个类的各种数据的访问入口【2.链接】:1)首先,验证。确保字节流符合规范要求,避免对虚拟机造成伤害 2)准备。为变量分配默认初始值。3)解析。将符号引用转换为直接引用【3.初始化】:根据代码初始化变量【拓展】:类加载器,“通过全限定名获取类的二进制流的代码”14.双亲委派机制15.redis大key会有什么影响导致性能严重下降,因为redis的核心工作线程是单线程的,前面的请求没有处理完不会处理后面的,大key很容易带来阻塞、超时。大key的产生:大 key 的产生往往是业务方设计不合理,没有预见 vaule 的动态增长问题:【1】一直往 value 塞数据,没有删除机制,迟早要爆炸;【2】数据没有合理做分片,将大 key 变成小 key。16.同步方法和同步代码块哪个更好?同步块是更好的选择,因为它不会锁住整个对象(当然你也可以让它锁住整个对象)。同步方法会锁住整个对象,哪怕这个类中有多个不相关联的同步块,这通常会导致他们停止执行并需要等待获得这个对象上的锁。同步块更要符合开放调用的原则,只在需要锁住的代码块锁住相应的对象,这样从侧面来说也可以避免死锁。17.项目中的异常处理Springboot,自定义异常视图,出现异常的时候不访问springboot默认的界面没有特地去做自定义异常处理18.线程池队列过长的影响线程池的任务队列本来起缓冲作用,但是如果设置的不合理会导致线程池无法扩容至max,这样无法+发挥多线程的能力,导致一些服务响应变慢。队列长度要看具体使用场景,取决服务端处理能力以及客户端能容忍的超时时间等19. synchronized和ReentantLock对比:20.为什么说Python的多线程是鸡肋Python代码的执行由Python虚拟机(解释器)来控制。Python在设计之初就考虑要在主循环中,同时只有一个线程在执行。【对Python虚拟机的访问由全局解释器锁(GIL)来控制,正是这个锁能保证同时只有一个线程在运行。】21.计算一个二进制长整型二进制表示1的个数使用bigcount,22.关于TCP粘包TCP是面向流的的传输协议,发送端可以一次发送不定长度的数据,而接收端也可以一次提取不定长度的数据。即这种传输方式是无保护消息边界的,接收方接收数据后放在缓存中,如果处理不及时则可能发生粘包。处理方式:【1】可以关闭Nagle算法,通过TCP_NODELAY选项来关闭。缺点是TCP传输效率降低【2】在应用层,对数据进行循环处理,应用程序从接收缓存中读取分组时,读完一条数据,就应该循环读取下一条数据,直到所有数据都被处理完成。(要做到这点则需要发送数据长度)23.线程池七大参数24. Spring 的核心组件25.Spring如何解决循环依赖26.数据库数据量过大怎么优化分区、分表、分库、建索引,聚簇&非聚簇27.Mysql数据库分区28.Nginx负载均衡策略整理完后才发现第二part的面经来自携程和某小公司的二面,小公司没算法题,都是八股,写出来大家可以参考参考,查漏补缺#小米##面经##软件开发2024笔面经#  #软件开发笔面经#
0 点赞 评论 收藏
分享
小米集团
|
校招
|
超多精选岗位
0 点赞 评论 收藏
分享
小米
|
校招
|
超多精选岗位
0 点赞 评论 收藏
分享
关注他的用户也关注了:
牛客网
牛客企业服务