拼接String对象的优化

package com.mfs.stringtest;

public class StringTest {
	private static String hello = "hello";
	private static String blank = " ";
	private static String world = "world";
	private static String over = "!";
	public static String addStrings1() {
		return hello + blank + world + over; 
	}
	public static String addStrings2() {
		StringBuilder sb = new StringBuilder();
		sb.append(hello);
		sb.append(blank);
		sb.append(world);
		sb.append(over);
		return sb.toString();
	}
	public static void main(String[] args) {
		System.out.println(addStrings1());
		System.out.println(addStrings2());
	}
}

我们都知道String对象是不可变得,也就是说我们对String对象的任何修改、添加和删除操作所得到的都是一个全新的string对象。那么上边代码的addStrings1()方法按照常理来说每执行一个“+”(拼接)就会重新返回一个新的String对象(早期的java却是是这样)。这样创建大量的String对象无疑是浪费了大量的资源的。所以后期的java就对此做出了优化。当我们写了如addStrings1()这样的程序是,java虚拟机会为我们的代码做自动的优化。大体优化成如addStrings2
()这样的代码形式。可以看到java的优化程序中自动的创建了StringBuilder对象,然后用此对象在调用append()方法拼接字符串,最后调用toString()方法去返回一个拼接好的String字符串对象。
事实上,在大多数情况下情况下这种java的自动优化是非常有效的,我们可以仍然按照我们的管用习惯去用“+”拼接字符串,让java虚拟机自动帮我们实现优化,可以说是美滋滋了。
但我们不妨考虑下面StringTest2中addStrings1()中在循环体中拼接字符串的情况,按照java虚拟机自动优化的方法,他会帮我们优化成addStrings2()方法所示的形式。仔细观察addStrings()的代码你会发现,每次循环他都会自动创建一个StringBuilder对象,那么这样一来跟每次创建一个String对象有什么区别呢?最终结果都是创建了大量的对象,根本达不到优化的目的。这个时候想要优化String字符串的拼接优化就需要我们显示的使用StringBuilder对象了,手动优化后的代码如addStrings3()方法所示。

在这里插入代码片package com.mfs.stringtest;

public class StringTest2 {
	private static String[] strs = { "hello", " ", "world", "!" };

	public static String addStrings1() {
		String str = "";
		for(int i = 0; i < strs.length; i ++ ) {
			str += strs[i];
		}
		return str;
	}
	public static String addStrings2() {
		String str = "";
		for(int i = 0; i < strs.length; i ++) {
			StringBuilder sb = new StringBuilder(str);
			sb.append(strs[i]);
			str = sb.toString();
		}
		return str;
	}
	public static String addStrings3() {
		StringBuilder sb = new StringBuilder();
		for(int i = 0; i < strs.length; i ++) {
			sb.append(strs[i]);
		}
		return sb.toString();
	}
	public static void main(String[] args) {
		System.out.println(addStrings1());
		System.out.println(addStrings2());
		System.out.println(addStrings3());
	}
}

发布了57 篇原创文章 · 获赞 55 · 访问量 1965

猜你喜欢

转载自blog.csdn.net/qq_40561126/article/details/103449673