java中循环外定义变量与循环内定义变量占用内存与效率问题?
本帖最后由 Inflexible_lin 于 2013-01-15 09:53:29 编辑 当数据量很大时,即内层循环次数达到百万级以上时,是按现在这样定义变量好呢?
还是把变量定义放到图中蓝色部分???
请大师帮忙解答一下,个人觉得是目前这样定义比较好!
Sheet sh = null; //sheet
Row row0 = null; //每个sheet的标题
Row row = null;//具体的行变量,避免多次定义
Cell cell = null;//单元格变量,避免多次定义
for(int i=0;i< sheet_num;i++){
sh = wb.createSheet();
row0 = sh.createRow(0);
//生成每个sheet的title
for(int cellNum = 0,colLength =colTitles.length; cellNum < colLength; cellNum ++) {
cell = row0.createCell(cellNum);
cell.setCellValue(colTitles[cellNum]);
cell.setCellStyle(createStyle(wb));
}
//每个SHEET有最多100万行数据
for(int rowNum = 1; rowNum <= maxSheetRowNum; rowNum++) {
if(!rs.next()){
break;
}
//System.out.println(rowNum);
row = sh.createRow(rowNum);
for(int cellNum = 0,colLength =colTitles.length; cellNum < colLength; cellNum ++) {
cell = row.createCell(cellNum);
cell.setCellValue(rs.getString(cellNum + 1));
}
//每当行数达到设置的值就刷新数据到硬盘,以清理内存
if(rowNum % rowAccess == 0){
((SXSSFSheet)sh).flushRows();
}
}
//最后不足100条时写入
((SXSSFSheet)sh).flushRows();
} java 内存
[解决办法]
我个人也习惯用红色部分,毕竟少了很多次的申请空间,入栈和出栈的操作
不过,自己在编程的时候要注意不让上一次的结果影响到下一次循环
比如上一次 a = 3, 当下一次循环在给a赋值的时候出了错误,而你捕获了错误
缺没修正a的值,程序继续执行,那么这时候a=3还成立,可能就会有问题了,
如果是每次都定义,那就不存在这样的问题。
[解决办法]
循环外好,避免重复分配栈空间。
[解决办法]
我想这个问题你自己就能回答的。。
这个问题你自己也感觉到了哪个好的。。
有时候放在内部循环是为了条件需要而已。
比如百万调用以后之后还需要在调用一遍百万级的数据,还需要上一次的参数,那这样就只能放在循环内了。
[解决办法]
仅是作用域不一样,栈中的空间在编译这个代码的时候大小就确定下来了,运行这个方法时空间就已经分配好了,不要想当然的以为声明一次就要分配一次空间,那是c语言,java可以重用这些超出作用域的空间
只要用javap查看方法字节码,看看使用的局部变量表的大小和使用方式即知
[解决办法]
java这种基于虚拟机的语言,是跟单纯的C不同,C语言的原则是相信程序员能做好一切,因此它不会帮你做多少事情,需要考虑代码优化,内存占用等。
而java中的原则就是:要写好的代码而不是快的代码
[解决办法]
java有垃圾回收的,一般情况下不用关注这个,除非有大量的缓存存在,需要考虑管理缓存,不让堆空间过大。。