前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Unsafe获取数组某个特定下标的内容

使用Unsafe获取数组某个特定下标的内容

作者头像
gzq大数据
发布2022-05-11 11:43:46
8410
发布2022-05-11 11:43:46
举报
文章被收录于专栏:大数据那些事大数据那些事

看ForkJoin源码的时候,发现了一个有趣的用法,在每一个WorkQueue里面都有一个array来存放任务,如果要取一个具体的任务,首先这个array的长度一定是2的次幂,这时候就可以用unsafe里的arrayBaseOffset获取到第一个元素的偏移地址,然后和arrayIndexScale(获取数组里每一个元素的大小)联合使用便可以获得某一个下标的具体位置:

代码语言:javascript
复制
long i = (((a.length - 1) & b) << ASHIFT) + ABASE;

这里((a.length - 1) & b)就是下标索引,大家可以试试如果保证a.length是2的次幂,b是某个具体下标,这样的操作就是下标索引,ASHIFT其实就是2的几次方,ASHIFT是通过如下算法算出来的:

代码语言:javascript
复制
ASHIFT = 31 - Integer.numberOfLeadingZeros(scale);

这样如果是4,算出来的就是2,*4和左移2是一样的效果。最后再加上ABASE即可。 当然我们也可以通过:

代码语言:javascript
复制
long i = ABASE+scale*b(具体下标)

但是大佬们一般都喜欢用位运算的方式使代码更快。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-04-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档