您的位置:首页 > Web前端

String对象和StringBuffer对象末尾追加元素空间效率问题

2015-11-16 22:19 459 查看
问题定义:使用String类和StringBuffer类分别定义两个对象,然后分别在对象的末尾添加10000个字符串。比较两者空间的使用情况。
使用freeMemory()方法和gc()方法比较String和StringBuffer对象在末尾追加元素的空间使用情况。
public class RuntimeDemo01{
	public static void main(String args[]){
		Runtime run = Runtime.getRuntime();
		System.out.println("maxMemory = " + run.maxMemory() + "M");//返回java虚拟机的最大内存容量
		System.out.println("freeMemory = " + run.freeMemory() + "M");//返回java虚拟机的空闲内存量
		String str = "hello ";//定义str对象
		for(int i = 0; i < 10000; ++i){
			str += "world ";//在str对象末尾追加一个字符串,此过程又从新开辟空间,耗费内存,也耗时
		}
		System.out.println("freeMemory = " + run.freeMemory()/1024 + "M");//返回此时空闲内存量
		run.gc();//进行垃圾回收
		System.out.println("freeMemory = " + run.freeMemory()/1024 + "M");//垃圾回收以后的空闲内存空间
	}
};
运行结果:
maxMemory = 65088M
freeMemory = 4846M
freeMemory = 2695M
freeMemory = 4803M[code]public class RuntimeDemo02{
public static void main(String args[]){
Runtime run = Runtime.getRuntime();
System.out.println("maxMemory = " + run.maxMemory() / 1024 + "M");//返回java虚拟机的最大内存容量
System.out.println("freeMemory = " + run.freeMemory() / 1024 + "M");//返回java虚拟机的空闲内存量
StringBuffer buf = new StringBuffer();//定义一个StringBuffer对象
buf.append("hello ");
for(int i = 0; i < 10000; ++i){
buf.append(" world");
}
System.out.println("freeMemory = " + run.freeMemory()/1024 + "M");
run.gc();
System.out.println("freeMemory = " + run.freeMemory()/1024 + "M");
}
};
运行结果:
maxMemory = 65088M
freeMemory = 4846M
freeMemory = 4562M
freeMemory = 4766M[/code]
分析:程序一和程序二在刚开始执行时,最大内存容量和空闲内存容量分别是65088M和4846M。当在String对象末尾追加10000字符串时,空闲内存容量为2695M,而在StringBuffer对象末尾追加10000个字符串时,空闲内存容量为4562M,两者空闲内存量差距明显,主要原因是:在String对象末尾追加字符串时,又重新开辟一个新的空间来存储新的字符串,而使用StringBuffer时,则不需要开辟新的空间,直接在末尾追加就可以。但是使用垃圾回收器对垃圾空间进行回收以后。发现程序一的空闲内存量要大于程序二的空闲内存量。因为使用StringBuffer有额外的空间开销。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: