JAVA面试常见问题之常见集合篇
1、List 和 Set 区别
- List
- 可以允许重复的对象。
- 可以插入多个null元素。
- 有序容器
- Set
- 不允许重复的对象。
- 只能插入1个null元素
- 无序容器,可以使用TreeSet实现有序
2、Set和hashCode以及equals方法的联系
set集合中存放的数据有一个特点,那就是无序且不重复。无序是因为set集合中的元素没有下坐标。不重复的原因就是因为set集合中有hashcode与equals这两个方法。
3、List 和 Map 区别
- 结构:List为单列结构,Map为双列结构
- 重复性:List为可以重复,Map为双列集合(key-value),key不可以重复
- 有序性:List为有序集合,Map的key是无序的
4、Arraylist 与 LinkedList 区别
- 数据结构:ArrayList基于动态数组的数据结构。LinkedList基于链表的数据结构。
- 操作性:ArrayList查询快,增删慢,LinkedList查询慢,增删快。
5、ArrayList 与 Vector 区别
- 同步性:Vector线程安全,用synchronized实现线程安全。ArrayList线程不安全。
- 数据容量增长:二者都有一个初始容量大小,采用线性连续存储空间,当存储的元素的个数超过了容量时,就需要增加二者的存储空间,Vector增长原来的一倍,ArrayList增加原来的0.5倍。
6、HashMap 和 Hashtable 的区别
- 继承不同父类:Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。
- 线程安全:Hashtable线程安全,HashMap线程不安全。
- 是否提供contains方法: HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey。Hashtable则保留了contains,containsValue和containsKey三个方法,其中contains和containsValue功能相同。
- key和value的是否可以为null值:Hashtable中,key和value都不允许出现null值。HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。
7、HashSet 和 HashMap 区别
*HashMap* | *HashSet* |
HashMap实现了Map接口 | HashSet实现了Set接口 |
HashMap储存键值对 | HashSet仅仅存储对象 |
使用put()方法将元素放入map中 | 使用add()方法将元素放入set中 |
HashMap中使用键对象来计算hashcode值 | HashSet使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性,如果两个对象不同的话,那么返回false |
HashMap比较快,因为是使用唯一的键来获取对象 | HashSet较HashMap来说比较慢 |
8、HashMap 和 ConcurrentHashMap 的区别
- 线程安全性:HashMap线程不安全,ConcurrentHashMap线程安全
- ConcurrentHashMap特性:性能与安全性兼得。加入分段锁的概念,相当于一个大集合,根据hashcode值分成多个hashtable,根据key.hashCode()来决定把key放到哪个HashTable中。
9、HashMap 的工作原理及代码实现,什么时候用到红黑树
- 工作原理:通过hash的方法,通过put和get存储和获取对象。存储对象时,我们将K/V传给put方法时,它调用hashCode计算hash从而得到bucket位置,进一步存储,HashMap会根据当前bucket的占用情况(当键值对的数量大于容量(capacity)*负载因子(load factor 默认值0.75)时)自动调整容量(超过Load Facotr则resize为原来的2倍)。获 取对象时,我们将K传给get,它调用hashCode计算hash从而得到bucket位置,并进一步调用equals()方法确定键值对。如果发生碰撞的时候,Hashmap通过链表将产生碰撞冲突的元素组织起来,在Java 8中,如果一个bucket中碰撞冲突的元素超过某个限制(默认是8),则使用红黑树来替换链表,从而提高速度。
- 代码实现:参考 http://www.cnblogs.com/mzc-blogs/p/5800084.html, 也可以直接查看源码
- 什么时候用到红黑树:当链表(bucket)的数量大于8时,后面的使用红黑树。使用红黑树增加检索的速度。
10、多线程情况下HashMap死循环的问题
- 原因:HashMap是采用链表解决Hash冲突,因为是链表结构,那么就很容易形成闭合的链路(原因:多线程操作时,可能会有两个或以上的线程同时触发rehash--重新计算hash值--操作,容易造成闭合的链路),这样在循环的时候只要有线程对这个HashMap进行get操作就会产生死循环。
- 解决思路:用ConcurrentMap代替HashMap
11、HashMap出现Hash DOS攻击的问题
- 原因:
12、ConcurrentHashMap 的工作原理及代码实现,如何统计所有的元素个数
- ConcurrentHashMap工作原理:容器中有多把锁,每一把锁锁一段数据,这样在多线程访问时不同段的数据时,就不会存在锁竞争了,这样便可以有效地提高并发效率。这就是ConcurrentHashMap所采用的"分段锁"思想。
- 代码实现:参考https://www.cnblogs.com/chengxiao/p/6842045.html 或查看源码
- 如何统计所有的元素个数:size()
13、手写简单的HashMap
参考: https://blog.csdn.net/lishaoran369/article/details/61920036
JAVA面试常见问题之常见集合篇的更多相关文章
- JAVA面试常见问题之锁机制篇
1.说说线程安全问题,什么是线程安全,如何保证线程安全 线程安全:就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用.不 ...
- Java 面试知识点解析(六)——数据库篇
前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...
- Java 面试知识点解析(七)——Web篇
前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...
- Java 面试知识点解析(三)——JVM篇
前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...
- Java面试必刷常见真题200+ ,让你“过五关,斩六将”,轻松入大厂
这份面试清单是我从 2015 年做 TeamLeader 之后开始收集的,一方面是给公司招聘用,另一方面是想用它来挖掘我在 Java 技术栈中的技术盲点,然后修复和完善它,以此来提高自己的技术水平.虽 ...
- JAVA面试常见问题之基础篇
一. 面向对象的特征:继承.封装.(抽象).多态 继承:继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性. 封装:封装是保证软件部件具有优良的模块性的基础 ...
- JAVA面试常见问题之设计模式篇
1.常见的设计模式 单例模式.工厂模式.建造模式.观察者模式.适配器模式.代理模式.装饰模式. 参考:https://www.cnblogs.com/cr330326/p/5627658.html 2 ...
- JAVA面试常见问题之进程和线程篇
1.线程和进程的概念.并行和并发的概念 进程:计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本 ...
- JAVA面试常见问题之Redis篇
Redis为单线程 1.Redis 有哪些数据类型 String 哈希 list set 有序set 2.Redis 内部结构 参考:https://www.cnblogs.com/chenpingz ...
随机推荐
- 用星星画菱形--Java
用星星画菱形 public class Hello{ public static void main(String[] args) { char star = '\u2605'; System.out ...
- 锐速与BBR的原理简单解析
锐速与BBR的原理简单解析 4 前言 昨天,有一位朋友在我的文章下留言说,锐速和BBR不都是一样,是拥塞算法嘛.因为这方面需要讲的东西比较多,所以我还是专门水一篇文章吧. 锐速 参考资料: http ...
- node中没有全局作用域,只有模块作用域(文件作用域)
node中没有全局作用域,只有模块作用域(文件作用域)
- HZOI20190816模拟23 mine/water/gcd
A:mine 只是一个简单的dp....是博主太蒻了... 设f[i][j],表示到第i位,状态是j的方案数,其中$j\in[0,5]$ j==0表示填0,j==1表示填1,且i-1位是雷; j==2 ...
- 自己编写jquery插件
http://blog.csdn.net/chenxi1025/article/details/52222327 https://www.cnblogs.com/ajianbeyourself/p/5 ...
- Git婴幼儿使用手册【十分钟让你帅气的使用命令行和团队工作】
Git由来:...... Git使用的好处:...... 如何使用Git:(以上会显得我们以下的是很纯纯的干货) 代码库有两个部分: 本地代码库:远程代码库: 本地代码库使用方法: 一.先创建一个文件 ...
- Template-Thymeleaf:Thymeleaf
ylbtech-Template-Thymeleaf:Thymeleaf 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 0. https://www.thyme ...
- Netty SimpleChannelInboundHandler和ChannelInboundHandler区别
一般用netty来发送和接收数据都会继承SimpleChannelInboundHandler和ChannelInboundHandlerAdapter这两个抽象类,那么这两个到底有什么区别呢? 在客 ...
- 恭喜"微微软"喜当爹,Github嫁入豪门。
今天是 Github 嫁入豪门的第 2 天,炒得沸沸扬扬的微软 Github 收购事件于昨天(06月04日)尘埃落定,微软最终以 75 亿美元正式收购 Github. 随后,Gitlab 趁势带了一波 ...
- css 渐变背景
background: linear-gradient(left,#fa7f6d, #fc5e7f); left: 从左边开始