[英]Where to declare a variable (Java)
我现在正在使用Java Swing制作GUI,并且正在进行一些代码重构。
我的问题是:就内存/效率而言,在何处声明变量类型是否重要? 码:
for (int i = 0; i < 7; i++) {
JTextField textfield = new JTextField(5);
// Do stuff with textfield
VS:
JTextField textfield;
for (int i = 0; i < 7; i++) {
textfield = new JTextField(5);
// Do stuff with textfield
最佳做法是仅在需要时才创建变量。 因此,如果您不需要循环外的变量,那么最好只在循环内声明和初始化(即您提到的前一种情况)
如果仅在循环内需要它,则在内部声明它。 循环完成后,文本字段将可用于垃圾回收。
这样,您可以尽快将对象提供给垃圾收集。
第一种方法更安全-如果在分配变量时存在一些更复杂的逻辑(例如,在一组条件或一个开关中),而您没有在分支之一中进行设置,则编译器会告诉您。 使用第二种方法时,这样的编程错误将导致先前迭代中的值留在变量中-甚至可能需要很长时间才能检测到。
尽管我同意所有答案,但我相信OP在内存使用/效率方面提出了要求。 老实说,我认为这实际上取决于您要在for循环中尝试进行的工作。 但这可以通过快速测试轻松确定:
Runtime runtime = Runtime.getRuntime();
long start = System.currentTimeMillis();
for (int i = 0; i < 7; i++) {
String textfield1 = "test1";
}
long stop = System.currentTimeMillis();
long memory = runtime.totalMemory() - runtime.freeMemory();
System.out.println("Test 1 time: " + (start - stop) + " millisecond");
System.out.println("Test 1 memory used: " + memory + " bytes");
runtime = Runtime.getRuntime();
start = System.currentTimeMillis();
String textfield2;
for (int i = 0; i < 7; i++) {
textfield2 = "test2";
}
stop = System.currentTimeMillis();
System.out.println("Test 2 time: " + (start - stop) + " millisecond");
System.out.println("Test 2 memory used: " + memory + " bytes");
输出:
Test 1 time: 0 millisecond
Test 1 memory used: 3963816 bytes
Test 2 time: 0 millisecond
Test 2 memory used: 3963816 bytes
结论:对于小型程序,这无关紧要。 如果循环很大,或者它是一个嵌套循环,那么在进行一些繁重的工作时可能会有所不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.