Redis(四):整数集合,java电话面试技巧

  • 同理,如果为INTSET_ENC_INT32和INTSET_ENC_INT64,就对应为32位和64位

  • 整个数组的字节大小,要通过length属性和encoding属性来计算,比如length值为5,encoding值为int16_t,那么总的字节大小为5*16=80。

下面看一种特殊情况

在这里插入图片描述

这是一个encoding属性为INTSET_ENC_INT64的,所以数组是储存64位的元素的数组,但里面除了第一个元素外,其他都不需要这么大的位数,不过根据整数集合的升级规则,当向一个底层位int16_t数组的整数集合中添加一个int64_t类型的整数值时,整数集合已有的所有元素都会被转换成int64_t类型。

升级

当我们要将一个新元素添加到底层数组时,会先比较新元素的位数是否满足,如果新元素的类型比整数集合现有所有的元素都要长时,整数集合需要先进行升级,然后才能将新元素添加到整数集合里面。

升级步骤总共有3个步骤

  • 根据新元素的类型,将整数集合的底层数组进行扩展,并为新元素分配空间

  • 将整数集合的底层数组里面的所有元素类型都变为新类型,并将类型转换后的元素放置到正确的位上(要按从小到大的顺序),而且在放置过程中,要维持有序性

  • 将新元素添加到底层数组里(也要维持有序性),一般这个放在最后,因为新元素是高位,所以都会比原有的低位元素要大

举个栗子来表示一下

在这里插入图片描述

比如这个集合里面有3个元素,是一个int16_t的数组,现在要添加一个 2 31 2^{31} 231的数据,因为这个是一个31位的数据,所以要对数据进行升级

首先第一步,根据新类型,对底层数组进行扩展,并为新元素分配空间,即为数组进行空间重分配,这里插入的是31位数据,然后分配后的空间为 32 ∗ ( l e n g t h + 1 ) = 32 ∗ 4 = 127 32*(length+1)=32*4=127 32∗(length+1)=32∗4=127,重新分配后的数组如下

在这里插入图片描述此时,改变旧元素的类型,变成32位,旧元素有3个,即是32*3=96位(此时不管后面的新分配空间),此时一个索引位置所占的空间大小也要从16变成32位,然后进行对旧数据转移,比如旧数据3排第三位,应该放在索引2的位置上,也就是64~95位处

在这里插入图片描述

同理旧元素2的索引位置为1,在32位~63位的空间内,旧元素1的索引位置为0,在0 ~ 31位上

完成这些后,才会对新插入的数据进行空间分配,分配到96~127位处

在这里插入图片描述

最后,程序将整数集合的encoding属性从INTSET_ENC_INT16改为INTSET_ENC_LNT32,并将length属性的值从3改为4,至此,升级完成。

关于时间复杂度

是要遍历整数集合将元素进行升级,所以向集合中添加元素的时间复杂度为 O ( N ) O(N) O(N)。

关于元素摆放位置

引发升级的元素都是比所有元素长度大的,因为高位,所以要就大于所有元素,要么小于所有元素(针对插入的是负数情况),所以就分为下面两种情况进行

  • 在新元素小于所有元素的情况下,新元素会被放置在底层数组的最开头处(索引0)

  • 在新元素大于所有现有元素的情况下,新元素会被放置在底层数组的最末尾处,索引值为length-1

升级的好处

升级的策略有两个好处,一个是提升整数集合的灵活性,另一个是尽可能地节约内存。

提升灵活性

整数集合可以通过自动升级底层数组来适应元素,可以随意地添加16位、32位、64位的元素,避免了类型错误。

节约内存

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

最后

现在其实从大厂招聘需求可见,在招聘要求上有高并发经验优先,包括很多朋友之前都是做传统行业或者外包项目,一直在小公司,技术搞的比较简单,没有怎么搞过分布式系统,但是现在互联网公司一般都是做分布式系统。

所以说,如果你想进大厂,想脱离传统行业,这些技术知识都是你必备的,下面自己手打了一份Java并发体系思维导图,希望对你有所帮助。

现在互联网公司一般都是做分布式系统。

所以说,如果你想进大厂,想脱离传统行业,这些技术知识都是你必备的,下面自己手打了一份Java并发体系思维导图,希望对你有所帮助。

[外链图片转存中…(img-gYoCSYy5-1710737607890)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 12
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值