面试3——java集合类面试题总结
1.总结一下啊hashmap和hashtable的知识点?
1)关于hashmap的说法
- HashMap实际上是一个“链表散列”的数据结构,在jdk1.8中添加了红黑树。HashMap底层结构是一个数组,数组中的每一项为一条链表,若链表长度超过8,使用红黑树
- HashMap的实例有两个参数影响其性能:初始容量和装载因子。HashMap的初始容量为16,装载因子为0.75
- HashMap是不同步的,因此是非线程安全的
- HashMap的key-value都是存储在Entry中的
static class Node<K,V> implements Map.Entry<K,V> {
final int hash;
final K key;
V value;
Node<K,V> next; - HashMap可以存null键和null值,不能保证元素的顺序,通过hashcode()方法和equals方法保证键的唯一性
- 解决hash冲突的方法。HashMap解决hash冲突的方法为链地址法。
2)HashMap和HashTable的区别
- 继承不同
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable - HashTable的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。在多线程并发的环境中,可以直接使用HashTable,但是要使用HashMap的话就要自己额外增加同步处理
Map m = Collections.synchronizedMap(new HashMap(...));
- HashTable中,key和value都不允许出现null,在HashMap中,null可以作为键,这样的键只有一个,可以有一个或者多个键所对应的值为null。当get方法返回null时,既可以表示HashMap中没有该键,也可以表示该键所对应的值为null。因此HashMap中不能由get方法来判断HashMap中是否存在某个键,而应该用containsKey方法来判断
- 哈希值的使用不同,HashTable直接使用对象的hashcode,而HashMap重新计算hash值
- HashTable和HashMap内部实现方式的数组初始大小和扩容方式不同。HashTable中hash数组的默认大小为11,增加方式为old*2+1。HashMap中hash数组的默认大小为16,而且一定是2的倍数。
2. List、Set和Map的区别
List:
- 可以允许重复的对象
- 可以插入多个null值
- 是一个有序容器,即插入的顺序和读取的顺序是一致的
- 常用的实现类有:Arraylist、Linkedlist和Vector。Arraylist最为流行,它提供了索引的随意访问,若经常添加或删除元素的话,Linkedlist性能比Arraylist好。
Set:
- 不允许有重复的对象
- 无序容器,无法保证每个元素的存储顺序,TreeSet通过实现Comparable中的CompareTo方法对其进行排序(此方法需要重写)
- 只允许一个null值
Map:
- Map不是collection的子接口或实现类,Map是一个接口
- Map的每个Entry都有两个对象,一个键一个值,在map中,键是唯一的,值可以持有相同的值
- Map中可以随意持有多个null值,但是最多只能有一个null键
3.什么情况下使用list、set和map
如果你经常会使用索引来对容器中的元素进行访问,那么 List 是你的正确的选择。如果你已经知道索引了的话,那么 List 的实现类比如 ArrayList 可以提供更快速的访问,如果经常添加删除元素的,那么肯定要选择LinkedList
如果你想容器中的元素能够按照它们插入的次序进行有序存储,那么还是 List,因为 List 是一个有序容器,它按照插入顺序进行存储。
如果你想保证插入元素的唯一性,也就是你不想有重复值的出现,那么可以选择一个 Set 的实现类,比如 HashSet、LinkedHashSet 或者 TreeSet。所有 Set 的实现类都遵循了统一约束比如唯一性,而且还提供了额外的特性比如 TreeSet 还是一个 SortedSet,所有存储于 TreeSet 中的元素可以使用 Java 里的 Comparator 或者 Comparable 进行排序。LinkedHashSet 也按照元素的插入顺序对它们进行存储。
如果你以键和值的形式进行数据存储那么 Map 是你正确的选择。你可以根据你的后续需要从 Hashtable、HashMap、TreeMap 中进行选择。
4.Arraylist和Linkedlist的区别
- ArrayList是实现了基于动态数组的数据结构,而LinkedList是基于双向链表的数据结构
- 对于随机访问,ArrayList要优于LinkedList,因为LinkedList要移动指针
- 对于插入和删除,LinkedList较占优势,ArrayList要移动数据。
- ArrayList和LinkedList都是非线程安全的容器
5.Vector和ArrayList的区别
6.HashMap和ConcurrentHashMap的区别
http://www.importnew.com/28263.html
7.HashMap的工作实现原理以及代码实现,什么时候用到红黑树
https://www.cnblogs.com/znn93/p/9363894.html
红黑树使用
8.多线程情况下,Hashmap死循环问题
多线程下[Hashmap]的问题
1)多线程put操作后,get操作导致死循环
2)多线程put非null元素后,get操作得到null值
3) 多线程put操作,导致元素丢失
为何会出现死循环
我们知道HashMap采用的是链地址法来解决Hash冲突。因为是链表结构,那么就很容易形成闭合的链路,这样循环的时候只要有线程对这个Hashmap进行get操作,就会产生死循环。在单线程中,只有一个线程对hashmap的数据结构进行操作,是不可能产生闭合回路的。只有在多线程并发的情况下才会发生,在进行put操作的时候,如果size>initialcapacity * loadfactor ,那么这个时候hashmap就会进行rehash操作,随之hashmap的结构就会发生翻天覆地的变化。很有可能两个线程在这个时候同时触发rehash操作,产生闭合的回路。
Hashmap 的 resize 在多线程的情况下可能产生条件竞争。因为如果两个线程都发现 hashmap 需要进行 resize 了,他们会同时试着调整大小。在调整大小的过程中,存储在链表 中的元素的次序会反过来。因为移动到新的位置时,hashmap 并不会将元素放在链表的尾部, 而是放在头部在,这是为了避免尾部遍历。(否则,针对 key 的 hashcode 相同的 entry 每次 添加还要定位到尾节点)。如果条件竞争发生了,可能出现环形列表。之后,当我们调用 get(key)操作时就可能发生死循环。
9.HashMap出现Hash dos攻击问题
Hashmap通过链地址法来解决hash冲突。
10.ConcurrentHashMap的工作原理及代码实现,如何统计所有的元素个数
工作原理链接:https://my.oschina.net/u/3777556/blog/1795495
https://www.cnblogs.com/study-everyday/p/6430462.html
11.Collection和Collections的区别
Collection是集合的上级接口,继承此接口的有set和list
Collections是针对集合类的一个工具类,提供一系列的静态方法实现对各种集合的搜索、排序、线程安全化等操作。
面试3——java集合类面试题总结的更多相关文章
- 一招破解 Java 集合类面试题
今日招式:Java集合类面试题 Java集合类绝对是我们的老朋友了,Java技术江湖里,谁人不知,谁人不晓,它的使用率非常高,使用难度却也不大,这也导致了很多人对它不屑一顾,殊不知其中却暗藏玄机,今天 ...
- 一份最贴近真实面试的Java基础面试题
这是一份Java基础知识的面试题.在网上的关于Java的面试题数不胜数,但认真看过感觉大多数都没有实用性,有很多是面试官根本就不会问到的,那些已经脱离了实际开发的技术问题.而这份资料来源自一份个人觉得 ...
- 大公司最喜欢问的Java集合类面试题
看了一些所谓大公司的JAVA面试问题,发现对于JAVA集合类的使用都比较看重似的,而自己在这方面还真的是所真甚少,抽空也学习学习吧. java.util包中包含了一系列重要的集合类,而对于集合类,主要 ...
- 面试3——java集合类总结(List)
1.集合类 数组:可以存储对象,也可以存储基本数据类型,但是一次只能存储一种类型,且长度一定,不可改变. 集合:只能存储对象,长度可变,可以存储不同类型的对象.Java集合类主要有三种:set,lis ...
- BAT面试必备——Java 集合类
本文首发于我的个人博客:尾尾部落 1. Iterator接口 Iterator接口,这是一个用于遍历集合中元素的接口,主要包含hashNext(),next(),remove()三种方法.它的一个子接 ...
- Java集合类笔试题
介绍Collection框架的结构 Collection接口是单值存放的最大父接口,可以向其中保存多个单值的数据(所谓单值就是指集合中的每个元素都是一个对象).其子接口主要有:List.Set.Que ...
- 面试3——java集合类总结(Map)
1.概述: Java 中的map集合使用键值对(key-value)来保持数据,其中值(value)可以重复,键(key)必须唯一,但最多只能有一个key为空,它的主要实现类有HashMap.Hash ...
- Java集合类面试题
java.util包中包含了一系列重要的集合类,而对于集合类,主要需要掌握的就是它的内部结构,以及遍历集合的迭代模式. 1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最 ...
- 大公司喜欢问的Java集合类面试题
Collection Collection是基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).一些Collection允许相同的元素而另一 ...
随机推荐
- Java集合之TreeMap源码分析
一.概述 TreeMap是基于红黑树实现的.由于TreeMap实现了java.util.sortMap接口,集合中的映射关系是具有一定顺序的,该映射根据其键的自然顺序进行排序或者根据创建映射时提供的C ...
- web应用
实现HttpServlet的Web应用 <dependency> <groupId>javax.servlet</groupId> <artifactId&g ...
- (网页)人人都会的35个Jquery小技巧
转自CSDN: 收集的35个 jQuery 小技巧/代码片段,可以帮你快速开发. 1. 禁止右键点击 $(document).ready(function(){ $(document).bind(&q ...
- HTTP的Referrer和Referrer Policy设置
Referrer referrer是HTTP请求header的报文头,用于指明当前流量的来源参考页面.通过这个信息,我们可以知道访客是怎么来到当前页面的.这对于Web Analytics非常重要,可以 ...
- 大表分批删除脚本之MySQL版
经常需要定期对某些表删除历史数据,通常这样的表的数据又是非常巨大,为了减轻对线上环境的影响,删除时必须分成小批量来进行. 以前分享过SQLServer的版本. 下面是MySQL版本: delimite ...
- Asp.net MVC通过自定义特性实现Action日志记录
一.自定义特性 /// <summary> /// 描述特性 /// </summary> [AttributeUsage(AttributeTargets.Method)] ...
- SQL mysql优化
慢查询 如何通过慢查日志发现有问题的SQL? 查询次数多且每次查询占用时间长的SQL pt-query-digest分析前几个查询 IO大的SQL pt-query-diges分析中的Rows exa ...
- account
Account Doc V3_ADD 1. 用户头像 用户头像今后会放在阿里云上,所以: dev: http(s)://pyserver.oss-cn-hangzhou.aliyuncs.com/DE ...
- 对数组的操作splice() 和slice() 用法和区别
JavaScript splice() 方法 定义和用法 splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目. 注释:该方法会改变原始数组. 语法 arrayObject.spli ...
- CF 633 E. Binary Table
题目链接 题目大意:给定一个棋盘,棋盘上有0或1,你可以将一整行取反或者一整列取反,要使得最后剩的1最少.\((1\le n\le 20,1\le m\le 100000)\). 一个容易想到的思路就 ...