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

2024年java面试准备--集合篇

扩容的过程,ConcurrentHashMap 会将原来的小哈希表逐一复制到新的大哈希,这个过程仍然可以保证线程安全。...具体实现时,应建立一个伪随机数发生器,(i=(i+p) % m),并给定一个随机数做起点。 优点 容易序列化 若可预知数据总数,可以创建完美哈希数列 缺点 占空间很大。...不容易序列化 4. 建立公共溢出区 将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表。 Java集合的快速失败机制 “fail-fast”?...例如:假设存在两个线程(线程1、线程2),线程1通过Iterator在遍历集合A的元素,在某个时 候线程2修改了集合A的结构(是结构上面的修改,而不是简单的修改集合元素的内容),那么这 个时候程序就会抛出...原因:迭代器在遍历时直接访问集合的内容,并且在遍历过程中使用一个 modCount 变量。集 合在被遍历期间如果内容发生变化,就会改变modCount的值。

32631

HashMap源码剖析

,在首次使用时,数组即初始化,table的每个元素即是一个链表(Node)。...负载因子是度量哈希表数量达到多满时容量将自动扩容。当哈希的条目数超过负载因子和当前容量的乘积时,将对哈希表进行rehash(即重新构建内部数据结构),使哈希表的桶数大约提高到原来的两倍。...(如果小于这个容量,且桶的节点超过树化阀值,就会进行扩容操作。) 实例变量 transient Node[] table; 正是上面提到的数组链表数据结构数组。...快速迭代器在最大努力的基础上抛出ConcurrentModificationException。因此,期望依赖于这个异常编写正确的程序是不恰当的:迭代器的快速失败行为应该只用于检测bug。...当然, HashMap也有很多特性值得思考,JDK7并发环境循环引用问题, 链表转红黑树的性能提升, hash算法过程的图解等等,后面也会继续拓展补充。

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

面渣逆袭:Java集合连环三十问

为什么最ArrayList不直接序列化元素数组呢? 出于效率的考虑,数组可能长度100,但实际只用了50,剩下的50不用其实不用序列化,这样可以提高序列化和反序列化的效率,还可以节省内存空间。...原理:迭代器在遍历时直接访问集合的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化,就会改变modCount的值。...原理:由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程对原集合所作的修改并不能被迭代器检测到,所以不会触发Concurrent Modification Exception。...⽐传了17,我应该找到的是32。...扩容rehash:扩容的时候 1.7 需要对原数组的元素进行重新 hash 定位在新数组的位置,1.8 采用更简单的判断逻辑,不需要重新通过哈希函数计算位置,新的位置不变或索引 + 新增容量大小。

64420

Java基础面试题&知识点总结(上篇)

Object 类在 Java 是什么样的存在?为何在 Java ,所有的类都会继承自 Object 类? 问题 2. Object 类有哪些主要的方法?每个方法的作用是什么? 问题 3....Object 类在 Java 是什么样的存在?为何在 Java ,所有的类都会继承自 Object 类? 解答:Object 类在 Java 中被视为所有类的基础和起点。...这是因为在 Java 集合框架,特别是哈希表相关的数据结构( HashMap、HashSet 等)在存储和检索元素时,会使用到对象的 hashCode() 方法。...但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能提高哈希表的性能。...当一个对象被序列化时,JVM 会将该对象的类信息、类的签名以及非静态和非瞬态字段的值写入到一个输出流。这个过程是自动的,不需要程序员进行任何特殊处理。

27210

用 Go 构建一个区块链 -- Part 3: 持久化和命令行接口

选择数据库 目前,我们的区块链实现里面并没有用到数据库,而是在每次运行程序时,简单地将区块链存储在内存。那么一旦程序退出,所有的内容就都消失了。...数据库结构 在开始实现持久化的逻辑之前,我们首先需要决定到底要如何在数据库中进行存储。...序列化 上面提到,在 BoltDB ,值只能是 []byte 类型,但是我们想要存储 Block 结构。所以,我们需要使用 encoding/gob 来对这些结构进行序列化。...然后,我们初始化一个 gob encoder 并对 block 进行编码,结果作为一个字节数组返回。 接下来,我们需要一个解序列化的函数,它会接受一个字节数组作为输入,并返回一个 Block....*bolt.DB } 每当要对链的块进行迭代时,我们就会创建一个迭代器,里面存储了当前迭代的块哈希(currentHash)和数据库的连接(db)。

43720

hashmap和hashtable的区别,说法错误的是_javamap的用法

图中,紫色部分即代表哈希表,也称为哈希数组数组的每个元素都是一个单链表的头节点,链表是用来解决冲突的,如果不同的key映射到了数组的同一位置处,就将其放入单链表。...这两个参数是影响HashMap性能的重要参数,其中容量表示哈希槽的数量(即哈希数组的长度),初始容量是创建哈希表时的容量(从构造函数可以看出,如果不指明,则默认为16),加载因子是哈希表在其容量自动增加之前可以达到多满的一种尺度...,当哈希的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 resize 操作(即扩容)。...Hashtable也是JDK1.0引入的类,是线程安全的,能用于多线程环境。 Hashtable同样实现了Serializable接口,它支持序列化,实现了Cloneable接口,能被克隆。...发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

32820

Flutter 性能优化的一些路径思考

其实这个问题,我们内部也有发现,但是出于优先级的考虑,性能优化的需求一直没有排到迭代,但是产品运营陆陆续续有接到用户反馈使用体验的问题,我们才把这个需求往前提,在需求评审和技术讨论后有一些实现路径结论...1、巧用链表(LinkedList)如果我们需要在列表查找元素,那么使用哈希集(HashSet)会比使用列表(List)更高效。...因为在哈希集中查找元素的时间复杂度是O(1),而在列表查找元素的时间复杂度是O(n)。...此外,我们在技术讨论的时候也发现,从图片缓存、JSON序列化、反序列化和拓展工具也可以实现。在Flutter,可以使用缓存来提高应用的性能。...有些操作, JSON 序列化和反序列化,如果直接使用 Dart 的核心库进行操作,可能会影响应用的性能。

49120

Redis Hash(Hash) 复习

介绍 哈希相当于一个二维数组,内部是无序字典。 哈希也是是一个 string 类型的 field(字段) 和 value(值) 的映射表,所以哈希特别适合用于存储对象。...应用场景 Hash也可以同于对象存储,比如存储用户信息,与字符串不一样的是,字符串是需要将对象进行序列化(比如json序列化)之后才能保存,而Hash则可以讲用户对象的每个字段单独存储,这样就能节省序列化和反序列的时间...数据结构 哈希数组 + 链表二维结构。第一维 hash 的数组位置碰撞时,就会将碰撞的元素使用链表串接起来。....] # key 名称 field 第二维数组索引 # 如果哈希表不存在,则创建,存在即覆盖 # 新建字段,设置成功,返回 1 。...Redis 6.0 以上版本 SCAN COUNT参数需要多次迭代遍历,而HSCAN COUNT 不需要多次迭代遍历,只需要设置迭代次数则可以全部迭代 SCAN COUNT 需要如下遍历 遍历结果如

1.6K30

java各种集合类区别

:底层使用链表结构,增删速度快,查询稍慢; ArrayList与Vector的区别: 1.如果集合的元素数量大于当前集合数组的长度时,Vector的增长率是目前数组长度的100%,而ArryaList...要求:要求存在在哈希的对象元素都得覆盖equals和hashCode方法。...HashMap:哈希表的实现原理,先采用一个数组表示位桶,每个位桶的实现在1.8之前都是使用链表,但当每个位桶的数据较多的时候,链表查询的效率就会不高,因此在1.8之后,当位桶的数据超过阈值(8)的时候...,就会采用红黑树来存储该位桶的数据(在阈值之前还是使用链表来进行存储),所以,哈希表的实现包括数组+链表+红黑树,在使用哈希表的集合我们都认为他们的增删改查操作的时间复杂度都是O(1)的,不过常数项很大...它的iterator 方法返回的迭代器是fail-fastl的。 HashTable:Hashtable继承Map接口,实现一个key-value映射的哈希表。

51020

Java知识面试题复习(六)集合容器概述

它减少了程序设计的辛劳。 集合框架通过提供有用的数据结构和算法使你能集中注意力于你的程序的重要部分上,而不是为了让程序能正常运转而将注意力于低层设计上。...Map HashMap: JDK1.8之前HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突).JDK1.8以后在解决哈希冲突时有了较大的变化...HashTable: 数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的 TreeMap: 红黑树(自平衡的排序二叉树) 哪些集合类是线程安全的?...我们可以从一个 Collection 中使用迭代器方法来获取迭代器实例。迭代器取代了 Java 集合框架的 Enumeration,迭代器允许调用者在迭代过程移除元素。...() 方法序列化 ArrayList 的非 transient 元素,然后遍历 elementData,只序列化已存入的元素,这样既加快了序列化的速度,又减小了序列化之后的文件大小。

63030

HashMap 源码解析

简介 HashMap 最早出现在 JDK 1.2,底层基于散列算法实现。HashMap 允许 null 键和 null 值,在计算哈键的哈希值时,null 键哈希值为 0。...HashMap通过hash方法计算key的哈希码,然后通过(n-1)&hash公式(n为数组长度)得到key在数组存放的下标。...当两个key在数组存放的下标一致时,数据将以链表的方式存储(哈希冲突,哈希碰撞)。...数组容量的大小在创建的时候就确定了,所谓的扩容指的是重新创建一个指定容量的数组,然后将旧值复制到新的数组里。扩容这个过程非常耗时,会影响程序性能。...所以在HashXXX类HashTable,HashSet,LinkedHashMap等等),我们可以看到,这些类用于存储数据的字段都用transient修饰,并且都自定义了readObject/writeObject

64011

Java Map 集合类简介

第一种方法(忽略创建数组所需的时间)表明,使用已从 toArray 调用创建的数组迭代元素的速度要比使用 Iterator 的速度大约快 30%-60%。...但如果将使用 toArray 方法创建数组的开销包含在内,则使用 Iterator 实际上要快 10%-20%。因此,如果由于某种原因要创建一个集合元素的数组而非迭代这些元素,则应使用该数组迭代元素。...在 Java 基于哈希的 Map 哈希函数将对象转换为一个适合内部数组的整数。您不必为寻找一个易于使用的哈希函数而大伤脑筋: 每个对象都包含一个返回整数值的 hashCode() 方法。...调整 Map 实现的大小 在哈希术语,内部数组的每个位置称作“存储桶”(bucket),而可用的存储桶数(即内部数组的大小)称作容量 (capacity)。...这将使您的应用程序容易崩溃(一种要确定和跟踪的最糟糕的错误)。但如果默认为同步,则将因随之而来的可怕性能而序列化执行多线程应用程序。看起来,我们需要某种决策树来帮助我们正确选择。

1.6K30

教你打造最简比特币之持久化

开发环境:Go语言 本教程是学习Jeiwan的博客后的学习笔记,代码实现也参考它的为主,精简了叙述并在适当位置添加了一些必备的小知识和适当的代码注释,介绍哈希。...需要注意的一个事情是,Bolt 数据库没有数据类型:键和值都是字节数组(byte array)。因此,对于一些Go语言的结构化数据struct,我们使用标准库encoding/gob来做转换。...创建区块链的算法如下: 打开一个数据库文件 检查文件里面是否已经存储了一个区块链 如果已经存储了一个区块链: 创建一个新的 Blockchain 实例 设置 Blockchain 实例的 tip 为数据库存储的最后一个块的哈希...因此我们要用迭代器来,逐个逐个的从数据库取数据。...控制台 如果你希望便利的通过控制台直接指挥程序做事,可以通过Go语言的标准库flag实现。

87560

CopyOnWriteArrayList 是如何保证线程安全的?

在读的过程,如果数据被其他线程修改,是无法实时感知到最新的数据变化的; 缺点 2 - 有内存压力: 在写操作需要复制原数组,在复制的过程内存会同时存在两个数组对象(只是引用,数组元素的对象还是只有一份...与 ArrayList 类似,CopyOnWriteArraySet 也重写了 JDK 序列化的逻辑,只把 elements 数组中有效元素的部分序列化,而不会序列化整个数组。...,并没有使用哈希思想。...“弱数据一致性的” 的,迭代器会持有 “底层数组” 的引用,而 CopyOnWriteArrayList 的写入操作是写入到新数组,因此迭代器是无法感知到的; 5、CopyOnWriteArraySet...是基于 CopyOnWriteArrayList 动态数组的,并没有使用哈希思想。

94620

Python 文件处理

通过将字段包含在双引号,可确保字段的分隔符只是作为变量值的一部分,不参与分割字段(...,"Hello, world",...)。...CSV读取器提供了一个可以在for循环中使用的迭代器接口。迭代器将下一条记录作为一个字符串字段列表返回。...例如,将复数存储为两个double类型的数字组成的数组,将集合存储为一个由集合的各项所组成的数组。 将复杂数据存储到JSON文件的操作称为JSON序列化,相应的反向操作则称为JSON反序列化。...Python通过json模块的函数,实现JSON序列化和反序列化。...Python对象 备注: 把多个对象存储在一个JSON文件是一种错误的做法,但如果已有的文件包含多个对象,则可将其以文本的方式读入,进而将文本转换为对象数组(在文本各个对象之间添加方括号和逗号分隔符

7.1K30

面霸篇:Java 核心集合容器全解(核心卷二)

它减少了程序设计的辛劳。 集合框架通过提供有用的数据结构和算法使你能集中注意力于你的程序的重要部分上,而不是为了让程序能正常运转而将注意力于低层设计上。...原因:迭代器在遍历时直接访问集合的内容,并且在遍历过程中使用一个 modCount 变量。 集合在被遍历期间如果内容发生变化,就会改变 modCount 的值。...我们可以从一个 Collection 中使用迭代器方法来获取迭代器实例。 迭代器取代了 Java 集合框架的 Enumeration,迭代器允许调用者在迭代过程移除元素。...transient 的作用是说不希望 elementData 数组序列化。...每次序列化时,先调用 defaultWriteObject()方法序列化 ArrayList的非 transient元素,然后遍历 elementData,只序列化已存入的元素,这样既加快了序列化的速度

35021

java 基础

我们知道,对于集合list,map类,我们都可以通过迭代器来遍历,而Iterator其实只是一个接口,具体的实现还是要看具体的集合类的内部类去实现Iterator并实现相关方法。...JDK对hashCode()方法的作用,以及实现时的注意事项做了说明: 1)hashCode()在哈希起作用,java.util.HashMap。...hashCode()的作用 总的来说,hashCode()在哈希起作用,HashSet、HashMap等。...当我们向哈希表(HashSet、HashMap等)添加对象object时,首先调用hashCode()方法计算object的哈希码,通过哈希码可以直接定位object在哈希的位置(一般是哈希码对哈希表大小取余...如果两个对象equals()相等,则它们在哈希表(HashSet、HashMap等)只应该出现一次;如果hashCode()不相等,那么它们会被散列到哈希表的不同位置,哈希表中出现了不止一次。

81900

二刷二叉树,你也可以总结这些!

可以和字符串联系起来进行“子树的序列化和反序列化”,lc652 寻找重复的子树,如何判断两个子树是一样的呢,就可以将当前节点和它的子树序列化成字符串,用set和map进行存储和查找。...可以和哈希表联系起来,只要是将二叉树转换成其他数据结构表示(数组,字符串),用于查找和计数时,就会用到哈希。 可以和栈,队列联系起来。...前后序的迭代遍历就是用栈实现的,栈更像是“递归函数”的细节过程,在用递归遍历时,我们甚至只想当前节点如何操作就行。...105,106 前序 + 序构造和序 + 后序构造。...难点在于如何在递归函数数组的起始index和终点index,前序特点是起始位置是root,后序特点是最后的位置是root,他们是负责找到root,而序的作用是以root为分界线,确定出左右两个子树

34920
领券