当前位置: 首页 > 面试题库 >

为什么使用1 << 4而不是16?

仰英发
2023-03-14
问题内容

的OpenJDK代码java.util.HashMap包括以下行:

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

为什么1 << 4在这里使用,而不是16?我很好奇。


问题答案:

要强调的是,数字是2的幂,而不是一个完全任意的选择。因此,它警告开发人员尝试不同的数字,他们应该在模式中使用其他数字(例如1 << 31 << 5,而不是20),这样他们就不会破坏依赖于两个要求的幂的方法。有评论略高于:

/**
 * The default initial capacity - MUST be a power of two.
 */
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

任何java.util.HashMap一个的html" target="_blank">容量(表长度)始终是2的幂。之所以这样设计,是因为它允许使用快速的按位AND操作(&)将每个键的哈希码包装到表的长度范围内,就像访问表的方法一样:

final Node<K,V> getNode(int hash, Object key) {
    Node<K,V>[] tab; Node<K,V> first, e; int n; K k;
    if ((tab = table) != null && (n = tab.length) > 0 &&
        (first = tab[(n - 1) & hash]) != null) { /// <-- bitwise 'AND' here
        ...

那里n是容量,并(n - 1) & hash包装哈希值以适合该范围,为该哈希选择表的适当存储区。

(如果n不是2的幂,则公式将需要为Math.abs(hash % n),使用取模运算符计算除以后的余数n,再加上一个额外的步骤来处理负哈希值。这会起作用,但会更慢。请想象一个示例用 十进制表示
,其中您具有一些任意的哈希值193,498,212,表的任意长度为1,234;虽然193498212 % 1234碰巧是842,但表长度恰好是
10的 幂,结果193498212 % 1000为212,最后3位数字,在 二进制 ,的功率 2
是一个1随后一些号码0的,所以类似的招是可能的。)




 类似资料:
  • 很多人问了此问题,说bzero已经被posix-2008废弃,为何还使用bzero。选择bzero而不是memset,有2个原因: bzero有2个参数,指针和长度,很明确就是将制定size的内存初始化为0。而memset有3个参数,需要记忆参数的位置,有不少人经常把长度和初始化值搞错。 bzero比memset的可读性要好。memset可以制定初始化的值,实际上绝大多数情况都是0。 一旦新版本g

  • 问题内容: 我不确定为什么列出项目时为什么需要使用ul-li而不是简单地使用div。我可以使两者看起来完全一样,因此与创建div相比,创建无序列表的功能优势在哪里? 问题答案: 为了语义正确。HTML具有表达事物列表的功能,它可以帮助Google机器人,屏幕阅读器以及所有不仅仅关心网站外观的用户更好地了解您的内容。

  • 我花了很多时间来解决这个问题。我是GRAILS和GROOVY中的begginer。我有一个名为“tms\u dev”的旧oracle数据库模式。此架构有一些表(例如checktypes表)。此外,我还有由GRAILS生成的域类Checktype和ChecktypesController类-controller。 此类具有列表方法: def列表(最大整数){ } 我还配置了Datasource。gr

  • 问题内容: 我想知道为什么Arrays类的sort方法要求一个Object []类型的参数。为什么参数不是Comparable []类型。如果不传递Comparable [],它将生成ClassCastException。 为什么… public static void sort(Object [] a) 而不是 public static void sort(Comparable [] a) ?

  • 问题内容: 我已经在Android代码中使用FloatBuffers一段时间了(从一些opengles教程中复制了它),但是我无法确切地理解此构造是什么以及为什么需要它。 例如,我在许多人的代码和android教程中看到了以下代码(或类似代码): 就我所知,这似乎是冗长和混乱的,我只是说它们只是一个浮点数的包装而已。 问题: 与任何其他类型的float集合或简单数组相反,这种类型的类(ByteBu