stringbuild和stringbuffer的区别_string和stringbuilder的区别

stringbuild和stringbuffer的区别_string和stringbuilder的区别JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据.这个String类提供了数值不可改变的字符串.而这个StringBuffer类提供的字符串进行修改.当你知道字符数据要改变的时候你就可以使用 StringBuffer.典型地,你可以使用 StringBuffers来动态构造字符数据.一、String的使用方法:

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

    JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据.这个String类提供了数值不可改变的字符串.而这个StringBuffer类提供的字符串进行修改.当你知道字符数据要改变的时候你就可以使用 StringBuffer.典型地,你可以使用 StringBuffers来动态构造字符数据.


一、String的使用方法:

        1. 首先String不属于8种基本数据类型,String是一个对象.
       因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性.

    2. new String()和new String(“”)都是申明一个新的空字符串,是空串不是null;

   3.  String str=”java”;   和  String str=new String (“java”);的区别:
        3.1 String str=”java”

<pre name="code" class="java"><span style="font-size:18px;">
public class Test {
	 public static void  main(String [] args) {   
		  String s0="java";
          String s1="java";
          String s2="ja" + "va";
          
          System.out.println( s0==s1 );
          System.out.println( s0==s2 );
	 }
}
</span>

结果为:

    true
    true
   首先,我们要知道Java会确保一个字符串常量只有一个拷贝.

    因为例子中的s0和s1中的”java”都是字符串常量,它们在编译期就被确定了,所以s0==s1为true;而”ja”和”va”也都是字符串常量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量,所以s2也同样在编译期就被解析为一个字符串常量,所以s2也是常量池中”java”的一个引用.

    所以我们得出s0==s1==s2;
    3.2 String str=new String (“java”)

<span style="font-size:18px;">
public class Test {
	 public static void  main(String [] args) {   
		    String s0="java";
		    String s1=new String("java");
		    String s2="ja" + new String("va");

		    System.out.println( s0==s1 );
		    System.out.println( s0==s2 );
		    System.out.println( s1==s2 );
	 }
}
</span>

结果为:

    false
    false
    false



 用new String() 创建的字符串不是常量,不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,它们有自己的地址空间.
3.2例子中s0还是常量池中”java”的应用,s1因为无法在编译期确定,所以是运行时创建的新对象”java”的引用,s2因为有后半部分new String(“va”)所以也无法在编译期确定,所以也是一个新创建对象”java”的应用;明白了这些也就知道为何得出此结果了.

4.   关于equals()和==:
    这个对于String简单来说就是比较两字符串的Unicode序列是否相当,如果相等返回true;而==是比较两字符串的地址是否相同,也就是是否是同一个字符串的引用。

二、Java StringBuffer的使用方法:


         1.java.lang.StringBuffer代表可变的字符序列;

    2.StringBuffer和String类似,但StringBuffer可以对其字符串进行改变;

    3.StringBuffer类的常见构造方法:

    StringBuffer()

    创建一个不包含字符序列的”空”的StringBuffer对象;

    StringBuffer(String str)

    创建一个StringBuffer对象,包含与String对象str相同的字符序列.

    4.常用方法:

    public StringBuffer append()

    可以为该StringBuffer对象添加字符序列,返回添加后的该StringBuffer对象引用;

    public StringBuffer insert()

    可以为该StringBuffer对象在指定位置插入字符序列,返回修改后的该

三、String 与StringBuffer的区别

1. String:在String类中没有用来改变已有字符串中的某个字符的方法,由于不能改变一个java字符串中的某个单独字符,所以在JDK文档中称String类的对象是不可改变的。然而,不可改变的字符串具有一个很大的优点:编译器可以把字符串设为共享的。

2.StringBuffer:StringBuffer类属于一种辅助类,可预先分配指定长度的内存块建立一个字符串缓冲区。

这样使用StringBuffer类的append方法追加字符 比 String使用 + 操作符添加字符 到 一个已经存在的字符串后面有效率得多。

因为使用 + 操作符每一次将字符添加到一个字符串中去时,字符串对象都需要寻找一个新的内存空间来容纳更大的字符串,这无凝是一个非常消耗时间的操作。添加多个字符也就意味着要一次又一次的对字符串重新分配内存。使用StringBuffer类就避免了这个问题.

 3.String 字符串常量
  StringBuffer 字符串变量(线程安全)
 简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象,

因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,

然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,

因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。

 而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。

所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。

而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的:
 String S1 = “This is only a” + “ simple” + “ test”;

StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);

你会很惊讶的发现,生成 String S1 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。

其实这是 JVM 的一个把戏,在 JVM 眼里,这个 String S1 = “This is only a” + “ simple” + “test”;

其实就是: String S1 = “This is only a simple test”; 所以当然不需要太多的时间了。

但大家这里要注意的是,如果你的字符串是来自另外的 String 对象的话,速度就没那么快了,

譬如:String S2 = “This is only a”;

String S3 = “ simple”;

String S4 = “ test”;

String S1 = S2 +S3 + S4;

这时候 JVM 会规规矩矩的按照原来的方式去做。


4.String和StringBuffer的例子
<span style="font-size:18px;">
public class Test {  
    public static void stringReplace(String text) {  
        //把textString的地址copy给text 
    	//在这个类中相当于又新new出一个text的对象,新对象text指向java
        //text.replace('j', 'i');的结果是"iava"   
        text = text.replace('j', 'i');  
        //输出结果为新对象中的值iava
        System.out.println (text); 
    }  
  
    public static void bufferReplace(StringBuffer text) {  
        //textBuffer的地址copy给text  
        //然后沿着text指向的字符串(其实也就是textBuffer指向的对象)操作,添加一个"C"  
    	//与原对象操作的是同一块内存区域
        text = text.append("C");  
        //输出结果为是原来对象改变后的值javac
        System.out.println (text); 
    }  
  
    public static void main(String args[]) {  
        String textString = new String("java");  
        StringBuffer textBuffer = new StringBuffer("java");  
  
        stringReplace(textString);  
        bufferReplace(textBuffer);  
  
        System.out.println(textString + textBuffer);  
    }  
}
</span>



输出: 
iava 

javaC
javajavaC 



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/191061.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号