String StringBuffer StringBuilder

1.string

  String是不可变类:

    String不是基本数据类型,而是一个对象,并且是final类型的,不可变的。(public static class String)

    例如:

    代码:String text = "a"; text = "b";

  String不是不可变的么?为什么可以这样用?因为text是字符串"a"的引用,即引用是可以变化的,跟对象实例的属性变化没有关系。(这里创建的是两个String对象)

  String设计成不可变的原因:

    字符串常量池是Java方法区中的一个特殊的存储区域,当创建一个String对象时,假如这个字符串已经在常量池中了,就不会创建一个新的对象,而是引用已经存在的对象。常量池指的是在编译期被确定,并保存在已编译的.class文件中的一些数据。它包括了关于类,方法,接口中的常量,也包括字符串常量

  String text1 = "abc"; String text2 = "abc"; 

  上面的代码只会在堆内存中创建一个实际的String对象。如果字符串对象允许改变的话,那么会导致各种逻辑错误,比如改变一个对象会影响到另一个独立对象。

  栈(stack):主要保存基本数据类型和对象的引用,数据可以共享,速度仅次于寄存器(register),快于堆

  堆(heap):用于存储对象

  安全性,因为字符串是不可变的,所以线程是安全的,同一个字符串实例可以被多个线程共享。这样便不用因为线程安全问题而使用同步。字符串本身是线程安全的。

1.StringBuffer,StringBuilder

  StringBuffer:

    StringBuffer和String一样都是用来存储字符串的,只不过他们内部的实现方式不一样,导致他们所使用的范围不同,对于StringBuffer,它在处理字符串的时候,如果是进行修改操作,并不会产生一个新的字符串对象。

    StringBuffer的许多方法和String差不多,只不过修改时StringBuffer是修改自身的,而String类则是产生一个新的对象,这是他们最大的区别。

    同时,StringBuffer是不能通过=来进行初始化的,它必须通过构造方法来进行初始化。

  StringBuilder:

    StringBuilder和StringBuffer的不同之处在于StringBuilder是线程不安全的,StringBuffer是线程安全的。

  附:equals()是用来比较两个值的,==会比较两个引用

String字符串与BufferString的传递问题

  • 基本数据类型的值传递,不改变其值;引用数据类型的值传递,改变其值

  • String类虽然是引用数据类型,但是他当作参数传递时和基本数据类型是一样的

  

原文地址:https://www.cnblogs.com/yzf666/p/6483392.html