-
ConcurrentHashMap的实现原理是什么
参考答案 HashMap是线程不安全、效率高,HashTable是线程安全、效率低。 ConcurrentHashMap可以做到既是线程安全的,同时也可以有很高的效率,得益于使用了分段锁。 ConcurrentHashMap的实现原理: 1. JDK 1.7 ConcurrentHashMap是通过数组 + 链表实现,由Segment数组和Segment元素里对应多个HashEntry组成; v…...- 92
-
AQS的底层原理是什么
参考答案 1. AQS是什么 前往查看:AQS是什么 2. AQS 的内部实现 AQS 队列内部维护的是一个 FIFO 的双向链表,这种结构的特点是每个数据结构都有两个指针,分别指向直接的后继节点和直接前驱节点,所以双向链表可以从任意一个节点开始很方便的访问前驱和后继。 每个 Node 其实是由线程封装,当线程争抢锁失败后,会封装成 Node 加入到 ASQ 队列中。当获取锁的线程释放锁后,…...- 91
-
AQS是什么
参考答案 1. AQS的概念 AQS全称为AbstractQueuedSychronizer,中文翻译是抽象队列同步器。 AQS提供了一个FIFO队列,可以看成是一个用来实现同步锁以及其他涉及到同步功能的核心组件,常见的有:ReentrantLock、CountDownLatch等。 AQS是一个抽象类,主要是通过继承的方式来使用,它本身没有实现任何的同步接口,仅仅是定义了同步状态的获取以及释放的…...- 89
-
ArrayList list=new ArrayList(10);中的list扩容了几次
参考答案 ArrayList list=new ArrayList(10);中的list扩容了 0 次。原因: 该语句只是申明和实例了一个 ArrayList,指定了容量为 10,未扩容。 以上,是Java面试题【ArrayList list=new ArrayList(10);中的list扩容了几次】的参考答案。 输出,是最好的学习方法。 欢迎在评论区留下你的问题、笔记或知识点补充…...- 83
-
单向链表的反转
参考答案 单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题。 比如一个链表是这样的: 1->2->3->4->5,通过反转后成为5->4->3->2->1。 方法一: 我们最常使用的方法是遍历一遍链表,利用一个辅助指针,存储遍历过程中当前指针指向的下一个元素,然后将当前节点元素的指针反转后,利用已经存储的指针往后面继续遍历。 实例:…...- 83
-
Java.util.Map的常用实现类有哪些
参考答案 Java.util.Map的常用实现类如下: HashMap、LinkedHashMap; Hashtable; TreeMap; IdentityHashMap。 以上,是Java面试题【Java.util.Map的常用实现类有哪些】的参考答案。 输出,是最好的学习方法。 欢迎在评论区留下你的问题、笔记或知识点补充~ ---end---...- 79
-
Java 集合框架面试路线最全整理(附面试题精选及答案)
Java 集合框架面试路线最全整理,附 Java 集合框架高频必考面试题及答案。 搞定 Java 集合框架面试,看这一篇就够了,不用四处找资料,节约大量时间。 1 Java 集合框架面试题及答案 AQS AQS的底层原理是什么 AQS是什么 Queue Queue的add()和offer()方法有什么区别 Queue的remove()和poll()方法有什么区别 Queue的element(…...- 68
-
List里如何剔除相同的对象
参考答案 List里剔除相同对象,实例: public class TestRemoveListSameElement { public static void main(String[] args) { List<String> l = Arrays.asList("1", "2", "3", "1");…...- 67
-
List、Map、Set 三个接口,在存取元素时各自的特点是什么
参考答案 List、Map、Set 三个接口在存取元素时,各自的特点: List以索引来存取元素,元素可重复; Set不能存放重复元素; Map保存键值对映射,映射关系可以一对一、多对一; List有基于数组和链表实现两种方式; Set、Map容器有基于哈希存储和红黑树两种方式实现; Set基于 Map 实现,Set里的元素值就是Map里key。 以上,是Java面试题【List、Map、Set …...- 66
-
Collections工具类中的sort方法如何比较元素
参考答案 Collections工具类的sort()方法有两种方式: 1. 要求传入的待排序容器中存放的对象比较实现 Comparable 接口,以实现元素的比较; 2. 不强制性的要求容器中的元素必须可比较,但要求传入参数 Comparator 接口的子类,需要重写 compare() 方法实现元素的比较规则,即通过接口注入比较元素大小的算法,这就是回调模式的应用。 以上,是Java面试题【Co…...- 63
-
List、Set、Map哪个继承自Collection接口
参考答案 List 和 Set 继承自 Collection 接口; Map 是一个接口,未继承其他接口,仅仅默认继承了 Object 类。 以上,是Java面试题【List、Set、Map哪个继承自Collection接口】的参考答案。 输出,是最好的学习方法。 欢迎在评论区留下你的问题、笔记或知识点补充~ ---end---...- 60
-
Map的实现类中,有序的、无序的分别是哪些,如何保证其有序性
参考答案 Map 的实现类有 HashMap、LinkedHashMap、TreeMap,其中: 无序的:HashMap; 有序的:LinkedHashMap(记录了添加数据的顺序),TreeMap(默认升序)。 保证其有序性的方法: LinkedHashMap 底层存储结构是哈希表+链表,链表记录了添加数据的顺序; TreeMap 底层存储结构是二叉树,二叉树的中序遍历保证了数据的有序性。 以上…...- 55
-
Vector、ArrayList、LinkedList 的存储性能和特性
参考答案 Vector、ArrayList、LinkedList 的存储性能和特性: ArrayList 和 Vector 都是使用数组存储数据; 允许直接按序号索引元素; 插入元素涉及数组扩容、元素移动等内存操作; 根据下标找元素快,存在扩容的情况下插入慢; Vector 对元素的操作,使用了 synchronized 方法,性能比 ArrayList 差; Vector 属于遗留容器,早期的 …...- 54
-
LinkedHashMap、LinkedHashSet、LinkedList哪个最适合当作Stack使用
参考答案 LinkedList最适合当作Stack使用,原因: Stack 是线性结构,具有先进后出的特点; LinkedList 天然支持 Stack 的特性,调用 push(E e) 方法放入元素,调用 pop() 方法取出栈顶元素,内部实现只需要移动指针即可; LinkedHashSet 是基于 LinkedHashMap 实现的,记录添加顺序的 Set 集合; LinkedHashMap …...- 51
-
Java有哪些常用的并发集合
参考答案 1. 常用的并发集合类 ConcurrentHashMap:线程安全的HashMap的实现。 CopyOnWriteArrayList:线程安全且在读操作时无锁的ArrayLis。 CopyOnWriteArraySet:基于CopyOnWriteArrayList,不添加重复元素。 ArrayBlockingQueue:基于数组、先进先出、线程安全,可实现指定时间的阻塞读写,并且容量…...- 51
-
HashMap的键值需要注意什么
参考答案 HashMap的键值需要注意: HashMap 的 key 相等的条件是,条件 1 必须满足,条件2和3必须满足一个。 key 的hash值相等; 内存中是同一个对象,即使用==判断 key 相等; key不为null, 且使用equals判断 key 相等。 自定义类作为 HashMap 的 key,需要注意按照自己的设计逻辑,重写自定义类的 hashCode() 方法和 equals…...- 50
-
Array和ArrayList有什么区别
参考答案 Array和ArrayList的区别: 1. Array 即数组,声明方式如下: int[] array = new int[3]; int array [] = new int[3]; int[] array = {1, 2, 3}; int[] array = new int[]{1, 2, 3}; 定义一个 Array 时,必须指定数组的数据类型及数组长度,即数组中存放的元素个数固…...- 47
-
为什么基本类型不能做为HashMap的键值
参考答案 基本类型不能做为HashMap的键值,具体原因: Java中是使用泛型来约束 HashMap 中的key和value的类型的,HashMap<K, V>; 泛型在Java的规定中必须是对象Object类型的,基本数据类型不是Object类型,不能作为键值; map.put(0, "ConstXiong")中编译器已将 key 值 0 进行了自动装箱,变为了…...- 47
-
怎么确保一个集合不能被修改
参考答案 确保一个集合不能被修改方法如下: 使用 JDK中java.util.Collections 类,unmodifiable*** 方法赋值原集合。 当再修改集合时,会报错 java.lang.UnsupportedOperationException,以确保自己定义的集合不被其他人修改。 public class TestCollectionUnmodify { static List&l…...- 47
-
Java中已经数组类型,为什么还要提供集合
参考答案 数组的优点: 数组的效率高于集合类。 数组能存放基本数据类型和对象;集合中只能放对象。 数组的缺点: 不是面向对象的,存在明显的缺陷。 数组长度固定且无法动态改变;集合类容量动态改变。 数组无法判断其中实际存了多少元素,只能通过length属性获取数组的申明的长度。 数组存储的特点是顺序的连续内存;集合的数据结构更丰富。 JDK 提供集合的意义: 集合以类的形式存在,符合面向对象,通过简…...- 45
-
HashMap和Hashtable有啥区别
参考答案 HashMap和Hashtable的主要区别: 线程安全性不同。HashMap 线程不安全;Hashtable 中的方法是 synchronized 的。 父类不同。HashMap 继承自 AbstractMap;Hashtable 继承自 Dictionary。 迭代器不同。HashMap 的 Iterator 是 fail-fast 迭代器;Hashtable 还使用了 enumer…...- 45
-
Queue的add()和offer()方法有什么区别
参考答案 Queue的add()和offer()方法的区别: Queue 中 add() 和 offer() 都是用来向队列添加一个元素; 在容量已满的情况下,add() 方法会抛出IllegalStateException异常,offer() 方法只会返回 false。 JDK1.8 源码中的解释: /** * Inserts the specified element into this qu…...- 44
-
Queue的element()和peek()方法有什么区别
参考答案 Queue的element()和peek()方法的区别: Queue 中 element() 和 peek() 都是用来返回队列的头元素,不删除; 在队列元素为空的情况下,element() 方法会抛出NoSuchElementException异常,peek() 方法只会返回 null。 JDK1.8 中源码解释: /** * Retrieves, but does not remov…...- 43