哈啰出行Java后台开发一面面经【复盘】

电话面试,时间30分钟

自我介绍

介绍开源项目的时候,项目的亮点没有说,还有难点也可以说,难点有架构设计

使用的jdk版本,我说了jdk11和jdk1.8都有用

每一个jdk版本的新特性都需要了解到,如果问到jdk11的新特性,不会,很影响面试体验

我讲了jdk8中的lambda表达式,还有就是hashmap的不同,回答的很少

jdk8的新特性(没记住)

  1. 新增了lambda,使得写匿名函数更加的优雅,代码更简洁

  2. Stream流:处理集合更优雅,方便

  3. 在接口中新增了默认方法

    1. 向接口中添加默认方法,不会破坏接口的实现类,如果在jdk1.7,我们向接口中添加新的功能的时候,我们需要在实现类中重写这个方法

    2. 提供默认方法,能够减少实现类中的代码量,这些方法的功能都是相同的,如果某个实现类的功能不同,则重写该方法就行

    3. 因为实现类可以实现多个接口,如果多个接口中的都有相同的默认方法,就会出现菱形继承问题,因为该实现类,不知道使用哪个的接口的默认方法

      1. 类优先原则:如果一个类继承了另一个类,并且同时实现了一个或多个接口,那么在方法解析时,类的方法优先级高于接口的默认方法。

      2. 接口冲突原则:如果一个类实现了多个接口,而这些接口中有相同的默认方法,那么该类必须明确覆盖这个默认方法,提供自己的实现。

      解决菱形继承问题就是在继承类中重写默认方法,调用的时候,使用的是继承类的默认方法,而不是接口中的默认方法

  4. 函数式接口:接口中只包含一个抽象默认,有没有默认方法都不影响

  5. 日期和时间API(Date and Time API):JDK 1.8引入了一个新的日期和时间API,提供了更全面和灵活的处理日期和时间相关操作的方式。它包括了LocalDate、LocalTime、LocalDateTime和Period等类

    原来的Date等类存在的问题:

    1. Date类是可变的,会存在线程安全问题
    2. 不一致问题,Date的月份是从0开始,和日常的不一样
    3. Date中的很多Api都是过时的
    4. 缺乏时区支持:Date类没有明确的时区支持。这使得在处理跨时区的日期和时间时变得困难,并且容易导致错误。
  6. Nashorn JavaScript引擎:JDK 1.8用一个轻量级高性能的JavaScript引擎Nashorn替代了旧的Rhino JavaScript引擎。它允许你在Java应用程序中嵌入JavaScript代码并无缝执行。

    这个可以不用了解

  7. 方法引用:是Java 8引入的一种语法简写方式,用于直接引用现有方法或构造函数。它提供了一种更简洁、更可读的方式来表示某个方法作为函数式接口的实现。

    方法引用的语法形式为Class::methodName,或者instance::methodName,或者ClassName::new

    这个方法引用,也就是我们通过Class::methodName或者其他形式调用之后,返回一个java.util.function包下的对象,具体使用哪个类,看该methodName的返回值和参数决定

    public class Student {
        private static String name = "xcye";
        public static String getName() {
            return name;
        }
        public void printName() {
            System.out.println("print: " + name);
        }
        public Student(String name) {
            System.out.println("构造器: " + name);
        }
    }
    
    public static void main(String[] args) {
        // String name = Student::getName;
        Student student = new Student("asdf");
        Supplier<String> getNameMethod = Student::getName;
        System.out.println(getNameMethod.get());
    
        Consumer<Student> consumer = Student::printName;
        consumer.accept(new Student("asdf"));
    }
    

jdk1.7和1.8中的hashmap的区别

只讲到数据结构不同

还有哈希算法不同等

为何hashmap中的扩容是<<1

我回答的是获取元素更快,错误回答

回答这个问题,应该从hash这个点来回答,在对key进行哈希运算的算法为

static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

根据hash获取bucket的算法为hash & (length - 1)

讲一下hashmap的扩容步骤

我只讲了当数组容量到达临界线时,是如何扩容的,但是细节没有讲,当时也是忘记了

讲一下hashmap的put流程

讲了个大概,细节还需要再跑一下

ConcurrentHashMap的put流程

忘记细节,只记得获取数组下标是通过cas,key和value不能为null

这里可能会问一个为什么不能为null问题

其他的想不起来了

反问

  • 对我有什么建议么
  • 假如进去之后,会做什么业务(阿里巴巴的数据中台)

没有后续,到现在也没有通知,我之前是在官网投的,投了3个岗位,但是我去看状态还是正常,我后面好像又在老板直骗上投,感觉这个面试是老板直骗投的,而不是从官网投递的

引流:阿里巴巴,字节跳动,腾讯,抖音,Java校招

#我的失利项目复盘##java校招##哈啰出行校招#
全部评论
redis都问了啥呀?
1 回复 分享
发布于 2023-06-30 15:48 韩国
OC了嘛
点赞 回复 分享
发布于 2023-07-03 20:09 江苏
你好,请问挖项目吗
点赞 回复 分享
发布于 2023-07-03 14:14 陕西
在哪投的😋
点赞 回复 分享
发布于 2023-06-30 23:31 北京
多少K
点赞 回复 分享
发布于 2023-06-30 15:47 韩国

相关推荐

bg双非本科,方向是嵌入式。这次秋招一共拿到了&nbsp;8&nbsp;个&nbsp;offer,最高年包&nbsp;40w,中间也有一段在海康的实习经历,还有几次国家级竞赛。写这篇不是想证明什么,只是想把自己走过的这条路,尽量讲清楚一点,给同样背景的人一个参考。一、我一开始也很迷茫刚决定走嵌入式的时候,其实并没有一个特别清晰的规划。网上的信息很零散,有人说一定要懂底层,有人说项目更重要,也有人建议直接转方向。很多时候都是在怀疑:1.自己这种背景到底有没有机会2.现在学的东西到底有没有用3.是不是已经开始晚了这些问题,我当时一个都没答案。二、现在回头看,我主要做对了这几件事第一,方向尽早确定,但不把自己锁死。我比较早就确定了嵌入式这个大方向,但具体做哪一块,是在项目、竞赛和实习中慢慢调整的,而不是一开始就给自己下结论。第二,用项目和竞赛去“证明能力”,而不是堆技术名词。我不会刻意追求学得多全面,而是确保自己参与的每个项目,都能讲清楚:我负责了什么、遇到了什么问题、最后是怎么解决的。第三,尽早接触真实的工程环境。在海康实习的那段时间,对我触动挺大的。我开始意识到,企业更看重的是代码结构、逻辑清晰度,以及你能不能把事情说清楚,而不只是会不会某个知识点。第四,把秋招当成一个需要长期迭代的过程。简历不是一次写完的,面试表现也不是一次就到位的。我会在每次面试后复盘哪些问题没答好,再针对性补。三、我踩过的一些坑现在看也挺典型的:1.一开始在底层细节上纠结太久,投入产出比不高2.做过项目,但前期不会总结,导致面试表达吃亏3.早期有点害怕面试,准备不充分就去投这些弯路走过之后,才慢慢找到节奏。四、给和我背景相似的人一点建议如果你也是双非,准备走嵌入式,我觉得有几件事挺重要的:1.不用等“准备得差不多了”再投2.项目一定要能讲清楚,而不是做完就算3.不要只盯着技术,多关注表达和逻辑很多时候,差的不是能力,而是呈现方式。五、写在最后这篇总结不是标准答案,只是我个人的一次复盘。后面我会陆续把自己在嵌入式学习、竞赛、实习和秋招中的一些真实经验拆开来讲,希望能对后来的人有点帮助。如果你正好也在这条路上,希望你能少走一点弯路。
x_y_z1:蹲个后续
点赞 评论 收藏
分享
2025-12-30 16:42
同济大学 C++
仁狂躁使者:哎呀,不用担心,我当时配环境配了两天,项目捋不清就问问导师能不能用ai,慢慢就清了,会好起来的
点赞 评论 收藏
分享
评论
13
64
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务