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;
}