String、StringBuffer 和 StringBuilder区别

一 String类初始化后是不可变的、使用String不一定创建对象、使用new String 一定创建对象

  1. 物理的内存是线性结构,并不存在拥有不同功能的不同区域。编译器(或者JVM)为了更高效地处理数据,会用不同的算法把内存分为各种区域,不同的区域拥有各自的特性,Java中,内存可以分为栈,堆,静态域和常量池等。(可能有不同的叫法,但逻辑是一致的)

  2. 不同内存区域的功能和特点:

    a) 栈区:存放局部变量(变量名,对象的引用等)特点:内存随着函数的调用而开辟,随着函数调用结束而释放。

    b) 堆区:存放对象(也就是new出来的东西)特点:可以跨函数使用,每个对象有自己对应的存储空间。

    c) 静态域:存放在对象中用static定义的静态成员。

    d) 常量池:存放常量。(常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。)

  3. 创建字符串的方法有两种:

    a) String str1=“直接赋值法”;

    b) String str2=new String(“通过new关键字的方法来创建”);

这两种方法的区别:

第一种:首先检查字符串常量池中是否存在该字符串对象,如果已经存在,那么就不会在创建字符串常量池中再创建了,直接 返回该字符串在字符串常量池中内存地址,如果该字符串还不存在字符串常量池中,那么就会在字符串常量池中先创建该字符串的对象,然后再返回。

第二种:首先会检查字符串常量池中是否存在”java”的字符串,如果已经存在,则不会在字符串常量池中创建了,如果没有存在,那么就会在字符串常量池中创建”java”字符串对象,然后还会到堆内存中再创建一份字符串对象,把字符串常量池中的”java”字符串内容拷贝到内存中的字符串对象,然后返回堆内存中字符串对象的内存地址。即栈内存存储的地址是堆内存的内存地址。

二 String、StringBuffer、StringBuilder的区别

  1. 可变与不可变

    1. String不可变
    2. StringBuffer、StringBuilder可变
  2. 是否多线程安全

    1. String类中对象不可变,final修饰,可以理解为常量是线程安全的。
    2. AbstractStringBuilder是StringBuffer和StringBuilder共同的父类,StringBuffer对方法添加了synchronized关键字,所有是线程安全的,而StringBuilder没有添加因此是线程不安全的。
  3. 执行速度:

    StringBuilder>StringBuffer>String

java
65 views
Comments
登录后评论
Sign In