Java后端工程师常见面试题

本文详述了Java后端工程师面试中常见的问题,包括Java集合框架(如ArrayList, LinkedList, HashMap, ConcurrentHashMap)的区别和使用场景,线程安全与非线程安全的特性,以及HashMap和HashTable的对比。同时,探讨了Java IO框架,如字节流与字符流、BIO、NIO和AIO的区别,多线程的实现方式和线程池的参数。此外,还涵盖了Java内存模型、垃圾回收机制和数据库优化措施,如SQL优化、索引失效情况等。" 45790003,5035413,向量空间模型在自然语言处理中的应用解析,"['自然语言处理', '数据挖掘算法', '文本分析']
摘要由CSDN通过智能技术生成

以下是整理的Java后端工程师常见面试题,希望有助于找工作:

1,对Java集合框架的理解。ArrayList和LinkedList的区别和优缺点,以及使用场景。扩容因子了解吗?分别是多少。

  Java集合框架

集合可以看作是一种容器,用来存储对象信息。所有集合类都位于java.util包下,但支持多线程的集合类位于java.util.concurrent包下。

  数组与集合的区别如下:

  1)数组长度不可变化而且无法保存具有映射关系的数据;集合类用于保存数量不确定的数据,以及保存具有映射关系的数据。

  2)数组元素既可以是基本类型的值,也可以是对象;集合只能保存对象。

  Java集合类主要由两个根接口Collection和Map派生出来的,Collection派生出了三个子接口:List、Set、Queue(Java5新增的队列),因此Java集合大致也可分成List、Set、Queue、Map四种接口体系,(注意:Map不是Collection的子接口)。

  其中List代表了有序可重复集合,可直接根据元素的索引来访问;Set代表无序不可重复集合,只能根据元素本身来访问;Queue是队列集合;Map代表的是存储key-value对的集合,可根据元素的key来访问value。

ArrayList和LinkedList的区别和优缺点,以及使用场景

  区别:

1、ArrayList是实现了基于动态数组的数据结构,LinkedList是基于链表结构。
2、对于随机访问的get和set方法,ArrayList要优于LinkedList,因为LinkedList要移动指针。
3、对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。
优缺点:

1、对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是 统一的,分配一个内部Entry对象。
2、在ArrayList集合中添加或者删除一个元素时,当前的列表移动元素后面所有的元素都会被移动。而LinkedList集合中添加或者删除一个元素的开销是固定的。
3、LinkedList集合不支持 高效的随机随机访问(RandomAccess),因为可能产生二次项的行为。
4、ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间

使用场景

ArrayList使用在查询比较多,但是插入和删除比较少的情况,而LinkedList用在查询比较少而插入删除比较多的情况

扩容因子了解吗?分别是多少

集合有初始容量,当容量大于一定长度L时,集合需要进行扩容;而该长度L等于当前长度 * 扩容因子。

HashMap和HashSet扩容因子为:0.75,ArrayList和Vector是1。

2,HashMap和HashTable的区别,优缺点。HashMap和ConcurrentHashMap的区别。

  HashMap:

  HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。

  HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。

  HashMap 实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆。

  HashMap存数据的过程是:

  HashMap内部维护了一个存储数据的Entry数组,HashMap采用链表解决冲突,每一个Entry本质上是一个单向链表。当准备添加一个key-value对时,首先通过hash(key)方法计算hash值,然后通过indexFor(hash,length)求该key-value对的存储位置,计算方法是先用hash&0x7FFFFFFF后,再对length取模,这就保证每一个key-value对都能存入HashMap中,当计算出的位置相同时,由于存入位置是一个链表,则把这个key-value对插入链表头。

  HashMap中key和value都允许为null。key为null的键值对永远都放在以table[0]为头结点的链表中。

HashMap和HashTable的区别,优缺点:

1、Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。

2、Hashtable 线程安全,因为它每个方法中都加入了Synchronize。HashMap线程不安全的。

3、 HashMap把Hashtable的contains方法去掉了,Hashtable则保留了contains

4、Hashtable中,key和value都不允许出现null值。HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。

5、Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式。

6、哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。

7、 HashTable在不指定容量的情况下的默认容量为11,而HashMap为16,Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂。Hashtable扩容时,将容量变为原来的2倍加1,而HashMap扩容时,将容量变为原来的2倍

下面直接来干货,先说这三个Map的区别:

HashTable

    • 底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化
    • 初始size为11,扩容:newsize = olesize*2+1
    • 计算index的方法:index = (hash & 0x7FFFFFFF) % tab.length

HashMap

    • 底层数组+链表实现,可以存储null键和null值,线程不安全
    • 初始size为16,扩容:newsize = oldsize*2,size一定为2的n次幂
    • 扩容针对整个Map,每次扩容时,原来数组中的元素依次重新计算存放位置,并重新插入
    • 插入元素后才判断该不该扩容,有可能无效扩容(插入后如果扩容,如果没有再次插入,就会产生无效扩容)
    • 当Map中元素总数超过Entry数组的75%,触发扩容操作,为了减少链表长度,元素分配更均匀
    • 计算index方法:index
  • 8
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值