小码哥杯java程序比赛复习(十)常用类(中)

一.StringBuilder类和StringBuffer类

    在第九节中我们讲过,String类是不可变类,即一旦一个String对象被创建后,包含在这个对象中的字符序列是不可改变的,直至这个这个对象被销毁。简单的说,就是String是不可变的对象,因此在每次对String类型进行改变的时候其实都等同于生成了一个新的String对象,然后将指针指向了新的String对象,所以经常改变内容的字符串最好不要用String,因为每次产生对象时都会对系统的性能产生影响,特别是当内存中无引用对象多了以后,JVM的GC就开始工作,那速度是一定会相当慢的。

    而StringBuffer和StringBuilder就不一样啦,StringBuffer对象代表一个字符序列可变的字符串,当一个StringBuffer被创建后,通过StringBuffer提供的方法可以改变这个字符串对象的字符序列。一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象。

    StringBuffer类创建的字符串每次都会对StringBuffer对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下都推荐使用StringBuffer,特别是字符串经常改变的情况下。而在某些情况下,String对象的字符串拼接其实是被JVM解释成了StringBuffer对象的拼接,所以这些时候String对象的速度并不会比StringBuffer对象慢,而特别是以下的字符串对象生成中,String效率是要远比StringBuffer快的:

 

例1:   

        String S1 ="This is a"+"fine"+"day";
    	StringBuffer Sb = new StringBuffer("This is a").append("fine").append("day");
      
    在这个例子中,String创建的对象S1的速度要远远快于StringBuffer创建的对象Sb,这是因为这个String创建时连结的字符串都是常量字符串,所以是对于指向同一个字符串所进行的改变,如果String S1连接的是另一个字符串变量的话,速度就没有这么快了。

    StringBuilder类也代表了字符串对象,实际上,StringBuilder和StringBuffer基本相似,两个类的构造器和方法基本相同。所不同的是,StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能,所以性能略高。因此在一般情况下,StringBuilder>StringBuffer>String;

    下面的例子创建了一个StringBuilder对象:

例2:

public class HelloWorld {
    public static void main(String[] args) {
      //创建一个空的StringBuilder对象
    	StringBuilder str1=new StringBuilder();
      // 创建一个StringBuilder对象,用来存储字符串
	    StringBuilder str2=new StringBuilder("爱JAVA");
    	System.out.println(str2);
	}
}

二.StringBuilder类的常用方法

   StringBuilder类提供了许多方法,具体参照API,这里只列出四种比较重要的:

   append(参数)  追加内容到当前StringBuilder对象的末尾;

   insert(位置,参数)  将内容插入到StringBuilder对象的指定位置;

   toString()  将StringBuilder对象转换为String对象

   length()  获取字符串的长度

   下面的例3中,创建了StringBuilder对象,用来存储字符串,并对其做了追加和插入操作。这些操作修改了str对象的值,而没有创建新的对象,这就是StringBuilder和String最大的区别:

例3:

public class HelloWorld {
    public static void main(String[] args) {
      // 创建一个StringBuilder对象,用来存储字符串
	  StringBuilder str=new StringBuilder("Hello");
      str.append("world");//在字符串后面追加字符串
      str.append(1111);//在字符串后面追加整数
      System.out.println("字符串长度:"+str.length());//字符串长度
      System.out.println("插入前: "+str);
      str.insert(10,"!");//在指定位置插入内容
      String str2 = str.toString();//转换为String对象
      System.out.println("插入后:"+str2);
	}
}

运行结果为:

字符串长度:14
插入前: Helloworld1111
插入后:Helloworld!1111


    最后再通过例4的练习来加深对StringBuffer和StringBuilder的理解:

例4:将一个由数字组成的字符串转换成指定格式--从右边开始每三个字母用逗号分隔的形式。

    

public class HelloWorld {
    public static void main(String[] args) {
    	// 创建一个空的StringBuilder对象
		StringBuilder str = new StringBuilder();
		// 追加字符串
		str.append("0123456");
		System.out.println("原来4在字符串中的位置:"+str.indexOf("4"));
		System.out.println("原来字符串的长度:"+str.length());
        // 从后往前每隔三位插入逗号
        for(int i = str.length()-3; i>0; i=i-3){
            str.insert(i,',');//第一次进行插入时,由于字符串中无此位置,不给予插入
        }
        System.out.println("插入后4在字符串中的位置:"+str.indexOf("4"));
        System.out.println("现在的字符串长度"+str.length());
	    // 将StringBuilder对象转换为String对象并输出
		System.out.print(str.toString());
	}
}

运行结果:

原来4在字符串中的位置:4
原来字符串的长度:7
插入后4在字符串中的位置:6
现在的字符串长度9
0,123,456


   至此,String类结束,其他Date类等明天总结,该高数时间了,明天见~



猜你喜欢

转载自blog.csdn.net/qq_29027865/article/details/52965382
今日推荐