A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© pengmin 中级黑马   /  2016-5-10 13:12  /  321 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

         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是非线程安全的,所以效率要高些。

1 个回复

倒序浏览
  
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马