JAVA学习.String不变性&StringBuffer&StringBuilder

原创 2013年12月02日 10:26:44

String类创建的时候的内存图:(结合代码)



/**
 * 
 */

/**
 * @author fshxxxyydys
 *
 */
public class StringInvariance {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String str1 = new String( "fshxxxyydys");
		String str2 = new String( "fshxxxyydys");
		
		System.out.println(str1 == str2); 
		//只有str1和str2指向同一个对象的时候才能相等
		//用new暗示系统为新的对象开辟一个新的空间
		//此时即使内存(堆)中已经存在了一个一样的对象
		//系统也不会将新的引用变量(指针)指向它,而是为新的对象开辟
		//一块新的内存空间,所以此时str1和str2不相等
		
		System.out.println(str1.equals(str2));
		//比较两个引用变量指向的对象的内容是否相等
		
		
		String c1 = "fshxxxyydys";
		String c2 = "fshxxxyydys";
		System.out.println(c1 == c2);
		//java中字符串使用频繁,为了提高效率,系统会将字符串进行缓存与复用
		//JAVA的字符串对象一旦被创建,不能修改,这种语法现象叫做
		//字符串的不变性(immutable String),在系统创建c2时,发现内存中已经
		//存在了一个“fshxxxyydys”对象,而且没有收到要为新对象创建新的内存
		//的暗示“new”使用就直接将c2指向了系统已经存在的“fshxxxyydys”对象
		//所以此时才c1和c2相等
		
		
		c1 = c1.replace("x","O");
		System.out.println("c1="+ c1);
		System.out.println("c2="+c2);
		//java中一旦字符串确定,就不能修改,对任何字符串的修改
		//操作,最终都会产生新的字符串对象
		//以上操作中c1的指针被指向一个新的对象“fshOOOyydys”
		//因此此时c1和c2将不再相等
		System.out.println(c1 == c2);
		
		
		//由于每次产生新的对象,所以如果进行大量的String操作内存会很快的
		//消耗殆尽,JVM GC 要一直的工作,导致性能下降,如果有涉及到较多的字符串相加操作,
		//请使用StringBuffer类。
		//StringBuffer是线程安全的,速度较慢,如果你确定你的程序不需要线程安全
		//建议使用StringBuilder,其实StringBuffer的兄弟类,拥有完全一致的API,但是速度较快。
		StringBuffer strbf = new StringBuffer();
		strbf.append("fshx") //此函数返回的是strbf本身所以可以连续追加
		     .append("xx")
		     .append("yydys")
		     .append(888888)
		     .append(true);
		 
		System.out.println(strbf.toString());

	}

}
=======================================================================

Result:

false
true
true
c1=fshOOOyydys
c2=fshxxxyydys
false
fshxxxyydys888888true

=========================================================================


原创出处:http://blog.csdn.net/u012830807

【Java学习笔记】String对象的不变性和intern()方法——基于Java SE8

1.String对象不变性 2.==和equals()方法 3.字符串常量池 4.intern方法

Java-Basics-Strings-什么是Java String的不变性

我们用图的形式以更加形象地解释Java String的不变性 1. 声明一个字符串 String s = "abcd"; 2. 将一个字符串变量赋给另一个字符串变量 String s2 =...

java内存分配和String的不变性

转载请出自出处:http://eksliang.iteye.com/blog/2146549 http://eksliang.iteye.com 一.java分配内存涉及的区域包括 寄存器 ...

【学习总结】java高级特性之String、StringBuffer、StringBuilder

1.String:java中字符串值属于String类,java编译器把字符串值作为String对象;但String对象一旦创建就不能改变,如果需要进行大量的字符串操作,应该使用StringBuffe...
  • heccmm
  • heccmm
  • 2016年12月21日 12:35
  • 143

【Java学习笔记】String、StringBuffer和StringBuilder

--------------------------------------------Java培训、Android培训、iOS培训、.Net培训  、期待与您交流!-----------------...

Java学习笔记(四)--封装 String类 StringBuffer StringBuilder

封装1.封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。 2.好处: -提高了代码的复用性 -提高了安全性 3.体现:将不需要对外提供的内容都隐藏起来。 4.做法:把属性隐藏,提...

Java学习札记14:一个比较String、StringBuffer和StringBuilder之间效率差别的简单例子

String:定长的字符串,它的内容是不可以改变的,正因为如此,编译器可以让字符串共享。 StringBuffer:可变长的字符串缓冲区,多线程操作是安全的,并且在字符串连接操作上提供了性能...
  • L_YQing
  • L_YQing
  • 2012年08月08日 20:37
  • 679

Java中String,StringBuilder和StringBuffer类学习

一点点学习,加深下理解. 1.今天来理解一下字符串String类型. 首先,String不是基本类型,是一个Class,是引用类型. 看一看,String类型的定义: public final...
  • xgc3098
  • xgc3098
  • 2013年08月20日 11:16
  • 346

黑马程序员——java中String、StringBuffer、StringBuilder学习总结

提前声明:小弟初出茅庐,在学习了String,StringBuffer,StringBuider类后总结一些知识点,便于以后深度理解,初学者可以借鉴学习,还请高手大神请指点,谢谢! 前几天参加一次...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JAVA学习.String不变性&StringBuffer&StringBuilder
举报原因:
原因补充:

(最多只允许输入30个字)