java面试-String、StringBuffer和StringBuilder的区别

一、String的创建机制

由于String在Java世界中使用过于频繁,Java为了避免在一个系统中产生大量的String对象,引入了字符串常量池。 

运行机制是:创建一个字符串时,首先检查池中是否有值相同的字符串对象,如果有则不需要创建直接从池中刚查找到的对象引用;

                 如果没有则新建字符串对象,返回对象引用,并且将新创建的对象放入池中。

                 但是,通过new方法创建的String对象是不检查字符串池的,而是直接在堆区或栈区创建一个新的对象,也不会把对象放入池中。

String str1 = "123"; //通过直接量赋值方式,放入字符串常量池
String str2 = new String(“123”);//通过new方式赋值方式,不放入字符串常量池

二、String特性:

1、不可变:当一个对象需要被多线程共享,并且访问频繁时,可以省略同步和锁等待的时间,从而大幅度提高系统性能。

               不可变模式是一个可以提高多线程程序的性能,降低多线程程序复杂度的设计模式

2、常量池的优化:当两个String对象拥有相同的值时,他们只引用常量池中的同一个拷贝。当同一个字符串反复出现时,这个技术可以大幅度节省内存空间

三、String、StringBuffer和StringBuilder的区别

1、String是内容不可变的,而StringBuffer和StringBuilder都是内容可变的。

2、StringBuffer是同步的,数据安全,效率低;StringBuilder是不同步的,数据不安全,效率高。

三、StringBuffer的方法

1.添加:append(),insert()

2.删除:deletecharAt(),delete()

3.替换:replace()

4.反转:reverse()

5.截取:subString()(返回值类型String)

四、.StringBuffer和String的相互转换

String->StringBuffer

    //方式1:通过构造方法
    String s = "hello";
    StringBuffer sb = new StringBuffer(s);
   //方式2:通过append方法
    String s2 = "hello";
    StringBuffer sb2 = new StringBuffer();
    sb2.append(s);

StringBuffer->String  

   //方式1:通过构造方法
    StringBuffer buffer = new StringBuffer("hello");
    String str = new  String(buffer);
    //方式2:通过toString()方法
    String str2 = buffer.toString();  

五、String和StringBuffer作为形参传递(要特别注意)

String做为形参传递,效果和基本数据类型一致。

public class StringTest {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "world";
        System.out.println(s1+"===="+s2);//hello====world
        change(s1,s2);
        System.out.println(s1+"===="+s2);//hello====world


        StringBuffer sb1 = new StringBuffer("hello");
        StringBuffer sb2 = new StringBuffer("world");
        System.out.println(sb1+"======"+sb2);//hello====world
        change(sb1,sb2);
        System.out.println(sb1+"======"+sb2);//hello======worldworld

    }

    public static void change(StringBuffer sb1, StringBuffer sb2) {
        sb1 = sb2;
        sb2.append(sb1);
    }

    public static void change(String s1, String s2) {
        s1 = s2;
        s2 = s1 + s2;
    }
}

  



原文地址:https://www.cnblogs.com/wjh123/p/6066775.html