有没有办法强制Java中的变量不存在?
基本上,我的目标是在处理完变量后,通过“删除”变量尽可能地提高效率,即使变量仍然在范围内。到目前为止,我一直在使用有没有办法强制Java中的变量不存在?,java,performance,variables,scope,Java,Performance,Variables,Scope,基本上,我的目标是在处理完变量后,通过“删除”变量尽可能地提高效率,即使变量仍然在范围内。到目前为止,我一直在使用if(true)手动创建定义变量生存期的作用域,但我正在寻找类似于var.close()的函数,该函数的唯一目的是使变量基本上超出作用域,不再为其保留内存位置 我在下面使用的示例显然可以使用for()来避开这个特定实例(任务希望我不要使用for()),但我关心的问题比用作索引的变量更广泛。 (忽略存在的任何其他逻辑/语法错误,因为我还没有校对) 有什么想法吗?创建一个更有限的范围很容
if(true)
手动创建定义变量生存期的作用域,但我正在寻找类似于var.close()
的函数,该函数的唯一目的是使变量基本上超出作用域,不再为其保留内存位置
我在下面使用的示例显然可以使用for()
来避开这个特定实例(任务希望我不要使用for()
),但我关心的问题比用作索引的变量更广泛。
(忽略存在的任何其他逻辑/语法错误,因为我还没有校对)
有什么想法吗?创建一个更有限的范围很容易。只需创建一个新块:
publicstaticvoidwhere(){
int a=5;//在方法结束之前一直存在
{
int b=5;//在外部块结束之前存在
{
int c=5;//在内部块结束之前存在
}
//c不再可用
}
//b已无法访问
}
出于以下几个原因,我建议不要这样做:
- 读书难,收获少
- 编译器或JIT并自动处理您尝试执行的操作
- 不能以这种方式重叠变量生存期(嵌套意味着嵌套最多的变量必须在嵌套较少的变量之前从堆栈中过期)
publicstaticvoidwhere(){
int a=5;//在方法结束之前一直存在
{
int b=5;//在外部块结束之前存在
{
int c=5;//在内部块结束之前存在
}
//c不再可用
}
//b已无法访问
}
出于以下几个原因,我建议不要这样做:
- 读书难,收获少
- 编译器或JIT并自动处理您尝试执行的操作
- 不能以这种方式重叠变量生存期(嵌套意味着嵌套最多的变量必须在嵌套较少的变量之前从堆栈中过期)
- 这正是作用域的用途。你不需要发明你自己的范围界定系统。任何变量都应该在尽可能小的封闭范围内声明。但这就是你需要做的。这是一个可见性原则,而不是效率原则,因为一个方法所需的所有堆栈都是在该方法的条目上分配的,而内部作用域并不以任何方式对应于字节码指令。这正是作用域的用途。你不需要发明你自己的范围界定系统。任何变量都应该在尽可能小的封闭范围内声明。但这就是你需要做的。这是一个可见性原则,而不是效率原则,因为一个方法所需的所有堆栈都是在该方法的条目上分配的,并且内部作用域不以任何方式与字节码指令相对应。注意:simple
{}
你到底为什么要这样做?整个想法都是错误的,是徒劳的。你不能通过“删除”变量来提高效率。@A.L.Strine这种事情实际上是完全无用的,你应该在学习的过程中忘记它。基本上,你在注意错误的事情。除非在非常罕见的情况下,少量的堆栈内存不会使程序更高效。大多数程序都很慢,因为它们做的事情太多(比如用jquery构建整个网页),或者做的操作需要很长时间(比如数据库查询或从服务器下载文件)。你的老师告诉你使用scope进行性能优化?这太可怕了……注意:简单的{}
也会创造出你到底为什么要这样做?整个想法都是错误的,是徒劳的。你不能通过“删除”变量来提高效率。@A.L.Strine这种事情实际上是完全无用的,你应该在学习的过程中忘记它。基本上,你在注意错误的事情。除非在非常罕见的情况下,少量的堆栈内存不会使程序更高效。大多数程序都很慢,因为它们做的事情太多(比如用jquery构建整个网页),或者做的操作需要很长时间(比如数据库查询或从服务器下载文件)。你的老师告诉你使用scope进行性能优化?这太可怕了……”编译器或JIT可以自动计算出变量的生存期,并自动处理您试图执行的操作“您使用了“can”这个词——在某些情况下它不会这样做吗?另外,谢谢,我不知道。一个大的情况是没有实施优化。另一种是无用的情况,比如一个方法在不调用其他方法的情况下很快就会结束(保存堆栈空间可能会有所帮助),所以它可以一直等到该方法结束,在该方法中,来自当前方法的所有堆栈分配的内容都会自动“删除”通过简单地将堆栈指针移回调用当前方法之前的位置,“编译器或JIT可以自动计算变量的生存期并自动处理您尝试执行的操作”您使用“can”这个词,在某些情况下它不会这样做吗?另外,谢谢,我不知道。一个大的情况是没有实施优化。另一种是无用的情况,比如一个方法在不调用其他方法的情况下很快就会结束(保存堆栈空间可能会有所帮助),所以它可以一直等到该方法结束,在该方法中,来自当前方法的所有堆栈分配的内容都会自动“删除”只需将堆栈指针移回当前方法被调用之前的位置
package root;
import javax.swing.JOptionPane;
public class DebugEight4
{
public static void main(String[] args)
{
String array[] = new String[100];
String entry = " ";
final String STOP = "/']";
StringBuffer message = new StringBuffer(
"The words in reverse order are:\n"
);
if(true)
/*
*forces x out of scope
* after while statement ends
*/
{
int x = 0;
while(!entry.equals(STOP))
{
entry = JOptionPane.showInputDialog(null,
"Enter another word\n" +
"Enter " + STOP + " when you want to stop");
if(!entry.equals(STOP) && x != 100)//prevents fragmentation error
{
array[x] = entry;
}
else
{
JOptionPane.showMessageDialog(null, "That\'s all! Let's see the results.");
}
++x;
}
}/* end x scoping if
* If the if(true) wasn't here, x would still exist!
*/
for(int y = array.length-1; y > 0; --y)
{
message.append(array[y]);
message.append("\n");
}
JOptionPane.showMessageDialog(null, message);
}
}