本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2024-11(3)

String、StringBuild、StringBuffer

发布于2020-11-19 20:52     阅读(483)     评论(0)     点赞(23)     收藏(5)


String、StringBuild、StringBuffer

  String、StringBuild、StringBuffer在java中都是可以操作字符串的对象,让我们来看看它们之间的区别和联系。

从结构分析

  从结构上来看,它们都是final类,并且都是用char数组来存储内容的,不过StringBuild、StringBuffer没有用final和private来修饰这个数组。
  StringBuild、StringBuffer都是继承AbstractStringBuilder,但StringBuffer为了解决线程安全问题,在对应的方法加上了关键字。

从线程是否安全分析

  从线程安全方面来讲,String是不可变的,所以是线程安全的,因为多个线程调用String的方法都会去产生一个新的String,不会改变最初的内容。(之前我总是认为String做拼接的时候,是线程不安全的,所以String是线程不安全的,其实他指的线程安全并不是这个意思,因为拼接已经不是原子操作了,它只是指Sring调String的方法不会发生线程安全问题。)
  StringBuild是非线程安全的,StringBuild也是用char数组去存储的,它其中某些方法是直接去操作这个数组的,比如append方法所以在多线程情况下是不安全的。
  StringBuffer是线程安全的,虽然StringBuffer和StringBuild方法和属性几乎一样、都是继承AbstractStringBuilder。但是StringBuffer的方法有synchronize修饰。

String和StringBuild

  String对象用“+”去拼接时,其实是使用了StringBuild对象。`

 public static void main(String[] args)  {
       String a="mihou";
       String b="tao";
       String c=a+b;
    }

在这里插入图片描述  上面是测试代码和对应的字节码。我们可以看到字节码中,先初始化了两个String对象,然后再新建了一个StringBuild对象,再调用了StringBuild的append方法,将两个String对象拼接进去,然后返回StringBuild的toString。

public String toString() {
        // Create a copy, don't share the array
        return new String(value, 0, count);
    }

  StringBuild的toString是返回一个String对象。
  String c=“mihou”+“tao”,这个语句是没有创建StringBuild对象的,因为前面我们讲了必须是一个String对象使用了“+”,而“mihou”+“tao”其实只在常量池里面创建了“mihoutao”这一个对象,如果说“mihou”或者“tao”是String对象的话,就会创建StringBuild。那怎么去验证没有创建“mihou”对象呢?这里有两种办法,一种是去看字节码。
在这里插入图片描述
  这里我们可以看到只初始化了一个“mihoutao”。
  还有一种办法是使用intern方法,jdk至少1.7。

public static void main(String[] args) {
       String a="mihou"+"tao";
       String b=new String("mi")+new String("hou");
       System.out.println(b.intern()==b);
    }

  这里输出是true,刚好证明了常量池中没有"mihou"对象。

从效率分析

  上面我们讲了String在拼接时底层使用了Stringbuild,所以在这种拼接的时候效率是一样的,不过在循环中拼接就会循环创建Stringbuild,这时效率就会低些。而用Stringbuild可以把对象创建在循环外,避免这种情况。
  String中的方法,每次对产生新的对象,而Stringbuild是在原来的基础上修改,所以String的开销大些。
  Stringbuild和StringBuffer的差别在于StringBuffer要加锁,释放锁。主要的开销大小区别就在这里,所以Stringbuild的效率高。
  综上所述,Stringbuild的效率总体来说是高于String和StringBuffer。String和StringBuffer的效率就要具体分析了,主要是看锁消耗和频繁创建对象哪个开销大。

原文链接:https://blog.csdn.net/bangemihoutao/article/details/109683572



所属网站分类: 技术文章 > 博客

作者:java战神

链接:http://www.javaheidong.com/blog/article/786/72373460691cfbf29048/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

23 0
收藏该文
已收藏

评论内容:(最多支持255个字符)