当前位置: 首页 > 面试经验 >

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

优质
小牛编辑
73浏览
2023-06-30

哈啰出行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校招##哈啰出行校招#
 类似资料: