Java开发工程师最新面试题库系列——集合部分(附答案)
集合
如果你有更好的想法请在评论区留下您的答案,一起交流讨论
说说常见的集合有哪些?
答:主要分List、Set、Map、Queue四类,其中包含ArrayList、LinkedList、HashSet、TreeSet、HashMap
Comparable和Comparator接口的区别?
答:其两者的目的都是让对象可比。第一种将需要比较的类可实现Comparable并重写comparaTo方法制定比较规制,如此让类本身具备可比性,无需依赖其他第三方类。第二种为需要比较的类再定义一个比较类,该类需要基础Comparator接口实现compara方法传入俩个需要对象的进行比较,该方法需要依赖第三方类。
集合使用泛型有什么优点?
答:泛型允许我们为集合提供一个可以容纳的对象类型,因此,如果你添加其它类型的任何元素,它会在编译时报错。这避免了在运行时出现ClassCastException,因为你将会在编译时得到报错信息。
List、Set、Map之间的区别是什么?
答:
特性不同
- List 有序可重复
- Set 无序不可重复
- Map KV形式存储,无序Key不可重复
为什么Map接口不继承Collection接口?
答:Map提供的是键值对映射(即Key和value的映射),而collection提供的是一组数据(并不是键值对映射)。如果map继承了collection接口,那么所有实现了map接口的类到底是用map的键值对映射数据还是用collection的一组数据呢(就我们平常所用的hashMap、hashTable、treeMap等都是键值对,所以它继承collection完全没意义),而且map如果继承了collection接口的话还违反了面向对象的接口分离原则。
常用的线程安全的Map有哪些?
答:HashTable,ConcurrentHashMap
HashMap和Hashtable有什么区别?
答:
- HashMap的Key和Value都可以为Null,而HashTable的Key和Value都不能
- HashMap的线程不安全效率高,HashTable的线程安全效率低
- HashMap继承的是AbstractMap,HashTable继承的是Dictionary接口
HashMap和TreeMap怎么选?
答:存放的数据需要排序选择TreeMap,不需要排序选择HashMap,而且可以根据HashMap空间的使用,对初始容量和负载因子进行调优。
HashMap的数据结构是什么?
答:数组+链表/红黑树,一般称为“链表散列”
HashMap在JDK 8中有哪些改变?
答:JDK8之前HashMap采用的数据结构为数组+链表,JDK8之后HashMap采用数组+链表/红黑树。增加红黑树来优化链表过长时带来的查询性能消耗;
发生Hash冲突时
JDK7:插入链表的头部,头插法
JDK8:插入链表的尾部,尾插法HashMap是怎么解决Hash冲突的?
答:
- 开放地址法:将散列算法算出来的hash通过位移操作符向后位移,使存放地址向后移位,如果还在冲突就继续移位
- 拉链发:在相同的散列位置处生产一个链表,链在冲突位置的后面
- 在Hash:重新计算Hash
- 建立公共溢出区
HashMap是怎么扩容的?
答:当存储的数据量达到总容量的负载因子大小(默认0.75)时开始扩容。扩容会创建当前数组大小的两倍,再将原来的数据重新进行hash计算存储位置,由此可见HashMap扩容对性能的消耗比较严重
HashMap如何实现同步?
答:
- Collections.synchronizedMap(HashMap对象)将HashMap转变为线程安全的
- HashMap进行写操作的步骤写在synchronized同步代码块中
- 用lock
lock.lock();
Value = map.get(key);
lock.unlock();
ConcurrentHashMap的数据结构是什么?
答:CurrentHashMap的结构是Segment数组的意义就是将一个大的table分割成多个小的table来进行加锁,也就是上面的提到的锁分离技术,而每一个Segment元素存储的是HashEntry数组+链表,这个和HashMap的数据存储结构一样。
ArrayList是线程安全的吗?
答:线程不安全
常用线程安全的List集合有哪些?
答:Vector、以及通过java.util.Collections.SynchronizedList将任何List转换为线程安全、CopyOnWriteArrayList复制写入,添加元素时先加锁并且复制一份原来的List再添加元素,最后释放锁。
循环删除List集合可能会发生什么异常?
答:会导致数组元素位移,造成元素误删。解决办法是倒着删除或者使用迭代器遍历时删除
ArrayList和LinkedList有什么区别?
答:数据结构不同,ArrayList底层采用数组,查询快增加或删除慢(涉及到数据元素位移)。LinkedList底层采用链表结构,查询慢,增加删除快
ArrayList和Vector有什么区别?
答:ArrayList线程不安全效率高,Vector线程安全效率低
什么是CopyOnWriteArrayList?
答:CopyOnWriteArrayList是ArrayList的一个线程安全的变体,其中所有可变操作(add、set等等)都是通过对底层数组进行一次新的复制来实现的。相比较于ArrayList它的写操作要慢一些,因为它需要实例的快照。
CopyOnWriteArrayList中写操作需要大面积复制数组,所以性能肯定很差,但是读操作因为操作的对象和写操作不是同一个对象,读之间也不需要加锁,读和写之间的同步处理只是在写完后通过一个简单的"="将引用指向新的数组对象上来,这个几乎不需要时间,
什么是fail-safe?
答:当我们对集合结构上做出改变的时候,fail-fast机制就会抛出异常。但是,对于采用fail-safe机制来说,就不会抛出异常
这是因为,当集合的结构被改变的时候,fail-safe机制会在复制原集合的一份数据出来,然后在复制的那份数据遍历。
什么是fail-fast?
答:fail-fast的字面意思是“快速失败”。当我们在遍历集合元素的时候,经常会使用迭代器,但在迭代器遍历元素的过程中,如果集合的结构被改变的话,就会抛出异常,防止继续遍历。这就是所谓的快速失败机制。fail-fast,即快速失败机制,它是java集合中的一种错误检测机制,当多个线程(单个线程也是可以滴),在结构上对集合进行改变时,就有可能会产生fail-fast机制。
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)多线程环境
当一个线程在遍历这个集合,而另一个线程对这个集合的结构进行了修改。
HashSet的底层实现原理是什么?
答:HashSet底层依赖与HashMap进行数据存储,HashSet的元素就是HashMap中的Key,而Value则为Null
怎么确保一个集合不能被修改?
答:两种实现方式,Collections. unmodifiableCollection(Collection c) 方法创建的集合(
最终会返回一个由Collections.UnmodifiableCollection类,该类对所有的写操作都进行了重写覆盖,使其抛出UnsupportedOperationException异常),和使用Arrays.asList创建的集合(返回了一个Arrays的静态内部类ArrayList,原理与Collections.UnmodifiableCollection差不多)。
Java开发工程师最新面试题库系列——集合部分(附答案)的更多相关文章
- Java开发工程师最新面试题库系列——Web部分(附答案)
WEB 如果你有更好的想法请在评论区留下您的答案,一起交流讨论 http和https有什么区别? 答:http是超文本传输协议,默认端口是80.https是安全的默认端口是443:http是明文传输, ...
- Java开发工程师最新面试题库系列——Spring部分(附答案)
Spring Spring框架是什么? 答:Spring是轻量级的面向切面和控制反转的框架.初代版本为2002年发布的interface21,Spring框架是为了解决企业级应用开发的复杂性的出现的, ...
- Java开发工程师最新面试题库系列——Java基础部分
JAVA基础 面向对象有哪些特征? 答:继承.封装.多态 JDK与JRE的区别是什么? 答:JDK是java开发时所需环境,它包含了Java开发时需要用到的API,JRE是Java的运行时环境,JDK ...
- Java开发工程师最新面试题库系列——Mybatis框架部分(附答案)
Mybatis Mybatis是什么框架? 答:持久层框架 Mybatis和ORM有什么区别? 答:ORM是对象关系映射的一种设计理念,也就是对象属性对应数据库字段,让开发人员以操作对象的方式操作数据 ...
- 【转】2012年7月12 – 腾讯公司 WEB高级应用开发工程师 最新面试题
腾讯面试(WEB高级应用开发工程师<PHP>)非答案啊!!! 开始正题之前,容博主啰嗦两句吧,呵呵.(你也可跳过直接到红色字体看题!) 腾讯一直是我很敬重的企业,尽管小企鹅在战略上饱受争议 ...
- 2012年7月12 – 腾讯公司 WEB高级应用开发工程师 最新面试题 [转]
笔试(45 minute):(本来是四张纸,被我弄丢了一张!无伤大雅,难度级别不会有出入) 注意:由于时间紧迫和水平有限,难免有不足或错误,请指证,虚心学习! [PHP] 写出PHP中至少5个全局变量 ...
- Java容器--2021面试题系列教程(附答案解析)--大白话解读--JavaPub版本
Java容器--2021面试题系列教程(附答案解析)--大白话解读--JavaPub版本 前言 序言 再高大上的框架,也需要扎实的基础才能玩转,高频面试问题更是基础中的高频实战要点. 适合阅读人群 J ...
- 阿里巴巴-OS事业群-OS手机事业部-系统服务部门招聘Java开发工程师,有意者请进来
我是阿里巴巴-OS事业群-OS手机事业部-系统服务部的开发工程师,正在招聘Java开发工程师. 以下是职位描述: 岗位名称:Java开发工程师 招聘人数:5人 生效日期:2014-03-12 结束日期 ...
- JAVA开发工程师面试(1)
我已经有很长一段时间没有更新博客了,难道是博主我变懒惰了吗?哎,这样可不行啊,我还有好多知识要学习,要和大家分享.以后我需要更加努力,改掉自己的惰性.本人文采不怎么样,只能是把自己所想的说出来,想和大 ...
随机推荐
- vue中computed/method/watch的区别
摘要:本文通过官方文档结合源码来分析computed/method/watch的区别. Tips:本文分析的源码版本是v2.6.11,文章中牵涉到vue响应式系统原理部分,如果不是很了解,建议先阅读上 ...
- 01. struts2介绍
struts2优点 与Servlet API 耦合性低.无侵入式设计 提供了拦截器,利用拦截器可以进行AOP编程,实现如权限拦截等功能 支持多种表现层技术,如:JSP.freeMarker.veloc ...
- LR 场景中Windows资源配置设置
监视连接前的准备工作 1)进入被监视windows系统,开启以下几个服务Remote Procedure Call(RPC) .Rmote Resgistry.Network DDE.Server.W ...
- 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK
不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK 报错图示: 报错内容: Exception in thread "main" java.sql.SQ ...
- MySQL高可用HA——keepalived配置
0. Keepalived介绍 Keepalived是基于VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)协议的一款高可用软件.Keepaili ...
- 可视化Go内存管理
小结: 1. Go不需要VM,Go应用程序二进制文件中嵌入了一个小型运行时(Go runtime),可以处理诸如垃圾收集(GC),调度和并发之类的语言功能 Go does not need a VM ...
- OpenSSL 常见对称加密算法特性分析
在选择加密算法,面对一大长串的选项时,大家都有这样的疑问,究竟哪种加密方式是最好的呢? 对于加密方式.算法来说,一般安全性与性能呈负相关,越是安全的,对性能要求则更高. 现在主流的加密协议的安全性均能 ...
- JAXB学习(一):概述
pre.XML { background-color: rgba(255, 204, 204, 1); padding-left: 25px } JAXB是 Java Architecture for ...
- LOJ10138
ZJOI 2008 树上的统计 一树上有 n 个节点,编号分别为 1 到 n,每个节点都有一个权值 w.我们将以下面的形式来要求你对这棵树完成一些操作: CHANGE u t :把节点 u 权值改为t ...
- servelet 实现Post接口访问
先上代码: package com.jovtec.galaxy.mailbox; import java.io.BufferedReader; import java.io.IOException; ...