五.JAVA基础面试题:集合
1.List,Set,Queue和Map的区别
2.为什么要使用集合
3.ArrayList和Vector的区别
4.ArrayList和linkedlist的区别
5.ArrayList的扩容机制
6.comparable和comparator的区别
7.如何理解无序性和不可重复性
8.Hashset,Linkedhashset和Treeset异同
1.Hashmap和HashTable的区别
2.Hashmap和HashSet的区别
3.Hashmap和treemap的区别
4.hashset如何检查重复
5.hashmap的底层实现
6.hashmap为什么要扩容为2的n次幂
7.concurrenthashmap和hashtable的区别
8.concurrenthahsmap的1.7和1.8的区别
五.JAVA基础面试题:集合
1.List,Set,Queue和Map的区别
- List有序可重复
- Set无序不可重复
- Queue有序可重复(保存插入顺序)
- Map键值对(key无序不可重复,value无许可重复)
- List存储
ArrayList object数组
LinkedList 双向链表
Vector object数组 - Set存储
HashSet HashMap
LinkedHashSet LinkedHashMap
TreeSet 红黑树 - Map存储
HashMap 数组+链表(数组+链表+红黑树)
LinkedHashMap 数组+链表或红黑树(多了一层双向链表)
HashTable 数组+链表。
TreeMap 红黑树
2.为什么要使用集合/h1>
- 数组:只能保存一组相同类型的数据
- 集合:可以保存不同类型的数据,可以保存keyvalue并且定制需求
- 如
键值对 Map,排序使用TreeMap,不用排序HashMap,线程安全用ConcurrentHashMap
值 元素唯一且无序用Set,元素可重复且有序用List
3.ArrayList和Vector的区别
- 底层都用object数组
- ArrayList线程不安全,Vector线程安全
4.ArrayList和linkedlist的区别
- 都是线程不安全
- 存储 ArrayList用object数组,linkedlist用双向链表
- 插入删除 前者在移动元素,后者在寻找位置
- 快速访问 前者支持后者不支持
- 空间 前者主要在预留空间,后者主要保存单个元素较大
5.ArrayList的扩容机制
- jdk7 新new 长度+10,再扩1.5倍,复制返回
- jdk8 新new 长度0,第一次add 长度+10,再扩1.5倍,复制返回
6.comparable和comparator的区别
- conparable 是类实现接口后重写compareTo方法
- comparator是使用collections.sort()第二个参数传入比较器
7.如何理解无序性和不可重复性
- 无序性:不是随机存储,而是利用hashcode来寻找哈希表中的具体位置
- 不可重复性:是利用equals和hashcode来确定数据的唯一性
8.Hashset,Linkedhashset和Treeset异同
- 三者都是线程不安全,都保证数据唯一
- 三者底层存储不同
hashset 哈希表,不需要保证数据插入和取出的顺序
linkedhashset 哈希表+链表,可以获得数据插入和取出的顺序,满足先进先出原则
treeset 红黑树,可以定制排序
1.Hashmap和HashTable的区别
- 线程安全:前者不安全,后者安全
- 效率:前者更高
- 对nullkey的nullvalue的支持:前者支持一个nullkey,多个nullvalue,后者不支持nullkey和nullvalue
- 底层数据结构
hashmap 数组+链表+红黑树
hashtable 数组+链表 - 扩容大小
hashmap 16 扩容2n,自定义会扩容为2的n次幂
hashtable 11 扩容2n+1,自定义则直接使用自定义
2.Hashmap和HashSet的区别
- 键值对的区别
- 一个是put,一个是add
- 前者键计算hashcode,后者使用成员对象计算hashcode,用equals判断对象相等
3.Hashmap和treemap的区别
- treemap多了元素键值排序和元素查询的能力
4.hashset如何检查重复
- 先利用hashcode
- 再利用equals
5.hashmap的底层实现
- 1.8
数组+链表 - 1.8之后
数组+链表+红黑树
链表长度大于8:如果数组长度小于64,扩容数组,如果数组长度大于64,则将链表转化为红黑树
6.hashmap为什么要扩容为2的n次幂
- 只有当length为2的n次幂的时候
hash%length==hash&(length-1)
即&效率比%高
7.concurrenthashmap和hashtable的区别
- 底层数据结构
concurrenthashmap:1.7采用分段的数组和链表,1.8采用node数组和链表和红黑树
hashtable:数组和链表 - 实现线程安全的方式
concurrenthashmap:1.7采用每一把锁锁一段数组,1.8采用node+CAS+synchronized
hashtable:使用synchronized线程安全,一个线程put,另一个线程无法put也无法get
8.concurrenthahsmap的1.7和1.8的区别
- 线程安全实现
1.7 segment分段锁
1.8 node+cas+synchronized(只锁定链表或红黑树首节点) - 数据结构
1.7 segment数组+链表
1.8 node数组+链表+红黑树 - 并发度
1.7 默认为segment数组(16默认)
1.8 node数组的大小