Java 为什么在StringLatin1实用程序类的hashCode方法中使用额外的var2字节数组?

Java 为什么在StringLatin1实用程序类的hashCode方法中使用额外的var2字节数组?,java,java-11,Java,Java 11,目前的代码是: public static int hashCode(byte[] value) { int h = 0; byte[] var2 = value; int var3 = value.length; for(int var4 = 0; var4 < var3; ++var4) { byte v = var2[var4]; h = 31 * h + (v & 255); } retur

目前的代码是:

public static int hashCode(byte[] value) {
    int h = 0;
    byte[] var2 = value;
    int var3 = value.length;

    for(int var4 = 0; var4 < var3; ++var4) {
        byte v = var2[var4];
        h = 31 * h + (v & 255);
    }

    return h;
}
公共静态int hashCode(字节[]值){
int h=0;
字节[]var2=值;
int var3=value.length;
for(int var4=0;var4
可能的代码是:

public static int hashCode(byte[] value) {
    int h = 0;
    int var2 = value.length;

    for(int var3 = 0; var3 < var2; ++var3) {
        byte v = value[var3];
        h = 31 * h + (v & 255);
    }

    return h;
}
公共静态int hashCode(字节[]值){
int h=0;
int var2=value.length;
对于(int var3=0;var3
java.lang
包中,有一个名为
StringLatin1
的实用程序类。此类具有
hashCode
方法,如果当前字符串值为拉丁语,则将从
String
类的
hashCode
方法调用该方法


注:我使用Java11。

无论您发布的当前代码是什么,都不是真正的代码;反编译代码可能因反编译程序而异,因此您不能依赖它

这是for each循环的标准模式

当你写作时

for(Type variable: expression) {
    // body
}
表达式
将在循环开始时精确计算一次,并在整个循环中记住生成的集合或数组引用。这也意味着,如果
expression
是一个变量,并且该变量被分配到循环体中,那么它对正在进行的循环没有影响

报告说:

  • 否则,表达式必须具有数组类型,
    T[]

    L1
    Lm
    是紧跟在增强的
    for
    语句前面的标签序列(可能为空)

    增强的
    for
    语句相当于基本的
    for
    语句,格式如下:

    T[] #a = Expression;
    L1: L2: ... Lm:
    for (int #i = 0; #i < #a.length; #i++) {
        {VariableModifier} TargetType Identifier = #a[#i];
        Statement
    }
    

    你会认出翻译的
    var2
    var3
    var4
    都是合成变量。注意事项:

    • 原则上,编译器可以分析场景以识别
      value
      是未在循环体中赋值的局部变量,因此此处不需要额外的变量。但是,与遵循标准翻译策略相比,节省的成本不值得实施额外的逻辑
    • 同样,编译器决定是否记住另一个局部变量中的不变数组大小。如上所示,规范没有强制要求它

    您可以说,反编译器的一个弱点是无法识别for each循环并将其翻译回,但是,当试图将编译后的代码映射到源代码结构时,通常会出现歧义,因为存在许多变体来生成相同的代码。

    在那里我可以得到真实的代码。您能提供github上开源存储库的链接吗?请检查。您还可以检查@SeydazimovNurbol OpenJDK项目是否使用Mercurial:。以下是JDK 11的
    StringLatin1
    :。此外,JDK通常附带一个
    src.zip
    文件,其中包含许多Java源文件(但不包含任何本机源文件)。@GitHub上的SeydazimovNurbol只读镜像:。我可以找到关于贡献的信息:为什么不先检查一下JDK文件夹中的
    lib/src.zip
    public static int hashCode(byte[] value) {
        int h = 0;
        byte[] var2 = value;
        int var3 = value.length;
    
        for(int var4 = 0; var4 < var3; ++var4) {
            byte v = var2[var4];
            h = 31 * h + (v & 255);
        }
    
        return h;
    }
    
    public static int hashCode(byte[] value) {
        int h = 0;
        for (byte v : value) {
            h = 31 * h + (v & 0xff);
        }
        return h;
    }