面试复盘|用友Java开发22届校招一面凉经

面试复盘|用友Java开发22届校招一面凉经


面试轮次:技术面一面

方式:赛码系统

时间:10月15日 10:20

时长:22分钟
面试通知

开头闲聊

Q:自我介绍

Q:为什么转Java(因为非科班所以问了这个问题)

Q1:SpringBoot自动装载原理

A:不知道。然后随便说说创建SpringBoot项目,然后通过XxxApplication类中的main方法启动,这个类里面有@SpringBootApplication注解等。

Q2:了解Java的集合吗?

A:了解。

Q:那你说说ArrayList和HashMap

A:ArrayList 是实现List 接口的实现类,底层使用数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要进行扩容,就要将已经有数组的数据复制到新的存储空间中。当从 ArrayList 的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。

HashMap 实现的是Map接口,是key-value键值对形式存储数据,底层使用的是数据+红黑树+链表。

说了下put方法的流程:

  • 首先根据 key 的值计算 hash 值,找到该元素在数组中存储的下标;

  • 如果数组是空的,则调用 resize 进行初始化;如果没有哈希冲突直接放在对应的数组下标里;

  • 如果冲突了,且 key 已经存在,就覆盖掉 value;

  • 如果冲突后,发现该节点是红黑树,就将这个节点挂在树上;

  • 如果冲突后是链表,判断该链表是否大于 8 ,如果大于 8 并且数组容量小于 64,就进行扩容;

  • 如果链表长度大于 8 并且数组的容量大于等于 64,则将这个结构转换为红黑树;否则,链表插入键值对,若 key 存在,就覆盖掉 value。

接着说了一些小的点:容量大小,没有指定默认为16,指定了,会采用位运算,将容量设置为大于指定容量的最小的2的次幂(这里可以说一下为什么要是2点次幂:因为计算元素对应数组的位置的时候,采用的是hash与数组容量取余,一个数与一个2的次幂取余正好等于这个数与这个2的次幂 - 1做按位与运算。),扩容为原来的2倍等。

Q3:Spring了解吗?说说Spring的AOP和IOC

A:AOP:即面向切面编程,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。Spring AOP的实现方式:动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是每次运行时在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。

Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理:
JDK动态代理只提供接口的代理,不支持类的代理。核心InvocationHandler接口和Proxy类,InvocationHandler 通过invoke()方法反射来调用目标类中的代码,动态地将横切逻辑和业务编织在一起;接着,Proxy利用 InvocationHandler动态创建一个符合某一接口的的实例, 生成目标类的代理对象。
如果代理类没有实现 InvocationHandler 接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从而实现AOP。CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。

IOC:控制反转。它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器。

Q:哪里用到了AOP?

A:日志记录,性能统计,安全控制,权限管理,事务处理,异常处理,资源池管理。

Q:怎样使用?

A:可以在配置文件中进行配置,也可以使用主街的方式(这里使用的具体注解忘记了)。

Q4:了解JVM吗?说说JVM的内存分区?

A:(经典面试题,直接看👇)

1. 程序计数器:线程私有的,是一块很小的内存空间,作为当前线程的行号指示器,用于记录当前虚拟机正在执行的线程指令地址;
2. 虚拟机栈:线程私有的,每个方法执行的时候都会创建一个栈帧,用于存储局部变量表、操作数、动态链接和方法返回等信息,当线程请求的栈深度超过了虚拟机允许的最大深度时,就会抛出StackOverFlowError;
3. 本地方法栈:线程私有的,保存的是native方法的信息,当一个jvm创建的线程调用native方法后,jvm不会在虚拟机栈中为该线程创建栈帧,而是简单的动态链接并直接调用该方法;
4. 堆:java堆是所有线程共享的一块内存,几乎所有对象的实例和数组都要在堆上分配内存,因此该区域经常发生垃圾回收的操作;
5. 方法区:存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码数据。即永久代,在jdk1.8中不存在方法区了,被元数据区替代了,原方法区被分成两部分;1:加载的类信息,2:运行时常量池;加载的类信息被保存在元数据区中,运行时常量池保存在堆中;

JVM内存结构

Q:栈和堆哪个是线程安全的?哪个是不安全的?

A:栈是线程安全的,因为栈是线程私有的,而堆是非线程安全的,因为堆由多个线程贡享。

Q5:JVM里面的锁了解吗?

A:synchronized吗?

Q:对,synchronized和ReentryLock。

A:了解。

Q:说说ReentryLock的实现原理?

A:(不知道😮‍💨)就回答了好像使用了CAS

Q6:SpringBoot中Bean默认是单例的,有线程安全问题吗?(这里是给了一个场景,就是用户登陆,当连续三次错误则禁止登陆,又一个errorCount记录了用户的登陆错误)

A:有。

Q:怎么解决?

A:使用多例。

Q:但是这样会创建大量的Bean实例,有没有其他方法?

A:我想想啊。(面试时,当我说出这三个字的时候,说明我不会。在整理面经的时候,脑子竟然开窍了,这tmd不就是threadlocal吗)

Q7:常见的数据库引擎由哪些?

A:InnoDB存储引擎是Mysql的默认存储引擎,还有MyISAM。

Q:这两者有什么区别?

A:在事务方面,InnoDB支持事务,而MyISAM不支持事务。从锁的粒度上来说,InnoDB是行级锁,而MyISAM是表级锁。

Q8:说说JDBC创建连接的过程

A:(没回答出来)

数据库驱动:

Class.forName("com.mysql.jdbc.Driver"); 

获取连接:

Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); 

创建Statement或者PreparedStatement对象:

Statement stmt = conn.createStatement(); 

执行sql数据库查询:

ResultSet rs = stmt.executeQuery("SELECT id, name, age FROM m_user where id =1"); 

解析结果集:

System.out.println("name: "+rs.getString("name")+" 年龄:"+rs.getInt("age"));

反问阶段:

面试情况不太好,也没心情问啥问题了,就问了个什么时候知道面试结果(1周左右)。

讨论&交流

这里汇总下自己当时没get到面试官想问的还有没有答好、不懂的问题:

  1. 用友的笔试很简单,提前批和正式批做了两次,正式批1道SQL和2到算法。

  2. SpringBoot自动装载原理。SpringBoot没有系统学习过,很多基础的东西都不知道;

  3. ReentryLock的实现原理,只会用,学习的时候没有关注原理。

  4. Spring AOP的使用,学习的时候学过,但是实践中竟然还没真正用过。

  5. 如何解决单例Bean的线程安全问题?应该是ThreadLocal吧。

总结:面试主要问Java相关的基础知识和Java开发框架。开发框架忘完了😮‍💨,答得太差了。秋招至今还没收到满意的offer,还是太菜了,之后应该不会再参加新的面试了,准备安心准备公务员了,公务员再没上岸,春招见吧😭。

#面试复盘##用友##面经##校招##java工程师#
全部评论
回答得这么好居然都能挂。。。我大部分都没回答上,手撕代码也没全部通过,最后面试官夸我挺强的????然后还教我怎么改简历,怎么讲突出亮点,后续跟HR面的时候有哪些技巧,注意什么。。。人间迷惑 真的面得好差,很多都说我不知道,没接触过,最后反问工作节奏,他说兄弟告诉你吧,就是996,宿舍很近,不用担心挤地铁公交哦。。。
4 回复
分享
发布于 2021-10-15 17:03
不是大部分都回答上来了吗?感觉很好啊
点赞 回复
分享
发布于 2021-10-15 15:05
乐元素
校招火热招聘中
官网直投
我昨天刚面完,纯聊项目,就聊了20多分钟,一道八股没问
点赞 回复
分享
发布于 2021-10-15 15:22
innodb和mysum还有一点,数据和索引的组织方式不同,innodb是聚簇索引(这里可以适当展开,比如没有主键的情况),索引和数据同一个文件 而mysum索引文件和数据文件是分开的
点赞 回复
分享
发布于 2021-10-15 18:45
🔒一般是sync锁和lock接口下的锁,一个出现竞争就走内核,一个是JavaAPI基于AQS,然后就是那个单例,如果是类变量,多例也无法保证线程安全,必须使用threadlocal
点赞 回复
分享
发布于 2021-10-15 19:55
楼主什么时候笔试的呀?
点赞 回复
分享
发布于 2021-10-16 17:41
有后续吗
点赞 回复
分享
发布于 2021-10-18 15:26
 14号一面 问的特别广 基础 集合 Juc redis 项目 spring mysql调优 30多分钟
点赞 回复
分享
发布于 2021-10-19 10:31

相关推荐

10 57 评论
分享
牛客网
牛客企业服务