文章目录
- 面试技巧
- 1.JavaSE
-
- 1.1 集合(Collection,Set,List,Map)
-
- 1.1.1 HashMap和HashTable的区别
- 1.1.2 HashMap的put()和get()方法是怎么实现的
- 1.1.3 HashMap与HashSet的区别
- 1.1.4 HashMap的数据结构,线程是否安全,为什么?
- 1.1.5 HashMap的实现原理
- 1.1.6 JDK1.8的HashMap有哪些优化
- 1.1.7 ArrayList和LinkedList有什么区别
- 1.1.8 ArrayList去重
- 1.1.9 Set集合去重后会存在哪些问题?
- 1.1.10 HashMap和HashTable与ConcurrentMap的区别
- 1.1.11 String,StringBuilder,StringBuffer的区别
- 1.1.12 JAVA集合框架中的常用集合及其特点、适用场景、实现原理简介
- 1.1.13 Java8的新特性
- 1.1.14 解决hash碰撞
- 1.1.15 TreeMap和TreeSet在排序时如何比较元素,Collections工具类中的sort()方法如何比较元素?
- 1.2 线程
- 1.3 基础
- 2. Spring框架
- 3. HTTP/网络
- 4. 数据库
- 5. MyBatis
面试技巧
1. 自我介绍
- 基本信息(姓名,年龄,学历,学校,专业)
- 工作经验(工作年限,项目经验)
- 技术栈(结合做过的项目)
- 其他(特长,爱好)
2. 面试技巧
- 不能一问一答,主动找话题,将话题引向自己擅长的领域,技术。
- 如果答不上来问题,组织一下语言,重新说,实在想不起来就说自己忘了,不能支支吾吾。
- 听完问题再回答,如果没有听清楚,适当反问题目意思。
- 声音洪亮,自信。
- 回答问题:what是什么,how怎么用,why原理。
3. 注意事项
- 刷题,写简历,投简历,面试。
- 面试前,查询好去公司的路线,安排好时间。
- 认真阅读公司招聘需求,恶补需求技术点,不会的技术也要去了解。
1.JavaSE
1.1 集合(Collection,Set,List,Map)
1.1.1 HashMap和HashTable的区别
- 共同点:
- HashMap和HashTable都实现了Map接口,并且都是key-value的数据结构。
- 不同点
- HashMap是java1.2引进的Map接口的实现类,而HashTable是java1.1的继承自Dictionary的一个类
- HashMap是线程不安全的,HashTable是线程安全的(也称作线程同步)
- 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()方法的实现:
- 根据
key
的hashcode
算出元素在数组中的下标,之后遍历Entry
对象链表,直到找到元素为止。 - 如果使用对象作为key,需要重写key的hashcode()和equals()方法
- 如果出现了大量
hash冲突
,那么遍历链表的时候,会比较慢。JDK 1.8
里面,当链表的长度大于阀值(默认为8)的时候,会使用红黑树来存储数据,以便加快key
的查询速度。
- 根据
1.1.3 HashMap与HashSet的区别
HashMap不允许重复的键,HashSet不允许存储重复的值(对象)
- HashSet底层调用的是HashMap
- HashMap实现Map接口,HashSet实现Set接口
- HashMap存储key-value格式的数据,HashSet只能存储对象
- HashMap使用put()方法将元素存入map,HashSet使用add()方法将数据存入set
- HashMap中使用key来计算hashcode值,HashSet使用成员对象来计算hashcode值,使用equals()方法判断对象的相等性,如果两个对象不同返回false
- HashMap速度快因为其使用的是唯一的key来获取对象,HashSet较慢
1.1.4 HashMap的数据结构,线程是否安全,为什么?
-
HashMap数据结构
- JDK1.8以前是数组+链表
- JDK1.8以后是数组+链表+红黑树
-
线程不安全,可能造成死循环,具体表现链表的循环指向,应该使用ConcurrentHashMap,它是线程安全的。
1.1.5 HashMap的实现原理
- HashMap的主干是一个Entry数组,Entry数组时HashMap的基本组成单元。每一个Entry包含一个key-value键值对。
- HashMap由数组+链表+红黑树组成,数组是HashMap的主体,链表是为了解决hash冲突而存在的。
- 如果定位到的数组位置不含链表(当前entry的next指向null)那么对于查找,添加操作很快,仅需一次寻址即可;
- 如果定位的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals()方法注意比对查找。所以,出于对性能的考虑,HashMap中的链表出现的越少,性能越好。
1.1.6 JDK1.8的HashMap有哪些优化
- JDK1.8之前的HashMap的数据结构是数组+链表,JDK1.8之后HashMap的数据结构是数组+链表+红黑树
- 当一个链表太长的时候(链表长度大于8时),HashMap会动态的将它替换成一个红黑树,这话的话会将时间复杂度从O(n)降为O(logn)。
- 利用红黑树快速增删改查的特点提高了HashMap的性能。
1.1.7 ArrayList和LinkedList有什么区别
- ArrayList的底层是数组,查询速度快,而LinkedList底层是一个双向链表,增删速度快
- ArrayList允许重复的元素存储,而LinkedList不允许存储重复的元素。
1.1.8 ArrayList去重
- 利用HashSet去重(不保证去重后顺序一定)
- 利用LinkedList去重(去重后顺序一定)
1.1.9 Set集合去重后会存在哪些问题?
- 经过Set去重后,元素列表原始顺序被打乱,需要经过排序后才能与原来的元素列表比对。
- LinkedHashSet是有序的HashSet(按照存入集合的顺序打印)
1.1.10 HashMap和HashTable与ConcurrentMap的区别
- HashMap是线程不安全的,HashTable,ConcurrentMap是线程安全的
- HashMap的键和值都允许有null值都存在,而HashTable不允许
- HashMap的效率相对HashTable和ConcurrentMap较高
- HashMap根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历的顺序是不确定的
- HashMap最多只允许存储一条键为null的记录,多条值为null
- HashMap是非线程安全&