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面试常见问题之常见集合篇的更多相关文章

  1. JAVA面试常见问题之锁机制篇

    1.说说线程安全问题,什么是线程安全,如何保证线程安全 线程安全:就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用.不 ...

  2. Java 面试知识点解析(六)——数据库篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  3. Java 面试知识点解析(七)——Web篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  4. Java 面试知识点解析(三)——JVM篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  5. Java面试必刷常见真题200+ ,让你“过五关,斩六将”,轻松入大厂

    这份面试清单是我从 2015 年做 TeamLeader 之后开始收集的,一方面是给公司招聘用,另一方面是想用它来挖掘我在 Java 技术栈中的技术盲点,然后修复和完善它,以此来提高自己的技术水平.虽 ...

  6. JAVA面试常见问题之基础篇

    一.  面向对象的特征:继承.封装.(抽象).多态 继承:继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性. 封装:封装是保证软件部件具有优良的模块性的基础 ...

  7. JAVA面试常见问题之设计模式篇

    1.常见的设计模式 单例模式.工厂模式.建造模式.观察者模式.适配器模式.代理模式.装饰模式. 参考:https://www.cnblogs.com/cr330326/p/5627658.html 2 ...

  8. JAVA面试常见问题之进程和线程篇

    1.线程和进程的概念.并行和并发的概念 进程:计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本 ...

  9. JAVA面试常见问题之Redis篇

    Redis为单线程 1.Redis 有哪些数据类型 String 哈希 list set 有序set 2.Redis 内部结构 参考:https://www.cnblogs.com/chenpingz ...

随机推荐

  1. MapReduce模型简介

  2. UBOOT命令简写说明

    所以命令都可以简写,只要命令前面的一部分不会跟其它命令相同,就可以不用写全整个命令. save 命令 CRANE2410 # sa Saving Environment to Flash... Un- ...

  3. Expression表达式 实现and、or搜索

    用法: [HttpPost] public ActionResult GetBannerList(int pageIndex, int pageSize, string search) { Resul ...

  4. 人脸识别的LOSS(上)

    超多分类的Softmax 2014年CVPR两篇超多分类的人脸识别论文:DeepFace和DeepID Taigman Y, Yang M, Ranzato M A, et al. Deepface: ...

  5. [转]Entity Framework 的实体关系

    通过 Entiy Framework实践系列 文章,理了理 Entity Framework 的实体关系. 为什么要写文章来理清这些关系?“血”的教训啊,刚开始使用 Entity Framework  ...

  6. 下面分享一下RHEL/CentOS7 安装图形化桌面详细图解

    Linux是一个多任务的多用户的操作系统,好多linux爱好者在安装完linux后经常遇到一个问题——没有图形化桌面(http://www.xcmnyy.com)今天小编在安装RHEL7的时候,一步留 ...

  7. 创建vue项目及引入插件

    部署开发环境 安装淘宝镜像 npm install -g cnpm --registry=https://registry.npm.taobao.org 安装webpack cnpm install ...

  8. js 移动端点击复制字符串

    function copyStr(val) { //val 是要复制的字符串 var input = document.createElement("input"); input. ...

  9. 安装Tengine和Tengine说明

    什么是Tengine 官方帮助文档:http://tengine.taobao.org/nginx_docs/cn/   Tengine的安装   新建tengine用户组 groupadd -r n ...

  10. 杂项-公司:IBM

    ylbtech-杂项-公司:IBM IBM (IT公司-国际商业机器公司) IBM(国际商业机器公司)或万国商业机器公司,简称IBM(International Business Machines C ...