V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hakunamatata11
V2EX  ›  推广

Java 面试的的时候你被提过哪些问题?

  •  
  •   hakunamatata11 · 2020-12-01 17:39:11 +08:00 · 502 次点击
    这是一个创建于 1250 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Java 面试可以问的问题太多了,我目前在 BAT 某厂任职高级技术专家,不过从未离开过开发一线,自己也做面试官,说说我面试的时候一般会问什么问题吧。其实具体哪个问题不是关键,我想说的是这些问题背后,作为面试官是怎么想的。

    Java 中操作字符串都有哪些类?它们之间有什么区别?

    答案是这样的:

    String,StringBuffer,StringBuilder 。区别 String 声明的是不可变的对象,每次操作必然产生一个新的对象; StringBuffer 和 StringBuilder 都继承自抽象类 AbstractStringBuilder ; StringBuffer 具备线程安全性;

    在使用场景上,并发必选 StringBuffer,迭代必选 StringBuilder,普通场景选 String,避免中途不必要的类型转换开销。

    虽然看起来简单,但从答案组织策略来看,知道有什么,知道为什么,知道怎么用缺一不可,否则就等着面试官的灵魂拷问吧。

    这里面还有两个加分项:

    1.知道 StringBuffer 和 StringBuilder 都继承自抽象类 AbstractStringBuilder

    2.String 的源码解读:final 修饰-->不可变-->每次操作都会生成新的 String 对象;对比 StringBuffer 和 StringBuilder-->值可变,拼接字符串开销

    这只能算开场热身,接下来才是重点。

    面试官会问你线程安全性。可以直接查源码,找 synchronized 、线程锁,得到结论:StringBuffer 具备线程安全性。

    你以为要结束了?接着问:既然 StringBuffer 具备线程安全性,迭代开销又小,那我们在工程实践中是不是首选 StringBuffer 就可以了?这就是考验你的批判性思维

    JDK 和 JRE 有什么区别?

    普通解答:具体来说 JDK 其实包含了 JRE,同时还包含了编译 Java 源码的编译器 javac,还包含了很多 Java 程序调试和分析的工具。简单来说:如果需要运行 Java 程序,只需安装 JRE 就可以了,如果需要编写 Java 程序,需要安装 JDK 。

    追问:除了 javac,你还了解些什么命令行工具,它们的用途是什么?

    • Jcmd:综合工具
    • jps:虚拟机进程状况工具
    • jstat:虚拟机统计信息监视工具
    • jinfo:Java 配置信息工具
    • jmap:Java 内存映像工具

    ……

    追问:对于 jstat,你了解哪些参数?

    这里面试官可能会视你的回答继续来问。

    1 )如果你提到 class,面试官可能会

    追问一:Class 加载的时机?

    回答要点:

    • 启动类加载器,根转载器,用户不可访问,Bootstrap ClassLoader,加载 JAVA_HOME\lib,或者被-Xbootclasspath 参数限定的类;
    • 扩展类加载器,Extension ClassLoader,加载\lib\ext,或者被 java.ext.dirs 系统变量指定的类;
    • 应用程序类加载器,Application ClassLoader,加载 ClassPath 中的类库;
    • 自定义类加载器,通过继承 ClassLoader 实现,一般是加载我们的自定义类。

    追问二:Class 加载的过程?

    回答:加载→验证→准备→解析→初始化→使用→卸载

    2 )如果你提到了 gc,面试官可以问:谈谈你对 Java 虚拟机栈的了解。

    然后追问:JVM 的垃圾回收算法有哪些?

    就不一一贴答案了,有兴趣的可以看B 站完整视频

    再举个例子:

    == 和 equals 的区别是什么?

    答案要点:两个方法都是比较等价性,它们的区别要从“基本类型”和“引用类型”来看,作为基本类型来说,它们比较的都是值,作为引用类型——对象来说,它们比较的是双方是否为同一个对象。

    如果你看过 equals()的原生实现的话,就可以发现它们之间直接的关系:

    public  boolean  equals(Object obj){
    
    return (this == obj);
    
    }
    

    所以能说出下面的内容则加分:我们可以通过重载 Object 中的 equals 方法来实现自定义的等价计算方法。比如,在 String 类型中,由于源码中重新实现了该方法,所以会产生下面的结果:

    public boolean equals(Object anObject) {
    
     if (this == anObject) {
    
     return  true;
    
    }
    
    if (anObject instanceof String) {
    
            String anotherString = (String)anObject;
    
     int n = value.length;
    
     if (n == anotherString.value.length) {
    
     char v1[] = value;
    
     char v2[] = anotherString.value;
    
     int i = 0;
    
     while (n-- != 0) {
    
     if (v1[i] != v2[i])
    
     return  false;
    
                  i++;
    
                }
    
     return  true;
    
            }
    
        }
    
     return  false;
    
    }
    

    Tips:用字符串常量实例化的 String 的内容其实是保留在常量区。

    例如:

    String x = "string"

    String y = "string"

    x==y ——> true

    引用的都是常量区的同一个数据项,所以有上面的结果。

    这题的考察点是 equals()的概念,实际要求是平时对源码的深挖意识即技术钻研和批判性思维。

    HashMap 、Hashtable 、TreeMap 有什么区别?

    Hashtable 、HashMap 、TreeMap 都是最常见的一些 Map 实现,是以键值对的形式存储和操作数据的容器类型。

    Hashtable 是 Java 类库提供的一个哈希实现,本身是同步的,不支持 null 键和 null 值,由于同步导致性能开销,所以已经很少被推荐使用。

    HashMap 是应用更加广泛的哈希表实现,行为上大致与 HashTable 一致,主要区别在于 HashMap 不是同步的,支持 null 键和 null 值等。通常情况下 HashMap 进行 get 和 put 操作可以达到常数时间的性能,所以它是绝大部分利用键值对存取场景的首选。

    TreeMap 则是基于红黑树的一种提供顺序访问的 Map,它的 get 、put 、remove 之类的操作都是 O(logn)的时间复杂度,具体顺序可以由指定的 Comparator 来决定,或者根据键的自然顺序来判断。

    若在单线程中,我们往往会选择 HashMap ;而在多线程中,则会选择 Hashtable ;若不能插入 null 元素,则选择 Hashtable 。

    总之,大厂面试 Java 程序员的基本原则就是从常识开始,逐渐诱导,考察原理理解的完整度和深度。考察思路:

    1. 简单的话题引入,麻痹候选人
    2. 找一个角度 /工具让候选人去匹配场景
    3. 深挖背后的原理

    面试题成千上万,听起来只是要问题的解法方向。 ——其实不是

    比如面试官问:

    • 你的系统最高并发是多少?
    • 如果有一天并发达到 5 万 KPS,系统需要哪些改进?
    • 当然也可以问,在你的系统架构里面
    • 高速缓存 /数据库分表,这些的用途是什么?它们的原理是什么?

    这些其实是一个问题,就是高并发。 技术万变不离其宗,讲究的是整体性的通用技术栈。

    最后,面试中你的每一次回答都要珍惜,每一句话都要斟酌。你要告诉面试官:你真的很专业。

    总体来说,大厂招聘要求是越来越严苛的。所以在我主讲的《Java 高级工程师 P6+》打法就是技术栈的通透讲授、源码的分析导读、贴近真实的工程实践、大厂思维的架构升级。目标也不是培养普通搬砖码农,而是懂原理、知源码、会刷题、能搭建高可用架构的高级工程师 /架构师,现在前两章免费试听哦~

    关于大厂 Java 面试的特点和应对方式,我将在《 Java 高级工程师 P6+》首节公开课中分享,有兴趣的同学可以来免费试听前两章。

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2556 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 13:01 · PVG 21:01 · LAX 06:01 · JFK 09:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.