Java面试题

文章目录

面试技巧

1. 自我介绍

  • 基本信息(姓名,年龄,学历,学校,专业)
  • 工作经验(工作年限,项目经验)
  • 技术栈(结合做过的项目)
  • 其他(特长,爱好)

2. 面试技巧

  • 不能一问一答,主动找话题,将话题引向自己擅长的领域,技术。
  • 如果答不上来问题,组织一下语言,重新说,实在想不起来就说自己忘了,不能支支吾吾。
  • 听完问题再回答,如果没有听清楚,适当反问题目意思。
  • 声音洪亮,自信。
  • 回答问题:what是什么,how怎么用,why原理。

3. 注意事项

  • 刷题,写简历,投简历,面试。
  • 面试前,查询好去公司的路线,安排好时间。
  • 认真阅读公司招聘需求,恶补需求技术点,不会的技术也要去了解。

1.JavaSE

1.1 集合(Collection,Set,List,Map)

1.1.1 HashMap和HashTable的区别

  • 共同点:
    1. HashMap和HashTable都实现了Map接口,并且都是key-value的数据结构。
  • 不同点
    1. HashMap是java1.2引进的Map接口的实现类,而HashTable是java1.1的继承自Dictionary的一个类
    2. HashMap是线程不安全的,HashTable是线程安全的(也称作线程同步)
    3. HashMap允许将null值作为key或value,而HashTable不允许,如果存储null的话会报空指针异常
  • 使用ConcurrentMap兼顾线程安全和效率

1.1.2 HashMap的put()和get()方法是怎么实现的

  • HashMap的put()方法实现:
    2. 通过传递key-value数据时调用put方法的时候,HashMap使用key的hashcode()方法(使用了hashcode()方法此方法增加了高位运算防止hash冲突用来重新计算hash值)和哈希算法来找出存储key-value对的索引,如果索引处为空,则直接将数据插入到对应的数组中,否则判断是否是红黑树。若是,则以红黑树插入,否则遍历链表。若长度不小于8,则将链表转换为红黑树,转换成功后再插入。新加入的数据放到链表头,最先加入的数据放到链表尾。
  • HashMap的get()方法的实现:
    1. 根据keyhashcode算出元素在数组中的下标,之后遍历Entry对象链表,直到找到元素为止。
    2. 如果使用对象作为key,需要重写key的hashcode()和equals()方法
    3. 如果出现了大量hash冲突,那么遍历链表的时候,会比较慢。JDK 1.8里面,当链表的长度大于阀值(默认为8)的时候,会使用红黑树来存储数据,以便加快key的查询速度。

1.1.3 HashMap与HashSet的区别

HashMap不允许重复的键,HashSet不允许存储重复的值(对象)

  1. HashSet底层调用的是HashMap
  2. HashMap实现Map接口,HashSet实现Set接口
  3. HashMap存储key-value格式的数据,HashSet只能存储对象
  4. HashMap使用put()方法将元素存入map,HashSet使用add()方法将数据存入set
  5. HashMap中使用key来计算hashcode值,HashSet使用成员对象来计算hashcode值,使用equals()方法判断对象的相等性,如果两个对象不同返回false
  6. HashMap速度快因为其使用的是唯一的key来获取对象,HashSet较慢

1.1.4 HashMap的数据结构,线程是否安全,为什么?

  • HashMap数据结构

    1. JDK1.8以前是数组+链表
    2. JDK1.8以后是数组+链表+红黑树
  • 线程不安全,可能造成死循环,具体表现链表的循环指向,应该使用ConcurrentHashMap,它是线程安全的。

1.1.5 HashMap的实现原理

  1. HashMap的主干是一个Entry数组,Entry数组时HashMap的基本组成单元。每一个Entry包含一个key-value键值对。
  2. HashMap由数组+链表+红黑树组成,数组是HashMap的主体,链表是为了解决hash冲突而存在的。
  3. 如果定位到的数组位置不含链表(当前entry的next指向null)那么对于查找,添加操作很快,仅需一次寻址即可;
  4. 如果定位的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals()方法注意比对查找。所以,出于对性能的考虑,HashMap中的链表出现的越少,性能越好。

1.1.6 JDK1.8的HashMap有哪些优化

  1. JDK1.8之前的HashMap的数据结构是数组+链表,JDK1.8之后HashMap的数据结构是数组+链表+红黑树
  2. 当一个链表太长的时候(链表长度大于8时),HashMap会动态的将它替换成一个红黑树,这话的话会将时间复杂度从O(n)降为O(logn)。
  3. 利用红黑树快速增删改查的特点提高了HashMap的性能。

1.1.7 ArrayList和LinkedList有什么区别

  1. ArrayList的底层是数组,查询速度快,而LinkedList底层是一个双向链表,增删速度快
  2. ArrayList允许重复的元素存储,而LinkedList不允许存储重复的元素。

1.1.8 ArrayList去重

  1. 利用HashSet去重(不保证去重后顺序一定)
  2. 利用LinkedList去重(去重后顺序一定)

1.1.9 Set集合去重后会存在哪些问题?

  1. 经过Set去重后,元素列表原始顺序被打乱,需要经过排序后才能与原来的元素列表比对。
  2. LinkedHashSet是有序的HashSet(按照存入集合的顺序打印)

1.1.10 HashMap和HashTable与ConcurrentMap的区别

  1. HashMap是线程不安全的,HashTable,ConcurrentMap是线程安全的
  2. HashMap的键和值都允许有null值都存在,而HashTable不允许
  3. HashMap的效率相对HashTable和ConcurrentMap较高
  4. HashMap根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历的顺序是不确定的
  5. HashMap最多只允许存储一条键为null的记录,多条值为null
  6. HashMap是非线程安全&
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值