首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

40个Java集合类面试题和答案

Entry存储在LinkedList中,所以如果存在entry,使用equals()方法来检查传递key是否已经存在,如果存在,它会覆盖value,如果不存在,它会创建一个entry然后保存。...当我们通过传递key调用get方法再次使用hashCode()来找到数组中索引,然后使用equals()方法找出正确Entry,然后返回值。下面的图片解释了详细内容。...基于你collection大小,也许向HashMap中添加元素更快,将map换为TreeMap进行有序key遍历。 23.ArrayList和Vector有何异同点?...所以,尽管有使用索引获取元素方法,内部实现是从起始点开始遍历,遍历到索引节点然后返回元素,时间复杂度为O(n),比ArrayList要慢。...(2)与ArrayList相比,在LinkedList中插入、添加和删除一个元素更快,因为在一个元素被插入到中间时候,不会涉及改变数组大小,或更新索引。

63830

面试江湖:一招破解 Java 集合类面试题

Entry存储在LinkedList中,所以如果存在entry,使用equals()方法来检查传递key是否已经存在,如果存在,它会覆盖value,如果不存在,它会创建一个entry然后保存。...当我们通过传递key调用get方法再次使用hashCode()来找到数组中索引,然后使用equals()方法找出正确Entry,然后返回值。下面的图片解释了详细内容。...所以,尽管有使用索引获取元素方法,内部实现是从起始点开始遍历,遍历到索引节点然后返回元素,时间复杂度为O(n),比ArrayList要慢。...(2)与ArrayList相比,在LinkedList中插入、添加和删除一个元素更快,因为在一个元素被插入到中间时候,不会涉及改变数组大小,或更新索引。...如果oldVal不为空,说明是一次更新操作,没有对元素个数产生影响,则直接返回旧值; 如果插入是一个节点,则执行addCount()方法尝试更新元素个数baseCount; 5、HashMap扩容操作是怎么实现

50730
您找到你想要的搜索结果了吗?
是的
没有找到

java 之容器

ArrayList允许使用数字来查找值,Hash表允许我们使用另一个对象来查找某个对象。 尽管存在这两种概念,我们在工程中,大部分代码还是和接口打交道。...这时使用add和delete方法可能引发改变数组尺寸尝试,会在运行时得到Unsupported Operation错误。...如果我们将多个相同元素放入Set中,仅仅保存一个。使用Set很适合进行查找操作,Java中提供了一个HashSet类,查找速度很快,适合用作快速查找。...,其中有一些重复词汇,但是在实际输出我们会发现,并不存在那么多元素,而仅仅打印不重复元素。...在工程上,它是十分重要数据结构。比如我们有一系列用户分组对象保存了用户分组信息,我们经常需要通过用户分组对象获取这个分组所有用户。如果我们仅仅通过List进行存储,在查找工作量是很大

1.4K80

40个Java集合面试问题和答案

Entry存储在LinkedList中,所以如果存在entry,使用equals()方法来检查传递key是否已经存在,如果存在,它会覆盖value,如果不存在,它会创建一个entry然后保存。...当我们通过传递key调用get方法再次使用hashCode()来找到数组中索引,然后使用equals()方法找出正确Entry,然后返回值。下面的图片解释了详细内容。...基于你collection大小,也许向HashMap中添加元素更快,将map换为TreeMap进行有序key遍历。 23.ArrayList和Vector有何异同点?...所以,尽管有使用索引获取元素方法,内部实现是从起始点开始遍历,遍历到索引节点然后返回元素,时间复杂度为O(n),比ArrayList要慢。...(2)与ArrayList相比,在LinkedList中插入、添加和删除一个元素更快,因为在一个元素被插入到中间时候,不会涉及改变数组大小,或更新索引。

78530

21个Java Collections面试问答

泛型允许我们提供集合可以包含Object类型,因此,如果您尝试添加其他类型任何元素,则引发编译错误。...每当我尝试获取下一个元素,迭代器fail-fast属性都会检查基础集合结构是否有任何修改。如果找到任何修改,则抛出ConcurrentModificationException。...该条目存储在LinkedList中,因此,如果已经存在一个条目,则使用equals()方法检查传递键是否已存在,如果是,它将覆盖该值,否则它将创建一个条目并存储此键值条目。...阈值是容量乘以负载因子,并且如果Map大小大于阈值,则每当我尝试添加条目,HashMap都会将Map内容重新映射为容量更大数组。...当我尝试从HashMap中获取价值,也会使用这些方法。

2K40

一不小心就让Java开发者踩坑fail-fast是个什么鬼?

很多时候正是因为代码中抛出了CMException,很多程序员就会很困惑,明明自己代码并没有在多线程环境中执行,为什么抛出这种并发有关异常呢?这种情况在什么情况下才会抛出呢?...com.hollis.ForEach.main(ForEach.java:22) 同样,读者可以尝试下在增强for循环中使用add方法添加元素,结果也会同样抛出该异常。...是什么原因导致他们值不想等呢? modCount是ArrayList一个成员变量。表示该集合实际被修改次数。...这就导致iterator在遍历时候,会发现有一个元素在自己不知不觉情况下就被删除/添加了,就会抛出一个异常,用来提示用户,可能发生了并发修改!...通俗理解是当我们往一个容器添加元素时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个容器,然后容器里添加元素添加元素之后,再将原容器引用指向容器。

87420

集合线程安全解读

ArrayList中,迭代器使用一个内部变量modCount来判断集合是否被修改过,而modCount值会在每次添加或删除元素递增。...当多个线程并发执行ArrayListadd操作,有可能导致modCount值和迭代器迭代状态不一致。...和 ArrayList 一样,它是个可变数组;但是和 ArrayList 不同具有以下特性: 1....它最适合于具有以下特征应用程序:List 大小通常保持很小,只读操作远多 于可变操作,需要在遍历期间防止线程间冲突。 2. 它是线程安全。 3....写线程获取到锁,其他写线程阻塞  复制思想: 当我们往一个容器添加元素时候,不直接往当前容器添加,而是先将当前容 器进行 Copy,复制出一个容器,然后容器里添加元素添加元素 之后,再将原容器引用指向容器

15230

Java集合源码浅析

下面尝试在集合中添加元素,来分析add方法执行过程。...添加一个元素先得到一个 hash值,根据该值转成一个索引值。 找到存储数据表 table,检查该索引是否已在 table中存在元素: 如果没有,直接将该元素加入。...为什么这条 if判断语句放在方法开始了,也可以推测,只要不是首次添加元素,就不再会进入该判断,直接走后面的逻辑。...否则,添加失败!! 去重原理 在理解了 HashMap底层 table[]初始化逻辑之后,当我们向其中 put()第二个元素底层是如何判断元素是否重复呢?...当我添加一个重复元素,LinkedHashSet直接调用父类 HashSet中比较方法,对重复元素进行一个判断并去重,其实这里原理和之前讲 HashSet原理是一样,当添加元素是,LinkedHashSet

37110

Java泛型详解

引言 Java泛型是jdk1.5中引入一个特性,泛型提供了编译类型检测机制,该机制允许程序员在编译检测到非法类型。...extends Fruit> flist = new ArrayList(); 当我尝试add一个Apple时候,flist可能指向new ArrayList();...当我尝试add一个Orange时候,flist可能指向new ArrayList(); 当我尝试add一个Fruit时候,这个Fruit可以是任何类型Fruit,而flist可能只想某种特定类型...super Apple> list = new ArrayList(); 当我尝试通过list来get一个Apple时候,可能get得到一个Fruit,这个Fruit可以是Orange...我们先来看一下下面这段代码,这段代码运行时候抛出ClassCastException异常,提示String无法转换成Integer: MyNode mn = new MyNode(5);Node n

63210

ArrayList 扩容机制

当我们向ArrayList添加元素,如果当前容量不足以容纳新元素ArrayList自动进行扩容操作,即增加底层数组长度。 2. 为什么需要ArrayList扩容机制?...扩容触发条件:当ArrayListsize超过当前容量,就会触发扩容操作。 扩容策略:ArrayList在扩容创建一个更大容量数组,并将原有元素复制到数组中。...具体扩容流程如下: 当向ArrayList添加元素先检查当前容量是否足够。如果不足,则进行扩容操作。 扩容,根据增长因子计算容量,并创建一个数组。...将原有数组中元素复制到数组中。 更新ArrayList内部引用,指向数组。 添加元素数组中。 4....内存占用:ArrayList在扩容需要创建数组,并将原有元素复制到数组中,可能造成内存浪费。 7.

60920

金九银十: 50 个JS 必须懂面试题为你助力

length() 返回字符串长度。 pop() 它从数组中删除最后一个元素并返回该元素。 push() 它将一个或多个元素添加到数组末尾,并返回数组长度。...它是一个一元运算符,放在单个操作数之前,可以是任何类型。 值是一个字符串,表示操作数数据类型。...undeclared变量是程序中不存在且未声明变量。 如果程序尝试读取未声明变量值,则会遇到运行时错误。...可以通过在文件,程序或函数开头添加“use strict”来启用严格模式 问题41:JS 中 prompt 框是什么 提示框是允许用户通过提供文本框输入输入框。...如果在其他任何地方都没有对原始数组arrayList引用,则建议这样做���因为实际上会创建一个空数组。

6.6K31

集合之ArrayList

ArrayList就是数组列表,主要用来装载数据,当我们装载是基本类型数据int,long,boolean,short,byte…时候我们只能存储他们对应包装类,主要底层实现是数组Object...= {}所以数组容量为0, 只有真正对数据进行添加add,才分配默认DEFAULT_CAPACITY = 10初始容量。...然后把原数组数据,原封不动复制到数组中,这个时候再把指向原数地址换到数组,ArrayList就这样完成了一次改头换面。...ArrayList默认数组大小为什么是10? 据说是因为sun程序员对一系列广泛使用程序代码进行了调研,结果就是10这个长度数组是最常用最有效率。...而且将构造函数与initialCapacity结合使用,然后使用set()抛出异常,尽管该数组已创建,但是大小设置不正确。

50420

聊聊并发-Java中Copy-On-Write容器

通俗理解是当我们往一个容器添加元素时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个容器,然后容器里添加元素添加元素之后,再将原容器引用指向容器。...以下代码是向ArrayList添加元素,可以发现在添加时候是需要加锁,否则多线程写时候Copy出N个副本出来。 ?...读时候不需要加锁,如果读时候有多个线程正在向ArrayList添加数据,读还是读到旧数据,因为写时候不会锁住旧ArrayList。 ?...这些不能被搜索关键字会被放在一个黑名单当中,黑名单每天晚上更新一次。当用户搜索检查当前关键字在不在黑名单当中,如果在,则提示不能搜索。实现代码如下: ?...因为CopyOnWrite复制机制,所以在进行写操作时候,内存里会同时驻扎两个对象内存,旧对象和写入对象(注意:在复制时候只是复制容器里引用,只是在写时候创建对象添加容器里

91200

Java 泛型详解

extends T>用法,利用它我们可以从list里面get元素,那么我们可不可以往list里面add元素呢?我们来尝试一下: ? 答案是否定,Java编译器不允许我们这样做,为什么呢?...当我尝试add一个Apple时候,flist可能指向new ArrayList(); 当我尝试add一个Orange时候,flist可能指向new ArrayList<Apple...这样我们可以往容器里面添加元素了,但是使用super坏处是以后不能get容器里面的元素了,原因很简单,我们继续从编译器角度考虑这个问题,对于List<?...当我尝试通过list来get一个Apple时候,可能get得到一个Fruit,这个Fruit可以是Orange等其他类型Fruit。...实际上不是这样,我们先来看一下下面这段代码,这段代码运行时候抛出ClassCastException异常,提示String无法转换成Integer: ?

67750

50 个JS 必须懂面试题为你助力金九银十

length() 返回字符串长度。 pop() 它从数组中删除最后一个元素并返回该元素。 push() 它将一个或多个元素添加到数组末尾,并返回数组长度。...它是一个一元运算符,放在单个操作数之前,可以是任何类型。 值是一个字符串,表示操作数数据类型。...undeclared变量是程序中不存在且未声明变量。 如果程序尝试读取未声明变量值,则会遇到运行时错误。...可以通过在文件,程序或函数开头添加“use strict”来启用严格模式 问题41:JS 中 prompt 框是什么 提示框是允许用户通过提供文本框输入输入框。...如果在其他任何地方都没有对原始数组arrayList引用,则建议这样做,因为实际上会创建一个空数组。

4.4K30

小白学算法-数据结构和算法教程: 使用开放寻址线性探测实现自己哈希表

Java 中使用链接实现哈希表 所有数据结构都有其自身特点,例如,当需要快速搜索元素(在log(n)中),会使用BST。当需要在恒定时间内获取最小或最大元素,使用堆或优先级队列。...类似地,哈希表用于在恒定时间内获取、添加和删除元素。在继续实施方面之前,任何人都必须清楚哈希表工作原理。...现在,当我们在数组中观察以获取值,我们提供与该数组中值相对应位置/索引。在哈希表中,我们不使用索引,而是使用键来获取与该键对应值。 每次生成密钥。密钥被传递给哈希函数。...在我们实现中,每当我们向哈希表添加键值对时,我们都会检查负载因子,如果大于 0.7,我们就会将哈希表大小加倍。...我们计划保留在哈希图中函数如下:  get(K key) :如果HT(Hast Table )中存在该键,则返回该键对应值 getSize():返回 HT 大小 add():向 HT 添加一个有效键

17220

【Java编程进阶之路 10】Java常见运行时异常以及解决方案

SecurityException是Java中一个运行时异常,表示程序试图执行一个安全策略不允许操作。...在实际开发中,应该确保程序有足够权限执行需要操作,并且在用户没有相应权限时提供适当错误处理和提示信息。 9.3 解决方案 通常需要修改程序安全性策略或避免执行不允许操作。...10 UnsupportedOperationException 10.1 异常描述 当尝试执行不支持操作抛出,如在不可变集合上执行添加或删除操作。...当我尝试使用 add 方法向这个列表中添加元素抛出 UnsupportedOperationException,因为 immutableList 是不可变,不支持添加或删除操作。...处理运行时异常关键是理解为什么抛出异常,并在代码中采取适当预防措施。这通常涉及到对输入验证、对对象状态管理以及对异常情况适当处理。通过这些方法,可以提高程序健壮性和可靠性。

24610

java集合详解和集合面试题目

而如果移动一个指定位置导致后面的元素都发生移动,这个时候就应该考虑到使用linklist,因为移动一个指定位置数据其它元素不移动。...Entry存储在LinkedList中,所以如果存在entry,使用equals()方法来检查传递key是否已经存在,如果存在,它会覆盖value,如果不存在,它会创建一个entry然后保存。...当我们通过传递key调用get方法再次使用hashCode()来找到数组中索引,然后使用equals()方法找出正确Entry,然后返回值。下面的图片解释了详细内容。...基于你collection大小,也许向HashMap中添加元素更快,将map换为TreeMap进行有序key遍历。 23.ArrayList和Vector有何异同点?...(2)与ArrayList相比,在LinkedList中插入、添加和删除一个元素更快,因为在一个元素被插入到中间时候,不会涉及改变数组大小,或更新索引。

64120

Java集合面试题

所以,具体实现应该决定如何对进行克隆或序列化,或它是否可以被克隆或序列化。在所有的实现中授权克隆和序列化,最终导致更少灵活性和更多限制,特定实现应该决定它是否可以被克隆和序列化。...HashSet 是用一个 hash 表来实现,因此,元素是无序添加,删除和 HashSet 包括方法持续时间复杂度是 O(1) 。...TreeSet 是用一个树形结构实现,因此,它是有序添加,删除和 TreeSet 包含方法持续时间复杂度是 O(logn) 。 ? 如何决定选用 HashMap 还是 TreeMap?...基于你 collection 大小,也许向 HashMap 中添加元素更快,再将 HashMap 换为 TreeMap 进行有序 key 遍历。...当我们给 #put(key, value) 方法传递键和值,我们先对键调用 #hashCode() 方法,返回 hashCode 用于找到 bucket 位置来储存 Entry 对象。 ?

53021
领券