2023年Java秋招面经


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变成77>阈值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呢?

文章作者: 冬瓜冬瓜排骨汤
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 冬瓜冬瓜排骨汤 !
  目录