Java 使用局部变量保存全局变量的目的是什么?

Java 使用局部变量保存全局变量的目的是什么?,java,string,global-variables,local-variables,Java,String,Global Variables,Local Variables,我看了一下这个方法的源代码。这是6-b14中的实现,已经更改 public int hashCode() { int h = hash; if (h == 0) { int off = offset; char val[] = value; int len = count; for (int i = 0; i < len; i++) {

我看了一下这个方法的源代码。这是
6-b14
中的实现,已经更改

public int hashCode() {
        int h = hash;
        if (h == 0) {
            int off = offset;
            char val[] = value;
            int len = count;

            for (int i = 0; i < len; i++) {
                h = 31*h + val[off++];
            }
            hash = h;
        }
        return h;
}
public int hashCode(){
int h=散列;
如果(h==0){
int off=偏移量;
char val[]=值;
int len=计数;
对于(int i=0;i
我的问题是关于这一行:

int len=计数

其中,
count
是一个全局变量,表示字符串的字符数


为什么局部变量
len
用于循环条件,而不是全局变量本身?因为没有对变量的操作,只有读取。如果全局字段用于读取或写入局部变量,那么使用局部变量是否只是一种良好的做法?如果答案是“是”,为什么还要阅读?

如果可以修改
计数,则需要一个局部变量。如果正在进行多线程处理,则需要一个局部变量。创建局部变量是最安全的。然而,这并不是绝对必要的

在这种情况下,这太过分了,因为字符串无论如何都是不可变的。count的值甚至不能更改

它几乎毫无用处,这就是为什么在Java 8中它看起来像这样:

public int hashCode() {
    int h = hash;
    if (h == 0 && value.length > 0) {
        char val[] = value;

        for (int i = 0; i < value.length; i++) {
            h = 31 * h + val[i];
        }
        hash = h;
    }
    return h;
}
public int hashCode(){
int h=散列;
如果(h==0&&value.length>0){
char val[]=值;
for(int i=0;i
它们甚至不再有count,而是使用
value.length
,其中
value
是最后一个字符数组

他们正在做
char val[]=value
,但这只是一个参考,完全没有必要


使用局部变量可能会有一些细微的微增强,或者可能是为了可读性,但这不是必需的(我认为可读性较差)。

访问局部变量比访问实例变量快。新的Java8代码(参见Anubian的答案)也考虑到了这一点。这就是为什么他们使用局部变量
h
进行哈希计算,而不直接访问实例变量
This.hash
并创建局部指针
char val[]=value。但考虑到这一点,我不知道他们为什么不使用
I
或更好的
z=val.length;i在for循环中,但
i

在String类中,我发现了一条注释,该注释与读取
的方法中对局部变量的奇怪赋值有关,即“避免getfield操作码”

公共字符串修剪(){
int len=value.length;
int st=0;
char[]val=value;/*避免getfield操作码*/

while((st6b-14
。这是个问题……)
s/global/instance/g
在这种情况下,可能纯粹是为了可读性?
count
听起来很模糊,
len
几乎总是指数组或字符串的长度。@MDeSchaepmeester我觉得仅仅因为更好的名称而使用额外的变量是不对的。但是如果没有同步,局部变量e在多线程中无论如何都是无用的。@SteveBenett我同意,它是无用的,这就是为什么他们放弃了它。然后问题是,为什么他们有
char val[]=value
?@JohnFarrelly这完全是不必要的。它只是一个引用……o.0“访问局部变量比访问实例变量快”真的吗?你怎么知道的?性能是一个很好的观点,但正如你提到的,实现似乎不是真正的观点。你在性能优化方面是正确的。我选择了MicSim的答案,因为它更完整。感谢你挖掘源评论和链接。
public String trim() {
    int len = value.length;
    int st = 0;
    char[] val = value;    /* avoid getfield opcode */

    while ((st < len) && (val[st] <= ' ')) {
        st++;
    }
    while ((st < len) && (val[len - 1] <= ' ')) {
        len--;
    }
    return ((st > 0) || (len < value.length)) ? substring(st, len) : this;
}