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 



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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C#代码集

    C#代码集C#入门代码示例记录一、示例静态计算工具类1publicstaticclassCalculator2{3publicstaticdoubleAdd(doublea,doub

    2022年7月1日
    38
  • GIMP教程 4 图层「建议收藏」

    GIMP教程 4 图层「建议收藏」图层可以说是现代制图软件的精髓,也是最根本地区别于纸质制图的地方。GIMP呼出图层窗口的方法也很简单点击【窗口—-可停靠对话框—-图层】或者直接使用快捷键ctrl+L 便可呼出图层窗口剩下的,就跟所有其它制图软件一样了。还有问题可联系作者(QQ616057653)进行交流。…

    2022年6月14日
    33
  • 如何删除sqlserver实例_sql server删除表

    如何删除sqlserver实例_sql server删除表在网上找到下面几种方法,本人使用的是第一种,很实用。1.删除SQLServer的特定实例若要删除SQLServer的某个特定实例,请按照以下步骤操作:找到并删除%drive%:\\ProgramFiles\\MicrosoftSQLServer\\MSSQL\\Binn文件夹,其中%drive%是要删除的SQLServer实例的位置。找到以下注册表项:HKEY…

    2022年10月2日
    2
  • ubuntu更新源

    ubuntu更新源1.备份原始源文件source.list打开终端,输入:sudocp/etc/apt/sources.list/etc/apt/sources.list.bak2.修改源文件1.继续输入:

    2022年7月4日
    20
  • er图是什么样的_er图形状代表什么意思

    er图是什么样的_er图形状代表什么意思数据模型(DataModel)是数据特征的抽象。数据模型所描述的内容包括三个部分(三个要素):数据结构、数据操作、数据约束。数据模型分为两类:第一类和第二类。第一类就是概念模型,ER图就是概念模型的一种表示方法。ER图:实体-关系图。是用来描述现实世界的一种概念模型。包括三个要素:实体(矩形)、属性(椭圆)、关系(菱形)。关系要标明类型:1对多、1对1、多对多等关系。第二类包括逻辑…

    2022年9月22日
    1
  • google搜索方法_搜索引擎小技巧

    google搜索方法_搜索引擎小技巧原文地址:https://www.imooc.com/article/4071列举几个常用的技巧,日常够用。1.使用双引号包含关键词,实现准确完全匹配搜索例如:“李白”“李荣浩”“k8s”2.使用减号排除搜索结果例如:“狗”-泰迪(搜索狗,但是排除泰迪关键词)3.同义词搜索例如:“南信大~大学”4.逻辑搜索例如:“南信…

    2025年10月19日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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