集合

如果你有更好的想法请在评论区留下您的答案,一起交流讨论

  1. 说说常见的集合有哪些?

    答:主要分List、Set、Map、Queue四类,其中包含ArrayList、LinkedList、HashSet、TreeSet、HashMap

  2. Comparable和Comparator接口的区别?

    答:其两者的目的都是让对象可比。第一种将需要比较的类可实现Comparable并重写comparaTo方法制定比较规制,如此让类本身具备可比性,无需依赖其他第三方类。第二种为需要比较的类再定义一个比较类,该类需要基础Comparator接口实现compara方法传入俩个需要对象的进行比较,该方法需要依赖第三方类。

  3. 集合使用泛型有什么优点?

    答:泛型允许我们为集合提供一个可以容纳的对象类型,因此,如果你添加其它类型的任何元素,它会在编译时报错。这避免了在运行时出现ClassCastException,因为你将会在编译时得到报错信息。

  4. List、Set、Map之间的区别是什么?

    答:

    特性不同
    • List 有序可重复
    • Set 无序不可重复
    • Map KV形式存储,无序Key不可重复
  5. 为什么Map接口不继承Collection接口?

    答:Map提供的是键值对映射(即Key和value的映射),而collection提供的是一组数据(并不是键值对映射)。如果map继承了collection接口,那么所有实现了map接口的类到底是用map的键值对映射数据还是用collection的一组数据呢(就我们平常所用的hashMap、hashTable、treeMap等都是键值对,所以它继承collection完全没意义),而且map如果继承了collection接口的话还违反了面向对象的接口分离原则。

  6. 常用的线程安全的Map有哪些?

    答:HashTable,ConcurrentHashMap

  7. HashMap和Hashtable有什么区别?

    答:

    • HashMap的Key和Value都可以为Null,而HashTable的Key和Value都不能
    • HashMap的线程不安全效率高,HashTable的线程安全效率低
    • HashMap继承的是AbstractMap,HashTable继承的是Dictionary接口
  8. HashMap和TreeMap怎么选?

    答:存放的数据需要排序选择TreeMap,不需要排序选择HashMap,而且可以根据HashMap空间的使用,对初始容量和负载因子进行调优。

  9. HashMap的数据结构是什么?

    答:数组+链表/红黑树,一般称为“链表散列”

  10. HashMap在JDK 8中有哪些改变?

    答:JDK8之前HashMap采用的数据结构为数组+链表,JDK8之后HashMap采用数组+链表/红黑树。增加红黑树来优化链表过长时带来的查询性能消耗;

    发生Hash冲突时

    JDK7:插入链表的头部,头插法

    JDK8:插入链表的尾部,尾插法

  11. HashMap是怎么解决Hash冲突的?

    答:

    1. 开放地址法:将散列算法算出来的hash通过位移操作符向后位移,使存放地址向后移位,如果还在冲突就继续移位
    2. 拉链发:在相同的散列位置处生产一个链表,链在冲突位置的后面
    3. 在Hash:重新计算Hash
    4. 建立公共溢出区
  12. HashMap是怎么扩容的?

    答:当存储的数据量达到总容量的负载因子大小(默认0.75)时开始扩容。扩容会创建当前数组大小的两倍,再将原来的数据重新进行hash计算存储位置,由此可见HashMap扩容对性能的消耗比较严重

  13. HashMap如何实现同步?

    答:

    • Collections.synchronizedMap(HashMap对象)将HashMap转变为线程安全的
    • HashMap进行写操作的步骤写在synchronized同步代码块中
    • 用lock

      lock.lock();

      Value = map.get(key);

      lock.unlock();
  14. ConcurrentHashMap的数据结构是什么?

    答:CurrentHashMap的结构是Segment数组的意义就是将一个大的table分割成多个小的table来进行加锁,也就是上面的提到的锁分离技术,而每一个Segment元素存储的是HashEntry数组+链表,这个和HashMap的数据存储结构一样。

  15. ArrayList是线程安全的吗?

    答:线程不安全

  16. 常用线程安全的List集合有哪些?

    答:Vector、以及通过java.util.Collections.SynchronizedList将任何List转换为线程安全、CopyOnWriteArrayList复制写入,添加元素时先加锁并且复制一份原来的List再添加元素,最后释放锁。

  17. 循环删除List集合可能会发生什么异常?

    答:会导致数组元素位移,造成元素误删。解决办法是倒着删除或者使用迭代器遍历时删除

  18. ArrayList和LinkedList有什么区别?

    答:数据结构不同,ArrayList底层采用数组,查询快增加或删除慢(涉及到数据元素位移)。LinkedList底层采用链表结构,查询慢,增加删除快

  19. ArrayList和Vector有什么区别?

    答:ArrayList线程不安全效率高,Vector线程安全效率低

  20. 什么是CopyOnWriteArrayList?

    答:CopyOnWriteArrayList是ArrayList的一个线程安全的变体,其中所有可变操作(add、set等等)都是通过对底层数组进行一次新的复制来实现的。相比较于ArrayList它的写操作要慢一些,因为它需要实例的快照。

    CopyOnWriteArrayList中写操作需要大面积复制数组,所以性能肯定很差,但是读操作因为操作的对象和写操作不是同一个对象,读之间也不需要加锁,读和写之间的同步处理只是在写完后通过一个简单的"="将引用指向新的数组对象上来,这个几乎不需要时间,

  21. 什么是fail-safe?

    答:当我们对集合结构上做出改变的时候,fail-fast机制就会抛出异常。但是,对于采用fail-safe机制来说,就不会抛出异常

    这是因为,当集合的结构被改变的时候,fail-safe机制会在复制原集合的一份数据出来,然后在复制的那份数据遍历。

  22. 什么是fail-fast?

    答:fail-fast的字面意思是“快速失败”。当我们在遍历集合元素的时候,经常会使用迭代器,但在迭代器遍历元素的过程中,如果集合的结构被改变的话,就会抛出异常,防止继续遍历。这就是所谓的快速失败机制。fail-fast,即快速失败机制,它是java集合中的一种错误检测机制,当多个线程(单个线程也是可以滴),在结构上对集合进行改变时,就有可能会产生fail-fast机制。

  23. fail-fast和fail-safe有什么区别?

    答:

    fail-safe机制

    fail-safe任何对集合结构的修改都会在一个复制的集合上进行修改,因此不会抛出ConcurrentModificationException

    fail-safe机制有两个问题

    (1)需要复制集合,产生大量的无效对象,开销大

    (2)无法保证读取的数据是目前原始数据结构中的数据。

    fail-fast机制

    fail-fast机制在遍历一个集合时,当集合结构被修改,会抛出Concurrent Modification Exception。

    fail-fast会在以下两种情况下抛出ConcurrentModificationException

    (1)单线程环境

    集合被创建后,在遍历它的过程中修改了结构。

    注意 remove()方法会让expectModcount和modcount 相等,所以是不会抛出这个异常。

    (2)多线程环境

    当一个线程在遍历这个集合,而另一个线程对这个集合的结构进行了修改。

  24. HashSet的底层实现原理是什么?

    答:HashSet底层依赖与HashMap进行数据存储,HashSet的元素就是HashMap中的Key,而Value则为Null

  25. 怎么确保一个集合不能被修改?

    答:两种实现方式,Collections. unmodifiableCollection(Collection c) 方法创建的集合(

    最终会返回一个由Collections.UnmodifiableCollection类,该类对所有的写操作都进行了重写覆盖,使其抛出UnsupportedOperationException异常),和使用Arrays.asList创建的集合(返回了一个Arrays的静态内部类ArrayList,原理与Collections.UnmodifiableCollection差不多)。

Java开发工程师最新面试题库系列——集合部分(附答案)的更多相关文章

  1. Java开发工程师最新面试题库系列——Web部分(附答案)

    WEB 如果你有更好的想法请在评论区留下您的答案,一起交流讨论 http和https有什么区别? 答:http是超文本传输协议,默认端口是80.https是安全的默认端口是443:http是明文传输, ...

  2. Java开发工程师最新面试题库系列——Spring部分(附答案)

    Spring Spring框架是什么? 答:Spring是轻量级的面向切面和控制反转的框架.初代版本为2002年发布的interface21,Spring框架是为了解决企业级应用开发的复杂性的出现的, ...

  3. Java开发工程师最新面试题库系列——Java基础部分

    JAVA基础 面向对象有哪些特征? 答:继承.封装.多态 JDK与JRE的区别是什么? 答:JDK是java开发时所需环境,它包含了Java开发时需要用到的API,JRE是Java的运行时环境,JDK ...

  4. Java开发工程师最新面试题库系列——Mybatis框架部分(附答案)

    Mybatis Mybatis是什么框架? 答:持久层框架 Mybatis和ORM有什么区别? 答:ORM是对象关系映射的一种设计理念,也就是对象属性对应数据库字段,让开发人员以操作对象的方式操作数据 ...

  5. 【转】2012年7月12 – 腾讯公司 WEB高级应用开发工程师 最新面试题

    腾讯面试(WEB高级应用开发工程师<PHP>)非答案啊!!! 开始正题之前,容博主啰嗦两句吧,呵呵.(你也可跳过直接到红色字体看题!) 腾讯一直是我很敬重的企业,尽管小企鹅在战略上饱受争议 ...

  6. 2012年7月12 – 腾讯公司 WEB高级应用开发工程师 最新面试题 [转]

    笔试(45 minute):(本来是四张纸,被我弄丢了一张!无伤大雅,难度级别不会有出入) 注意:由于时间紧迫和水平有限,难免有不足或错误,请指证,虚心学习! [PHP] 写出PHP中至少5个全局变量 ...

  7. Java容器--2021面试题系列教程(附答案解析)--大白话解读--JavaPub版本

    Java容器--2021面试题系列教程(附答案解析)--大白话解读--JavaPub版本 前言 序言 再高大上的框架,也需要扎实的基础才能玩转,高频面试问题更是基础中的高频实战要点. 适合阅读人群 J ...

  8. 阿里巴巴-OS事业群-OS手机事业部-系统服务部门招聘Java开发工程师,有意者请进来

    我是阿里巴巴-OS事业群-OS手机事业部-系统服务部的开发工程师,正在招聘Java开发工程师. 以下是职位描述: 岗位名称:Java开发工程师 招聘人数:5人 生效日期:2014-03-12 结束日期 ...

  9. JAVA开发工程师面试(1)

    我已经有很长一段时间没有更新博客了,难道是博主我变懒惰了吗?哎,这样可不行啊,我还有好多知识要学习,要和大家分享.以后我需要更加努力,改掉自己的惰性.本人文采不怎么样,只能是把自己所想的说出来,想和大 ...

随机推荐

  1. vue中computed/method/watch的区别

    摘要:本文通过官方文档结合源码来分析computed/method/watch的区别. Tips:本文分析的源码版本是v2.6.11,文章中牵涉到vue响应式系统原理部分,如果不是很了解,建议先阅读上 ...

  2. 01. struts2介绍

    struts2优点 与Servlet API 耦合性低.无侵入式设计 提供了拦截器,利用拦截器可以进行AOP编程,实现如权限拦截等功能 支持多种表现层技术,如:JSP.freeMarker.veloc ...

  3. LR 场景中Windows资源配置设置

    监视连接前的准备工作 1)进入被监视windows系统,开启以下几个服务Remote Procedure Call(RPC) .Rmote Resgistry.Network DDE.Server.W ...

  4. 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK

    不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK 报错图示: 报错内容: Exception in thread "main" java.sql.SQ ...

  5. MySQL高可用HA——keepalived配置

    0. Keepalived介绍   Keepalived是基于VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)协议的一款高可用软件.Keepaili ...

  6. 可视化Go内存管理

    小结: 1. Go不需要VM,Go应用程序二进制文件中嵌入了一个小型运行时(Go runtime),可以处理诸如垃圾收集(GC),调度和并发之类的语言功能 Go does not need a VM ...

  7. OpenSSL 常见对称加密算法特性分析

    在选择加密算法,面对一大长串的选项时,大家都有这样的疑问,究竟哪种加密方式是最好的呢? 对于加密方式.算法来说,一般安全性与性能呈负相关,越是安全的,对性能要求则更高. 现在主流的加密协议的安全性均能 ...

  8. JAXB学习(一):概述

    pre.XML { background-color: rgba(255, 204, 204, 1); padding-left: 25px } JAXB是 Java Architecture for ...

  9. LOJ10138

    ZJOI 2008 树上的统计 一树上有 n 个节点,编号分别为 1 到 n,每个节点都有一个权值 w.我们将以下面的形式来要求你对这棵树完成一些操作: CHANGE u t :把节点 u 权值改为t ...

  10. servelet 实现Post接口访问

    先上代码: package com.jovtec.galaxy.mailbox; import java.io.BufferedReader; import java.io.IOException; ...