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

一.实验目的

  1. 掌握String类和StringBuffer类等常用类;
  2. 掌握各常用类的实际运用方法。

二.实验内容及要求

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

  1. 编写两个方法strCopy1和strCopy2,分别用String 类和StringBuffer类实现字符串的拷贝操作。
  2. 在主类的main()方法中分别调用stuCopy1和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 中的注释去掉,结果如下

Java实验九,String类和StringBuffer类实现字符串拷贝,并比较二者效率_第1张图片
Java实验九,String类和StringBuffer类实现字符串拷贝,并比较二者效率_第2张图片
由运行结果可知,String类对象s所存储的字符序列的引用值随着s的修改而变化,而StringBuffer类对象Sbuffer存储的引用值只有一个(创建时得到)从未改变。所以,String类对象代表的值是常量,而StringBuffer类对象所代表的值不是常量,可以在原基础上修改。

四.实验中的问题及心得

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

  1. String在修改时不会改变对象自身
    在每次对String类型进行改变的时候其实都等同于生成了一个新的String对象,然后将指针指向新的String对象,所以经常改变内容的字符串最好不要用String。
  2. StringBuffer在修改时会改变对象自身
    每次结果都会对StringBuffer对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在字符串对象经常改变的情况下推荐使用StringBuffer。因此,用StringBuffer实现的 strCpy2比用String实现的strCpy1效率高

你可能感兴趣的:(Java)