• 【面试题-Java】2022面试题干货汇总(持续更新)


    前言

    此汇总借鉴一些博主的总结,通读之后去掉了一下过于简单的面试题,意在做出一定的精简,方便阅读。

    PS:这些博主的文章链接会放在此文的末尾致谢部分。

    一、Java基础

    1.1 Hashcode的作用

    java的集合有两类,一类是List,还有一类是Set。前者有序可重复,后者无序不重复。当我们在set中插入的时候怎么判断是否已经存在该元素呢,可以通过使用equals()方法。但是如果元素太多,用这样的方法就会比较慢。
    于是有人发明了哈希算法来提高集合中查找元素的效率。 这种方式将集合分成若干个存储区域,每个对象可以计算出一个哈希码,可以将哈希码分组,每组分别对应某个存储区域,根据一个对象的哈希码就可以确定该对象应该存储的那个区域。
    hashCode方法可以这样理解:它返回的就是根据对象的内存地址换算出的一个值。这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。
    如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equals()方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。这样一来实际调用equals()方法的次数就大大降低了,几乎只需要一两次。

    1.2 String、String StringBuffer 和 StringBuilder 的区别是什么?

    String是只读字符串,它并不是基本数据类型,而是一个对象。从底层源码来看是一个final类型的字符数组,所引用的字符串不能被改变,一经定义,无法再增删改。每次对String的操作都会生成新的String对象。

    private final char value[];
    
    • 1

    每次+操作 : 隐式在堆上new了一个跟原字符串相同的StringBuilder对象,再调用append方法 拼接+后面的字符。
    StringBuffer和StringBuilder他们两都继承了AbstractStringBuilder抽象类,从AbstractStringBuilder抽象类中我们可以看到

    /**
     * The value is used for character storage.
     */
    char[] value;
    
    • 1
    • 2
    • 3
    • 4

    他们的底层都是可变的字符数组,所以在进行频繁的字符串操作时,建议使用StringBuffer和StringBuilder来进行操作。 另外StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。

    1.3 HashMap和HashTable的区别

    1、两者父类不同
    HashMap是继承自AbstractMap类,而Hashtable是继承自Dictionary类。不过它们都实现了同时实现了map、Cloneable(可复制)、Serializable(可序列化)这三个接口。
    2、对外提供的接口不同
    HashtableHashMap多提供了elements() 和contains() 两个方法。
    elements() 方法继承自Hashtable的父类Dictionnary。elements() 方法用于返回此Hashtable中的value的枚举。
    contains()方法判断该Hashtable是否包含传入的value。它的作用与containsValue()一致。事实上,contansValue() 就只是调用了一下contains() 方法。
    3、对null的支持不同
    Hashtable:key和value都不能为null。
    HashMap:key可以为null,但是这样的key只能有一个,因为必须保证key的唯一性;可以有多个key值对应的value为null。
    4、安全性不同
    HashMap是线程不安全的,在多线程并发的环境下,可能会产生死锁等问题,因此需要开发人员自己处理多线程的安全问题。
    Hashtable是线程安全的,它的每个方法上都有synchronized关键字,因此可直接用于多线程中。
    虽然HashMap是线程不安全的,但是它的效率远远高于Hashtable,这样设计是合理的,因为大部分的使用场景都是单线程。当需要多线程操作的时候可以使用线程安全的ConcurrentHashMap
    ConcurrentHashMap虽然也是线程安全的,但是它的效率比Hashtable要高好多倍。因为ConcurrentHashMap使用了分段锁,并不对整个数据进行锁定。
    5、初始容量大小和每次扩充容量大小不同
    6、计算hash值的方法不同

  • 相关阅读:
    封装 Encapsulation
    曲柄压力机的离合器和制动系统设计
    基于matlab的图像复原仿真GUI
    设计模式-行为型-解释器模式
    Java:外包Java项目有什么好处?
    告别单调,Django后台主页改造 - 使用AdminLTE组件
    【WINDOWS / DOS 批处理】if命令中的比较运算符
    基于两级分解和长短时记忆网络的短期风速多步组合预测模型
    通过Shell脚本自动安装Hive&JDBC测试&提供CDH5网盘地址
    02 【开发服务器 资源模块】
  • 原文地址:https://blog.csdn.net/lc1025082182/article/details/123029489