黑马程序员技术交流社区

标题: java String类 [打印本页]

作者: pengmin    时间: 2016-5-10 13:12
标题: java String类
         String
  1、初始化:
  一般由String声明的字符串,长度是不可变的,这也是它与StringBufferStringBuilder最直观的一个区别。一般初始化方式:String s = "hello world";经过这条语句,JVM的栈内存中产生一个s变量,堆内存中产生hello world字符串对象。s指向了hello world的地址。像上面这种方式产生的字符串属于直接量字符串对象,JVM在处理这类字符串的时候,会进行缓存,产生时放入字符串池,当程序需要再次使用的时候,无需重新创建一个新的字符串,而是直接指向已存在的字符串。
  2String s = "123" + "456"内存中产生几个字符串对象?
  这是个比较有争议的问题,面试的时候,老师还挺喜欢问,论坛上大家说几个的也有,我给大家分析一下,因为我们前面有提到Java字符串的缓存机制,编译器在编译的时候会进行优化,所以在编译的过程中123456被合成了一个字符串"123456",因此,如果缓存池中目前没有123456这个对象,那么会产生一个,即""123456",且栈中产生一个引用s指向它,如果缓存池中已经存在"123456",那么将产生0个对象,直接用s指向它。
  3StringBufferStringBuilder
  StringBufferStringBuilder就是所谓的可变字符串类,共四个构造方法:
  StringBuffer()
  public StringBuffer(int paramInt)
  public StringBuffer(String paramString)
  public StringBuffer(CharSequence paramCharSequence)
  观察其源码发现,使用StringBuffer()时,默认开辟16个字符的长度的空间,使用public StringBuffer(int paramInt)时开辟指定大小的空间,使用public StringBuffer(String paramString)时,开辟paramString.length+16大小的空间。都是调用父类的构造器super()来开辟内存。这方面StringBufferStringBuilder都一样,且都实现AbstractStringBuilder类。

  二者几乎没什么区别,基本都是在调用父类的各个方法,一个重要的区别就是StringBuffer是线程安全的,内部的大多数方法前面都有关键字synchronized,这样就会有一定的性能消耗,StringBuilder是非线程安全的,所以效率要高些。


作者: pengmin    时间: 2016-5-10 13:13
  




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2