StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)
开始抄袭别人了
String这个类叫做常量字符串,构造长得像int i=0;
String str="hello",但他又是一个类,大概是在堆内存建立一个字符串对象"hello"
再在栈内存建立一个对象,叫str,指向“hello”,
如果你写str="world",它又建立一个"world",然后str指向world这个字符串,
所以理解这个常量的含义,真不能变了吗,再写一句 str=“anther means”;还是可以的
但是本质却是再建立一个对象,指向它。
所以频繁改动字符串不建议用String
再说说+
String str="a"+"b"+"c"
很简单吧。str的值abc
但是代价呢
- String str = "I like";//---------1--------
- System.out.println(System.identityHashCode(str));
- str = str + "java";//--------2---------
- System.out.println(System.identityHashCode(str));
其实还是要建立一个字符串对象,然后你的str指向它。消耗空间啊,这是空间上的性能分析
Stringbuffer 可变的字符串
StringBuffer:
是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象
它只能通过构造函数来建立,
StringBuffer sb = new StringBuffer();
note:不能通过付值符号对他进行付值.
sb = "welcome to here!";//error
对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer
中付值的时候可以通过它的append方法.
sb.append("hello");
字符串连接操作中StringBuffer的效率要比String高:
String str = new String("welcome to ");
str += "here";
的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后
再将StringBuffer toSting();
这样的话String的连接操作就比StringBuffer多出了一些附加操作,当然效率上要打折扣.
这是时间上的性能分析,所以你如果分析String和StringBuffer的性能,千万别+,因为在jvm它会把他们自动转化了
那样你得出结论String效率差可能只是差一点点
StringBuilder 和buffer差不多,但是线程不安全,所以如果你确保就一个线程,用builder那效率更是要快一点