2023年Java秋招面经
火烈鸟-优胜科技
笔试 :
UDP 和 TCP 的区别
线程与进程的区别
HTTP 中 301.403.502 分别是什么?
301是永久重定向, 403是服务器拒绝访问, 502是访问服务器错误
public, private, protect 的区别
float的内存空间是多少, 内存结构是什么?
占用4个字节, 内存结构是 |-------- 31 -------|------------ 30-23 ------------ |------------ 22-0 ------------|
排序算法(快速排序)
二叉树的后序遍历
Linux的查找命令
//假设我有一个名为test.txt的文件,我需要找到它但是不确定具体位于哪个目录下。我可以执行下面的命令,从文件系统的顶部/开始搜索。 find / -type f -name test.txt /表示从文件系统的顶部开始搜索。 -type 是你要寻找的东西的类型。f表示文件,b表示块状特殊设备文件,c表示字符特殊设备文件,d表示目录,l表示符号链接。 -name是你要寻找的东西的名字,结果将完全匹配。
sql语句的统计查询
大管加
- A,B,C,D,E,F栈入, 出栈是B,D,C,F,E,A. 栈的容量是多少
- 冒泡排序的时间复杂度一定比快速排序的时间复杂度低吗?
- 一个网址www.123.com从网页上输入到返回这个页面中间发生了什么?
- 线程与进程的关系
- 如何提高服务器的响应速度, 说说你的方案
- 不考虑线程安全的情况下, 使用集合类的哪一种可以快速查找(集合的特性与选择)
- redis的数据类型有哪些?
- 二分查找的思想
一面
http 与 https 区别, 详细讲讲他们各自是什么
get请求与post请求的区别
http 的简单请求和复杂请求
简单请求 :
1、请求方法是以下三种方法之一:GET、POST、HEAD。 2、不能自定义请求头header,不得人为设置该集合之外的其他首部字段。该集合为:Accept、Accept-Language、Content-Language、Content-Type 3、Content-Type 的值仅限于下列三者之一: text/plain multipart/form-data application/x-www-http-urlencoded
复杂请求 :
非简单请求即为复杂请求。复杂请求我们也可以称之为在实际进行请求之前,需要发起预检请求的请求。
两者的区别 :
复杂请求会多发一次请求,例:我们向 3000 服务器发送 "/getdata"的get 请求,浏览器会额外发送一个"/getdata"的options请求,这个请求我们称为预请求,服务器也会做出“预响应”,预请求实际上是一种权限请求,只有预请求成功后,实际的请求才会执行
线程与进程的区别
怎么保证线程安全
volatile 是什么
volatile 是 JVM 提供的轻量级的同步机制。
为什么要使用 volatile, 怎么使用
volatile 关键字可以保证并发编程三大特征(原子性、可见性、有序性)中的可见性和有序性,不能保证原子性。 在变量面前加入 volatile
什么是可见性
其他线程从主内存空间把值拷贝到自己的工作空间,线程修改之后的值会返回给主内存,主内存会通知其他线程,此为可见性。
什么是有序性
volatile可以使指令一个一个的执行。
hashmap底层与扩容机制
你知道哪些线程安全的集合?
java.uti包中的集合类大部分都是非线程安全的,例如:ArrayList/LinkedList/HashMap等等,但也有少部分是线程安全的,像是Vector和Hashtable,它们属于很古老的API了,是基于Synchronized实现的,性能很差,在实际的开发中不常用。一般可以使用collections工具类中的syncheronizedXxx()方法将非线程安全的集合包装成线程安全的类。在java5之后可以使用concurrent包提供的大量的支持并发访问的集合类,例如ConcurrentHashMap/CopyOnWriteArrayList等
synchronized 的用法及原理
一、用法:1. 静态方法上,则锁是当前类的Class对象。 2. 作用在普通方法上,则锁是当前的实例(this)。 3. 作用在代码块上,则需要在关键字后面的小括号里,显式指定一个对象作为锁对象。 能够保证同一个时刻只有一个线程执行该段代码,保证线程安全。 在执行完或者出现异常时自动释放锁。 二、原理:底层是采用Java对象头来存储锁信息的,并且还支持锁升级。在JVM里的实现都是 基于进入和退出Monitor对象来实现方法同步和代码块同步
wait 与 sleep 的区别
1. 所属的类型不同 - wt()是Object类的实例方法,调用该方法的线程将进入WTING状态。 - sleep()是Thread类的静态方法,调用该方法的线程将进入TIMED_WTING状态。 2. 对锁的依赖不同 - wt()依赖于synchronized锁,通过监视器进行调用,调用后线程会释放锁。 - sleep()不依赖于任何锁,所以在调用后它也不会释放锁。 3. 返回的条件不同 - 调用wt()进入等待状态的线程,需要由notify()/notifyAll()唤醒,从而返回。 - 调用sleep()进入超时等待的线程,需要在超时时间到达后自动返回。
艾姆拜氪
一面
假如有N个数据, 要存放到hashmap中, 初始容量要多少 ?
阿里巴巴开发手册 集合初始化时, 指定集合初始化值大小 说明 : HashMap 使用 HashMap(int initialCapacity) 初始化 正例 : initialCapacity = (需要存储的元素个数 / 负载因子) + 1. 如果暂时无法确定初始值大小, 请设置为16 反例 : HashMap 需要放置1024个元素, 由于没有设置容量初始大小, 随着元素不断增加, 容量7次被迫扩大, resize 需要重建hash表, 严重影响性能
为什么需要 + 1 ?
因为扩容不是在插入前,而是在插入后进行的。如果我们不+1,指定为new HashMap(8),则扩容阈值为8*0.75=6 在我们插入最后一个即第6个元素后,会进行自增6变成7,7>阈值6因此会进行扩容,而我们已经没有元素需要添加了,从而造成额外的一次扩容操作 因此初始化时指定的容量应为(需要的容量/负载因子+1) 例子 : 有6个元素,则HashMap的初始化容量应为(6/0.75 +1=9)即new HashMap(9),实际容量为比9大的最近的2的指数即16
HashMap的长度始终保持2的n次方
多线程同时运行会造成阻塞吗 ?
线程阻塞的定义 在多线程情况下,如果一个线程拥有某个资源的锁,那么这个线程就可以运行资源相关的代码。而其他线程就只能等待其执行完毕后,才能继续争夺资源锁,从而运行相关代码。
你用到redis中的哪些数据结构 ?
Linux 命令下列出所有进程
ps -a
华勤技术
一面
整个后端的数据流转过程
MVC:本人理解为modal 、 view 、 controller; 当一个http请求过来之后,经过路由映射到controller,controller执行业务层代码,获得数据Modal,然后交给渲染器进行渲染视图view,最后返回给客户端一个modalAndView。 这个是SpringMvc的大致处理流程。 .... ....
你的项目是如何实现的鉴权 ?
对于Java反射的理解, 什么时候用过反射 ?
MySQL 中索引的好处和坏处, 都有哪些索引类型, 用过哪些 ?
索引就相当于数据库的目录, 索引是一种特殊的数据库结构,由数据表中的一列或多列组合而成,可以用来快速查询数据表中有某一特定值的记录。 优点 : 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 缺点 : 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 创建索引和维护索引需要空间成本,每一条索引都要占据数据库的物理存储空间,数据量越大,占用及空间也越大(数据表占据的是数据库的数据空间) 会降低表的增删改的效率,因为每次增删改索引需要进行动态维护,导致时间变长。
有哪些索引类型
唯一索引 : 要求索引列的所有值都只能出现一次,即必须唯一。 普通索引 : 要求索引列的所有值都只能出现一次,即必须唯一。 主键索引 : 全文索引 : MySQL可以通过建立全文索引,利用查询关键字和查询列内容之间的相关度进行检索,可以利用全文索引来提高匹配的速度。比如实现全匹配模糊查询。但是实际场景测试mysql的全文索引性能非常不稳定,不建议生产环境使用。需要使用全文检索的地方,还是推荐使用Elasticsearch
left join 和 inner join 的区别, 如果有A表 100 条, B表 10 条, A left join B 会有多少条记录 ?
左外连接 : 查询左表所有数据, 以及两张表交集部分数据 内连接 : 查询 A, B交集部分数据 100条, 因为使用的是左外连接, 查询左表所有数据, 以及两张表交集部分数据
值传递和引用传递的区别
java 中传递数据库对象是引用传递还是值传递 ?
是引用传递, 数据库对象在传递给调用参数时,可以直接修改该地址的内容, 会影响到实际参数, 我们所说的增删改查.
吉联科技
技术面
介绍一下论坛项目
项目的主要功能是什么?
说说登录模块的流程吧
你提到拦截器, 说说拦截器在你项目上的实现吧
有优化吗? 微服务了解吗? — 不了解
你刚刚说过ticket是存在cookie的, 那redis中是怎么存的 ?
来说说Java基础吧. Java的基本数据类型有哪些?
拆箱装箱是什么意思?
那拆箱和装箱的作用是什么呢? —- 答不清楚, 面试官给我解释了一下…..寄
作用:为了保证通用性和提高系统性能 一种最普通的场景是调用一个包含类型为Object的参数的函数(方法),该Object可支持任意 类型,以便通用。当你需要将一个值类型传入容器时,就需要装箱了。 另一种的用法,就是一个泛型 的容器,同样是为了保证通用,而将元素定义为Object类型的,将值类型的值加入该容器时,需要装箱。
你平时有用过什么Java常用类吗?
map用得比较多是吧? 讲讲map的数据结构吧.
那说说map的扩容机制吧.
那说说map是怎么做查询的? — 答就使用key查value啊….. 面试官不满意哈哈哈哈哈, 又引导了我问下个问题
你刚刚答得很浅啊, 说说怎么使用key查的吧? 有什么算法吗? —- 现在才反应过来是考我getmap()源码….大概和面试官说了一下源码原理
你刚刚说到哈希算法, 那说说map中的put原理吧
那来讲一下框架吧. 你认为为什么spring会这么火, 就是大家都来用它?
你刚刚提到aop和ioc, 那先来说说ioc是什么吧
那ioc有什么作用呢?
哪里有用到ioc? — 答JavaBean…..答得不完整
aop是什么?
哪里有用到aop呢?
那mybatis知道吗? 说说mybatis是什么吧.
你刚刚说到sql是在xml文件上写的, 那我们写sql语句的时候, 有${}和#{}, 说说他们有什么区别 ?
说说中间件吧, Kafka有用到吗? — 没有
redis有用到是吧, 那说说redis的常见数据类型吧.
他们的使用场景是什么? 你项目中有用到吗? 怎么用的.
我看你项目一个是web项目, 还有一个是RPC项目, 都有提到HTTP. 那来说说HTTP是什么吧
常见的请求是什么呢?
GET请求和POST请求有什么区别呢?
那你知道POST请求的具体数据格式吗? —- 答POST请求数据是放在body里面的, 具体的格式不清楚
那来说说多线程这方面的知识吧, 进程和线程有什么区别?
在我们Windows和Linux系统中, 你认为应用是进程还是线程呢? 那应用里面执行的模块呢?
你刚刚提到死锁, 那来说说线性安全是什么意思吧?
那怎么保证线性安全呢?
你提到有synchronized和volatile以及加LOCK锁, 那我们就来聊聊synchronized吧, 它是什么呢?
synchronized的实现方式 —– 答三种, 但是每一点的具体实现答得有点乱, 不知道面试官有没有听懂
好的, 那我们来聊聊MySQL数据库吧, 说说事务吧?
那事务有多少种隔离级别呢?
哪一种性能最好?
说说索引是什么吧?
你知道有什么索引吗?
那按你现在所学的理解, 什么情况下需要索引呢?
那什么情况下不需要索引呢?
来个场景题吧. 假如现在有一份订单数据, 有订单ID, 订单类型, 订单价格, 订单的创建时间, 说说你是怎么使用索引的呢? —- 答用订单id作为唯一索引, 面试官否定掉了, 说订单id不唯一, 接着答使用订单创建时间, 面试官说不行, 我们可以使用普通索引啊, 为什么一定使用唯一索引呢……..寄
那说说建表关联吧, 多表查询中有内连接和左连接还有右连接, 说说他们的区别吧?
他们是怎么使用的呢?
来个场景题吧 —– 忘记了, 大概是问多表查询的过程的…….寄
group by知道吗? 是啥意思
Linux知道吗? — 赶快说只知道基础命令, 然后快速说了一下查看内存是free, 寻找文件是find, 修改权限是chmod等等, 不能等他问….. 不然就寄了
噢噢好的, 那有没有部署过项目呢? — 答没有哈哈哈哈哈
反问 : 进去后部门是什么? 回答我是供应链部门
跟谁学
一面
- Java中的集合有哪些 ?
- ArrayList 和 LinkedList 区别
- JVM内存区域
- 对象从创建到销毁过程
- 什么时候引起 full gc, 有什么危害?
- sql查询优化
- 事务的四大特性
- 事务如何保证原子性
- 事务隔离级别
- @Transactional 如何指定隔离级别
- Spring中 IOC 和 AOP 的理解
- 如何进行依赖注入, byName 和 byType 区别
- 手写单例模式
- 说一下数组和链表的区别
- 为什么数组查询比链表快?
- 讲讲hashMap
- synchronized 和 Lock 的区别
- 为什么有synchronized 还要有lock呢?