深入理解JAVA字符串:String、StringBuilder、StringBuffer

一、JAVA之String对象

  • 首先我们先看下String类的源码:
    public final class String
     它是被final修饰的,因此String对象是一个不可变类**
    即其地址是不可以改变的**。
  • 不可变体现在如下代码
String str="a";
str=str+"b";
  • 疑问:该对象不也是可变的吗?我们不妨打印出该对象的两次hascode来看一下
        String str="a";
        System.out.println(str.hashCode());//结果:97
        str=str+"b";
        System.out.println(str.hashCode());//结果:3105
  • 同样的一个字符串为什么hashcode会不一样?看下面的框图大家就明白了!
     这里首先简单介绍一下JAVA的三个分区:
    1. 栈区:用来存储局部变量、操作数、方法出口等,原则:先进后出,特点:连续内存空间,线程私有。
    2. 堆区:存储创建好的对象和数组,特点:所有线程共享,不连续,速度慢。
    3. 方法区(静态区):存储类、常量相关信息(唯一不变的内容)比如静态变量。字符串常量等!特点:只有一个方法区,且共享!


      内存分析
  • 可以看到其实并不是在原有的对象上面改变,而是重新开辟了一段空间对原有的对象进行复制,然后改变,从而和类定义的final不可变性对应上了。

二、JAVA之StringBuilder对象

  • 首先我们先看下StringBuilder类的源码:
    public final class StringBuilder
     同样他也是一个不可变的对象,但是其内部提供了可以修改字符串的append方法。(注意:是地址不可变,并不是里面的内容不可变)
  • 我们来对比StringBuilder和String对象的执行效率,看如下代码
public static void stringTest() {
        long time=System.currentTimeMillis();
        String str="";
        for(int i=0;i<10000;i++) {
            str=str+i;
        }
        System.out.println("耗时:"+(System.currentTimeMillis()-time)+"ms");
    }
    public static void StrBuilTest() {
        long time=System.currentTimeMillis();
        StringBuilder str=new StringBuilder();
        for(int i=0;i<10000;i++) {
            str=str.append(i);
        }
        System.out.println("耗时:"+(System.currentTimeMillis()-time)+"ms");
    }
  • 结果分别是98ms和0ms
  • 可以看到StringBuilder的效率是很高的,这个也可以从内存分析来考虑
    -本质:String的操作实际上是一个不断创建并回收对象的过程,因此在运行速度上很慢

三、JAVA之StringBuffer对象

  • 首先我们先看下StringBuffer类的append源码:
 @Override
    public synchronized StringBuffer append(Object obj) {
        toStringCache = null;
        super.append(String.valueOf(obj));
        return this;
    }
  • StringBuffer对象的append被synchronized修饰,所以是线程安全的,因此其效率应该是低一点,但是还是要高于String。除此之外都与StringBuilder一样。

总结

  • String:适用于少量的字符串操作。
  • StringBuilder:适用于单线程下在字符串缓冲区进行大量操作。
  • StringBuffer:适用于多线程下在字符串缓冲区进行大量操作。

参考文献:https://blog.csdn.net/qushaming/article/details/82971901

你可能感兴趣的:(深入理解JAVA字符串:String、StringBuilder、StringBuffer)