如何使用java的变量?
如果在java里频繁存取变量,那么就需要考虑从何处存取这些变量?变量是 static 变量,还是堆栈变量,或者是类的实例变量?变量的存储位置对存取它的代码的性能有明显的影响?例如,请考虑下面这段代码:
class StackVars{private int instVar;private static int staticVar;//存取堆栈变量void stackAccess(int val){int j=0;for (int i=0; i<val; i++)j += 1;}//存取类的实例变量void instanceAccess(int val){for (int i=0; i<val; i++)instVar += 1;} //存取类的 static 变量void staticAccess(int val){for (int i=0; i<val; i++)staticVar += 1;}} Method void stackAccess(int) 0 iconst_0 //将 0 压入堆栈。 1 istore_2 //弹出 0 并将它存储在局部分变量表中索引为 2 的位置 (j)。 2 iconst_0 //压入 0。 3 istore_3 //弹出 0 并将它存储在局部变量表中索引为 3 的位置 (i)。 4 goto 13//跳至位置 13。 7 iinc 2 1 //将存储在索引 2 处的 j 加 1。10 iinc 3 1 //将存储在索引 3 处的 i 加 1。13 iload_3//压入索引 3 处的值 (i)。14 iload_1//压入索引 1 处的值 (val)。15 if_icmplt 7//弹出 i 和 val。如果 i 小于 val,则跳至位置 7。18 return //返回调用方法。Method void instanceAccess(int) 0 iconst_0 //将 0 压入堆栈。 1 istore_2 //弹出 0 并将它存储在局部变量表中索引为 2 的位置 (i)。 2 goto 18//跳至位置 18。 5 aload_0//压入索引 0 (this)。 6 dup//复制堆栈顶的值并将它压入。 7 getfield #19 <Field int instVar>//弹出 this 对象引用并压入 instVar 的值。10 iconst_1 //压入 1。11 iadd //弹出栈顶的两个值,并压入它们的和。12 putfield #19 <Field int instVar>//弹出栈顶的两个值并将和存储在 instVar 中。15 iinc 2 1 //将存储在索引 2 处的 i 加 1。18 iload_2//压入索引 2 处的值 (i)。19 iload_1//压入索引 1 处的值 (val)。20 if_icmplt 5//弹出 i 和 val。如果 i 小于 val,则跳至位置 5。23 return //返回调用方法。Method void staticAccess(int) 0 iconst_0 //将 0 压入堆栈。 1 istore_2 //弹出 0 并将它存储在局部变量表中索引为 2 的位置 (i)。 2 goto 16//跳至位置 16。 5 getstatic #25 <Field int staticVar>//将常数存储池中 staticVar 的值压入堆栈。 8 iconst_1 //压入 1。 9 iadd //弹出栈顶的两个值,并压入它们的和。10 putstatic #25 <Field int staticVar>//弹出和的值并将它存储在 staticVar 中。13 iinc 2 1 //将存储在索引 2 处的 i 加 1。16 iload_2//压入索引 2 处的值 (i)。17 iload_1//压入索引 1 处的值 (val)。18 if_icmplt 5//弹出 i 和 val。如果 i 小于 val,则跳至位置 5。21 return //返回调用方法。
class StackVars{//与前面相同...void instanceAccess(int val){int j = instVar;for (int i=0; i<val; i++)j += 1;instVar = j;}void staticAccess(int val){int j = staticVar;for (int i=0; i<val; i++)j += 1;staticVar = j;}}