Java 使用逐位操作或数字文字初始化值是否更快?

Java 使用逐位操作或数字文字初始化值是否更快?,java,hashmap,bitwise-operators,bit-shift,Java,Hashmap,Bitwise Operators,Bit Shift,我正在浏览HashMap的源代码。我看到了类似的东西 static final int DEFAULT\u INITIAL\u CAPACITY=1从速度的角度来看,这可能不是一个优势。但是,看起来HashMap的容量总是2的幂(即使在构造函数中指定容量也会导致调用集合。rounduppoweroftwo(容量)),因此从速度的角度来看,以1的形式表示它可能不是一个优势。但是,看起来HashMap的容量始终是2的幂(即使在构造函数中指定容量,也会导致调用集合。roundUpToPowerOfTw

我正在浏览HashMap的源代码。我看到了类似的东西
static final int DEFAULT\u INITIAL\u CAPACITY=1从速度的角度来看,这可能不是一个优势。但是,看起来HashMap的
容量总是2的幂(即使在构造函数中指定容量也会导致调用
集合。rounduppoweroftwo(容量)
),因此从速度的角度来看,以
1的形式表示它可能不是一个优势。但是,看起来HashMap的
容量始终是2的幂(即使在构造函数中指定容量,也会导致调用
集合。roundUpToPowerOfTwo(容量)
),因此以
1的形式记下它,正如您自己所想,字节码对于常数16或1是相同的,正如你自己所想,字节码对于常数16或1是相同的,信不信由你,它实际上是关于可读性的。信不信由你,这个表达实际上是关于可读性的。下面的表达式
1是对问题中描述的三种初始化方法的定时测试

public static void main(String[] args) {
    
    long time = System.currentTimeMillis();
    int test = 0;
    for(int i = 0; i < 100000; i++){
        test = 16;
    }
    
    System.out.println((System.currentTimeMillis() - time) + " : " + test);
    
    time = System.currentTimeMillis();
    int test2 = 0;
    for(int i = 0; i < 100000; i++){
        test2 = 1 << 4;
    }
    
    System.out.println((System.currentTimeMillis() - time) + " : " + test2);
    
    time = System.currentTimeMillis();
    int test3 = 0;
    for(int i = 0; i < 100000; i++){
        test3 = 0x10;
    }
    
    System.out.println((System.currentTimeMillis() - time) + " : " + test3);
}
publicstaticvoidmain(字符串[]args){
长时间=System.currentTimeMillis();
int检验=0;
对于(int i=0;i<100000;i++){
试验=16;
}
System.out.println((System.currentTimeMillis()-time)+“:”+test);
时间=System.currentTimeMillis();
int test2=0;
对于(int i=0;i<100000;i++){

test2=1下面是对问题中描述的三种初始化方法的定时测试

public static void main(String[] args) {
    
    long time = System.currentTimeMillis();
    int test = 0;
    for(int i = 0; i < 100000; i++){
        test = 16;
    }
    
    System.out.println((System.currentTimeMillis() - time) + " : " + test);
    
    time = System.currentTimeMillis();
    int test2 = 0;
    for(int i = 0; i < 100000; i++){
        test2 = 1 << 4;
    }
    
    System.out.println((System.currentTimeMillis() - time) + " : " + test2);
    
    time = System.currentTimeMillis();
    int test3 = 0;
    for(int i = 0; i < 100000; i++){
        test3 = 0x10;
    }
    
    System.out.println((System.currentTimeMillis() - time) + " : " + test3);
}
publicstaticvoidmain(字符串[]args){
长时间=System.currentTimeMillis();
int检验=0;
对于(int i=0;i<100000;i++){
试验=16;
}
System.out.println((System.currentTimeMillis()-time)+“:”+test);
时间=System.currentTimeMillis();
int test2=0;
对于(int i=0;i<100000;i++){

test2=1基本上移位运算符用于处理位,并且比处理其他运算符(如+,-

范例- 要将两个数相乘,CPU将在内部执行相乘,用加法和减法替换相乘,它只不过是移位和对位执行and、OR、NOT等操作

因此,如果你直接在位上工作,这意味着你在做大量处理后必须由CPU完成的工作

另见:

基本上,移位运算符用于处理位,并且比处理其他运算符(如+,-

范例- 要将两个数相乘,CPU将在内部执行相乘,用加法和减法替换相乘,它只不过是移位和对位执行and、OR、NOT等操作

因此,如果你直接在位上工作,这意味着你在做大量处理后必须由CPU完成的工作

另见:

看起来您已经回答了自己的问题。是的,位操作是快速的。如果位操作更快或更快,大多数语言中的编译器都会在编译时解析涉及常量的操作。因此,这样的语句在执行时间上决不重要。在这种情况下,由于编译器的选择,这并不重要IMIAlizations。看起来您已经回答了自己的问题。是的,位操作是快速的。如果位操作更快或更快,大多数语言中的编译器都会在编译时解析涉及常量的操作。因此,就执行时间而言,这样的语句永远不会有问题。在这种情况下,由于compiler优化。你是对的,
按位
运算比标准的
算术
运算快得多。但OP不是问
算术
按位
运算。他似乎是问
按位
运算与数值文字值之间的差异。我有一个问题还提供了更多解释的链接。@languidQuidYeah,提供资源链接很好,但是你的答案的核心是关于
按位
算术
运算之间的差异。也许你应该重新表述答案的内容,以便更好地解决所问的问题?你是对的
按位
运算比标准的
算术
运算快得多。但OP并不是问
算术
按位
运算。他似乎是问
按位
运算与数值文字值之间的区别。我还提供了一个链接以获得更多解释还有。@languidQuidYeah,提供到资源的链接是很好的,但是你的答案的核心是关于
按位
算术
运算之间的差异。也许你应该重新表述答案的内容,以便更好地解决所问的问题?你的结论是正确的,但你的基准测试只是c我完全支持这一点。微基准点是一个敏感的主题;有许多因素可能会破坏相对结果。此外,我要明确的是,我并不是说每次操作的执行时间总是精确到2ms。为了考虑单毫秒尺度下的继承基准可变性,我将+/-5ms作为基准点我已经运行了几次测试,从未得到超过7ms的结果,经常得到0ms的结果。有几次结果都是2ms,我用粗略的平均值来表示它们大致相同。考虑到它们是编译时间常数,这不会增强这一点的有效性吗?基准测试有很多缺陷;对于您甚至不能将最简单的假设视为理所当然(例如,相同的循环根据包含范围的不同而执行不同的操作)
public static void main(String[] args) {
    
    long time = System.currentTimeMillis();
    int test = 0;
    for(int i = 0; i < 100000; i++){
        test = 16;
    }
    
    System.out.println((System.currentTimeMillis() - time) + " : " + test);
    
    time = System.currentTimeMillis();
    int test2 = 0;
    for(int i = 0; i < 100000; i++){
        test2 = 1 << 4;
    }
    
    System.out.println((System.currentTimeMillis() - time) + " : " + test2);
    
    time = System.currentTimeMillis();
    int test3 = 0;
    for(int i = 0; i < 100000; i++){
        test3 = 0x10;
    }
    
    System.out.println((System.currentTimeMillis() - time) + " : " + test3);
}