美文网首页Java 杂谈
java String StringBuffer StringB

java String StringBuffer StringB

作者: TTRR | 来源:发表于2018-11-09 16:43 被阅读0次

    从String源码中可以看出,对于一个String对象,任何改变操作都不会改变原有的对象,而是生成新的对象 例如:

    String str = new String("hello");
    str = str+"world";
    

    在上述代码中首先 一个String对象str 进行了一个字符串相加,在这个过程中已经生成了一个新的String对象并把 引用指向str。

    在下面这段代码中

    String s = new String("abc");
    for(int i=0;i<10000;i++){
          s += "m";
    }
    

    在循环中会生成10000个String 对象。

    而StringBuilder则不会

    StringBuilder sb = new StringBuilder("abd");
    for(int i=0;i<10000;i++){
         sb.append("m");
    }
    

    则只是对之前new 的对象进行append。

    在这样的场景下,StringBuilder就比String高效

    但是在这样的场景下则不同

    String str = "hello"+"world";
    StringBuilder sb = new StringBuilder().append("hello").append("world")
    

    字符串相加的方式效率更高,因为在编译的时候就确定了值。
    所以在改动较少和简单的字符串相加的情况下就用 String
    在字符串相加较多的情况下就用StringBuilder。


    StringBuilder 和 StringBuffer的区别

    从源码中可以看出两者间的属性和方法大致一样,但是StringBuffer有一个特别的地方

        @Override
        public synchronized int length() {
            return count;
        }
    
        @Override
        public synchronized int capacity() {
            return value.length;
        }
    
    
        @Override
        public synchronized void ensureCapacity(int minimumCapacity) {
            super.ensureCapacity(minimumCapacity);
        }
    

    以上是StringBuffer的部分源码,事实上StringBuffer上很多方法都加上了锁 synchronized,所以它是线程安全的

    在需要线程安全的时候就可以使用StringBuffer

    相关文章

      网友评论

        本文标题:java String StringBuffer StringB

        本文链接:https://www.haomeiwen.com/subject/fasoxqtx.html