黑马程序员技术交流社区
标题:
关于内存缓存的一些疑问.
[打印本页]
作者:
Stay
时间:
2014-6-13 14:58
标题:
关于内存缓存的一些疑问.
在做黑马的基础测试题之后,我拿给了一个朋友检查,虽然说是完成了,但是他跟我说可以更优化一些,但是他是从国外学的java,他讲的术语什么的都是中英参半的表达,我完全听不懂。其中有一点就是我这个代码的内存问题,他说我这个代码每次执行都会产生新内存地址还是什么来的。如果频繁执行而虚拟机没及时清除会导致内存不够用之类的(因为他中英参半的表达我也没太搞懂他说的是什么,半猜的)。请问是会产生这类型的问题吗?如何解决?
//从键盘接受字符串。并进行大小写转换。
public class Test8 {
public static void main(String[] agrs)throws IOException{
//获取键盘录入对象并转换成字符流对象并进行缓冲区操作。
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String str = null;
//使用循环建立持续使用功能
while((str=in.readLine())!=null){
//当输入over时结束跳出循环
if("over".equals(str))
break;
//建立方法进行大小写的转换
String upStr = str.toUpperCase();
String lowStr = str.toLowerCase();
//创建字符串缓冲区容纳转换后的字符串
StringBuilder sb = new StringBuilder(str.length());
//从字符串的0角标开始检索,如果字符是大写则转换为小写,否则转换为大写
for(int i=0;i<str.length();i++){
if(str.charAt(i) == upStr.charAt(i))
sb.append(lowStr.charAt(i));
else
sb.append(upStr.charAt(i));
}
//输出转换后的字符串
System.out.println(sb);
}
in.close();//关闭流
}
}
作者:
lzy418
时间:
2014-6-14 17:16
String upStr = str.toUpperCase();
String lowStr = str.toLowerCase();
StringBuilder sb = new StringBuilder(str.length());
你的这三句语句时用于创建容器的,将其放在的循环体内,
每循环一次就会创建实例声明,就是会不断建立引用。
不过java拥有垃圾回收机制,每次循环结束都会回收内存,
所以你的问题并不是多次声明导致栈区爆棚(引用在内存中
占用实在是太小了),而是每次都建立变量和引用带来的性
能问题,效率会低于修改内容。
但是,由于将临时变量定义在循环体外会出现
变量声明周期变长,
回收时间推后以及变量被其他函数调用而导致数据损坏等更加严重的
隐性bug的危险,所以java本身推荐将临时变量定义在循环体内。
作者:
Wokno
时间:
2014-6-14 20:00
路过看看。。。。。。。。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2