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的
:。此外,JDK通常附带一个StringLatin1
文件,其中包含许多Java源文件(但不包含任何本机源文件)。@GitHub上的SeydazimovNurbol只读镜像:。我可以找到关于贡献的信息:为什么不先检查一下JDK文件夹中的src.zip
?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; }
- 原则上,编译器可以分析场景以识别