哈喽👋,大家好,我是千羽。
小米 25 届校招秋招那薪资啊,在 11 月份的时候就已经开奖了。
在牛客网瞧见有位同学获得了 22k 乘以 15 薪的待遇,工作地点在深圳,从事 python 大模型应用开发方向,隶属于系统软件架构部门,真的是非常出色了。
如此一来,一年下来基本上能够全款购得小米 su7。
这位老哥拿到小米offer,工作方向是代码生成大模型哈,这玩意儿最近两年那可老火爆了,真心建议去试试。
至于华子嘛,那池子老大了,按照以往那德行,一般得到 12 月或者 1 月才能知道结果。
从网上牛客网跟 offershow 对比的数据能瞅见,小米在不同城市的开发工资还是有点不一样哈。北京基本是最高的,还有上海、武汉、南京、深圳啥的。
有个事儿得提一嘴哈,倒挂不咋严重呢,老员工心里确实能平衡不少。
下面看看小米的25届校招开奖情况:
小米年总包构成 = 月薪 x 15
武汉
评级
薪资
年包
小米-武汉
普通 offer
14k x 15
29w
小米-武汉
普通 offer
15k x 15
30w
小米-武汉
sp offer
18k x 16
32w
北京
评级
薪资
年包
小米-北京
普通 offer
15k~18k x 15
30w+
小米-北京
sp offer
20k~24k x 15
35w+
小米相对比百度,阿里京东,相比互联网一线大厂是确实少了一些,不过也是可以买得上小米su7的了。
下面跟大家分享一道小米 Java 开发的面经哈。整体感觉呢,跟那些互联网大厂比起来,面试压力确实小不少。问的基本都是常规的八股文,提问时间大概 20 分钟吧,剩下的时间都在写题呢。
1.hashmap的基本原理
在JDK1.7和DK1.8中有所差别:
在JDK1.7中,由”数组+链表”组成,数组是HashMap的主体,链表主要为了解决哈希冲突
在JDK1.8中,由”数组+链表+红黑树”组成。当链表过长,则会严重影响HashMap的性能,红黑树搜索时间复杂度是O(logn),而链表是糟糕的O(n)。因此,JDK1.8对数据结构做了进一步的优化,引入了红黑树,链表和红黑树在达到一定条件会进行转换:
当链表超过8且数据总量超过64才会转红黑树。
将链表转换成红黑树前会判断,如果当前数组的长度小于64,那么会选择先进行数组扩容,而不是转换为红黑树,以减少搜索时间。
2.springboot的自动装配原理?bean的生命周期?
Spring Boot自动装配原理
启动类的@SpringBootApplication包含@EnableAutoConfiguration。
这个注解触发AutoConfigurationImportSelector,从classpath下META – INF/spring.factories文件读取自动配置类。
自动配置类通过条件注解(如@ConditionalOnClass等)判断是否需要自动配置Bean。
Bean的生命周期
实例化:根据Bean定义创建实例,可能调用构造函数。
属性赋值:通过@Autowired等注入依赖。
初始化:实现InitializingBean接口或使用init – method。
使用:在容器中被其他Bean使用。
销毁:容器关闭时,实现DisposableBean接口或使用destroy – method来释放资源。
3.spring中用到的设计模式。举出4个例子详细说明
单例模式
@Service
public class UserService {
// 业务方法
}
Spring中Bean默认是单例。例如@Service注解的UserService,容器只会创建一个实例。这避免了多次创建相同无状态Bean,节省内存。
工厂模式
@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserService();
}
}
BeanFactory和ApplicationContext类似工厂。如ApplicationContext通过配置创建Bean。
代理模式
@Service
public class UserService implements IUserService {
// 业务方法
}
Spring AOP基于此。如UserService实现接口,JDK动态代理或CGLIB代理(没接口时)会在方法前后添加事务等逻辑。
观察者模式
public class UserRegisteredEvent extends ApplicationEvent {
public UserRegisteredEvent(Object source) {
super(source);
}
}
public class UserRegisteredEventListener implements ApplicationEventListener {
@Override
public void onApplicationEvent(UserRegisteredEvent event) {
System.out.println(“用户已注册,发送欢迎邮件等操作”);
}
}
Spring事件机制用此模式。定义UserRegisteredEvent和UserRegisteredEventListener,事件发布后监听器接收并处理,如发送欢迎邮件。
4.mysql索引优化?索引失效的情况?如何查看sql的执行计划?
MySQL索引优化
选择合适的字段建立索引,如经常用于查询条件(WHERE)、连接(JOIN)和排序(ORDER BY)的字段。
避免过多索引,因为索引会增加存储成本和插入、更新操作的时间。
对于组合索引,注意字段顺序,最左前缀原则很关键,将最常用的字段放在最左边。
索引失效的情况
使用LIKE操作符,且%在最前面,如WHERE column LIKE ‘%value’。
对索引列进行函数运算,如WHERE YEAR(column)=2024。
隐式类型转换,例如字段是VARCHAR型,查询条件用INT型。
存在OR连接条件,其中部分条件没有索引。
查看SQL执行计划
在MySQL中可以使用EXPLAIN关键字,将SQL语句放在EXPLAIN后面,如EXPLAIN SELECT * FROM table WHERE condition。它会返回一个结果集,显示查询的执行计划,包括使用的索引、连接类型等信息,用于分析SQL性能。
5.mybatis和mybatisplus的区别?
功能丰富度
MyBatis是一个简单灵活的持久层框架,需要手动编写SQL语句,如SELECT、INSERT等。例如在Mapper.xml文件中编写select * from user where id = #{id}来查询用户信息。
MyBatis – Plus是MyBatis的增强工具,在MyBatis基础上提供了很多便捷的功能,如通用的CRUD操作方法,不需要编写基本的增删改查SQL语句。可以通过userMapper.selectById(id)直接查询用户信息。
代码量
MyBatis代码量相对较多,因为大量的SQL语句需要开发者手动编写。
MyBatis – Plus减少了大量重复的SQL代码编写,尤其在简单的CRUD操作上,代码更加简洁,提高了开发效率。
性能方面
二者底层都是基于JDBC,性能相近。不过MyBatis – Plus的一些高级功能(如自动填充等)可能会在一定程度上增加一些性能开销,但在多数场景下可以忽略不计。
灵活性
MyBatis更加灵活,对于复杂的SQL查询和业务逻辑,开发者可以精确控制SQL语句的编写。
MyBatis – Plus在提供便捷功能的同时,对于复杂的、高度定制化的业务逻辑,可能需要更多地使用MyBatis原生的功能来实现,灵活性稍逊一筹。
6.git的企业开发流程?如何解决冲突?
Git企业开发流程
创建仓库(Repository):项目负责人创建远程仓库,开发人员克隆(clone)到本地。
创建分支(Branch):从主分支(如master或main)创建特性分支(feature branch)进行开发,每个分支用于开发一个新功能或修复一个Bug。
开发与提交(Commit):开发人员在特性分支上编写代码、测试,定期提交代码,并附上有意义的提交信息,描述代码变更内容。
推送(Push)分支:将本地特性分支推送到远程仓库。
代码审查(Code Review):其他开发人员或团队负责人在远程仓库查看提交的代码,提出修改建议。
合并(Merge)分支:经过审查后,将特性分支合并到主分支。如果是大型项目,可能先合并到测试分支(test branch)进行测试,没问题后再合并到主分支。
部署(Deployment):将主分支代码部署到生产环境。
解决冲突(Conflict)
Git会提示冲突文件,打开冲突文件,会看到类似<<<<<<<、=======、>>>>>>>的标记,分别表示本地分支内容、冲突分隔线、远程分支内容。
手动修改冲突部分内容,选择保留哪部分或者进行新的修改。
解决冲突后,使用git add命令将修改后的文件添加到暂存区,再通过git commit提交,完成冲突的解决。
冲突产生:当不同分支修改了同一文件的同一部分内容,合并分支时就会产生冲突。
解决步骤:
7.线程池的核心参数?在核心线程数为5、最大线程数为10,使用无界队列的情况下,线程池的最大线程数?
线程池核心参数
核心线程数(corePoolSize):线程池长期维持的线程数量,即使线程空闲也不会回收,用于处理任务队列中的任务。
最大线程数(maximumPoolSize):线程池允许创建的最大线程数量,当任务队列满且核心线程数不够时会创建新线程,直到达到最大线程数。
线程存活时间(keepAliveTime):非核心线程空闲后的存活时间,超过这个时间就会被回收。
时间单位(unit):用于指定keepAliveTime的时间单位,如秒、分钟等。
任务队列(workQueue):用于存储等待执行的任务,不同类型的队列会影响线程池的行为。
线程工厂(threadFactory):用于创建新线程,可自定义线程的名称等属性。
拒绝策略(handler):当任务队列满且达到最大线程数后,新任务到来时采取的策略,如抛出异常、丢弃任务等。
最大线程数情况
在使用无界队列时,任务会一直存储在队列中,不会触发创建新线程。所以线程池的最大线程数就是核心线程数,即5。
8.如何保持良好的编程习惯?看过相关的书籍吗?
有的,《代码整洁之道》,《程序员的职业素养》
手撕算法:
1.判断链表是否成环
思路:
可以使用快慢指针的方法来判断链表是否成环。
定义两个指针,一个是慢指针(slow),一个是快指针(fast)。慢指针每次移动一步,即slow = slow.next;快指针每次移动两步,即fast = fast.next.next(这里需要确保快指针的下一个节点以及下下个节点不为空,否则会出现空指针异常)。
同时从链表的头节点开始移动这两个指针。
如果链表没有环,那么快指针会先到达链表的末尾(即fast变为null或者fast.next变为null),此时就可以确定链表无环。
如果链表存在环,那么由于快指针移动速度比慢指针快,快指针最终会追上慢指针,也就是快慢指针会指向同一个节点,当出现这种情况时,就可以判断链表是成环的。
class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
this.next = null;
}
}
public class LinkedListCycleDetector {
public static boolean hasCycle(ListNode head) {
if (head == null) {
return false;
}
ListNode slow = head;
ListNode fast = head;
while (fast!= null && fast.next!= null) {
slow = slow.next;
fast = fast.next.next;
if (slow == fast) {
return true;
}
}
return false;
}
public static void main(String[] args) {
// 创建一个示例链表,这里先创建一个无环链表
ListNode head = new ListNode(1);
ListNode node2 = new ListNode(2);
ListNode node3 = new ListNode(3);
head.next = node2;
node2.next = node3;
boolean result = hasCycle(head);
System.out.println("链表是否有环:" + result);
// 再创建一个有环链表示例
ListNode headWithCycle = new ListNode(4);
ListNode node5 = new ListNode(5);
ListNode node6 = new ListNode(6);
headWithCycle.next = node5;
node5.next = node6;
node6.next = node5; // 形成环
boolean resultWithCycle = hasCycle(headWithCycle);
System.out.println("有环链表是否有环:" + resultWithCycle);
}
}
首先定义了ListNode类来表示链表的节点结构,包含一个值val和指向下一个节点的引用next。
然后在hasCycle方法中,按照快慢指针的思路进行判断。如果链表头为空,直接返回false表示无环。然后通过循环不断移动快慢指针,在循环条件中确保快指针及其下一个节点不为空。当快慢指针相遇时,返回true表示有环,若循环结束未相遇则返回false表示无环。
在main方法中,分别创建了无环链表和有环链表的示例,并调用hasCycle方法进行判断,最后输出结果。
牛客网:https://www.nowcoder.com/feed/main/detail/ed07868d535c4419a8ce31a680a74281?sourceSSR=search
声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/424060.html