Java实验九,String类和StringBuffer类实现字符串拷贝,并比较二者效率

一. 实验目的

1. 掌握String类和StringBuffer类等常用类;

2. 掌握各常用类的实际运用方法。

二. 实验内容及要求

编写一个Java程序,实现以下功能:

1. 编写两个方法strCopy1和strCopy2,分别用String类和StringBuffer类实现字符串的拷贝操作。

2. 在主类的main()方法中分别调用strCopy1和strCopy2完成字符串的拷贝操作,并比较二者的执行效率。

三. 实验过程及结果

public class StringCopy {
	/**
	 * @param str:待复制字符串
	 * @return:复制后的字符串
	 * 实现过程:1.创建空对象s
	 * 		    2.将str(String类型)中的字符逐个复制到s
	 */
	static String strCopy1(String str){
		String s = "";

		for (int i = 0; i < str.length(); i++) {
			s += str.charAt(i);
			/**
			 * 输出String对象 s 所存储的引用
			 * System.out.println(i + ". " + Integer.toHexString(s.hashCode()));
			 */
		}

		return s;
	}
	
	/**
	 * @param str:待复制字符串
	 * @return:复制后的字符串
	 * 实现过程:1.创建空对象sBuffer
	 * 		    2.将str(String类型)中的字符逐个复制到sBuffer
	 */
	static StringBuffer strCopy2(String str){
		StringBuffer sBuffer = new StringBuffer();

		for (int i = 0; i < str.length(); i++) {
			sBuffer.append(str.charAt(i));
			/**
			 * 输出StringBuffer对象 sBuffer 所存储的引用
			 * System.out.println(i + ". " + Integer.toHexString(sBuffer.hashCode()));
			 */
		}

		return sBuffer;
	}

	public static void main(String[] args) {
		String sTest = "A string that is used to test";//待复制字符串
		
		long startTime = System.nanoTime();//获取函数执行前时间
		String s1 = StringCopy.strCopy1(sTest);
		long endTime = System.nanoTime();//获取函数执行后时间
		long time1 = endTime - startTime;//获取函数strCopy1耗时
		System.out.println("String@strCpy1 耗时:" + time1 + " 纳秒; " + s1);
		
		startTime = System.nanoTime();//获取函数执行前时间
		StringBuffer sb2 = StringCopy.strCopy2(sTest);
		endTime = System.nanoTime();//获取函数执行后时间
		long time2 = endTime - startTime;//获取函数strCopy2耗时
		System.out.println("StringBuffer@strCopy2 耗时:" + time2 + " 纳秒; " + sb2);
	}
}

在这里插入图片描述

将方法strCpy1 和 strCpy2 中的注释去掉,结果如下

在这里插入图片描述
在这里插入图片描述

以上截图省略了 1 ~ 19,由图可知,String类对象s所存储的字符序列的引用值随着s的修改而变化,而StringBuffer类对象Sbuffer存储的引用值只有一个(创建时得到)从未改变。当然了,上述方法执行的时间还包括了 Integer.toHexString(*.hashCode()) 的执行时间,此举只是为了说明String类对象代表的值是常量,而StringBuffer类对象所代表的值不是常量,可以在原基础上修改。

四. 实验中的问题及心得

String 类是常量,它们的值在创建之后不能更改。StringBuffer类支持可变的字符串

1. String在修改时不会改变对象自身

在每次对String类型进行改变的时候其实都等同于生成了一个新的String对象,然后将指针指向新的String对象,所以经常改变内容的字符串最好不要用 String 。

2. StringBuffer在修改时会改变对象自身

每次结果都会对 StringBuffer对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在字符串对象经常改变的情况下推荐使用 StringBuffer。

因此,用StringBuffer实现的strCpy2比用String实现的strCpy1效率高。

猜你喜欢

转载自blog.csdn.net/weixin_42250302/article/details/89294461