String的值是不可变的,使用“+”或者“=”的方法尝试改变String的值并不是在原本的基础上修改,而是赋值给了新的字符串常量引用
创新互联公司是一家专注于网站设计制作、网站制作与策划设计,桃山网站建设哪家好?创新互联公司做网站,专注于网站建设十多年,网设计领域的专业建站公司;建站业务涵盖:桃山等地区。桃山做网站价格咨询:18980820575StringBuffer是线程安全的,使用的是无脑加synchronized的方法
这三者的运行速度,StringBuilder >StringBuffer>String,这里的运行速度主要通过字符拼接时间来进行比较。String最慢是因为拼接过程需要创建大量无用对象造成资源消耗,StringBuffer慢是因为有加锁机制。
p.s.StringBuffer其实不一定比StringBuilder慢(在拼接量不够大的时候),因为通过一个缓冲区优化了性能。
带String的“+”运算Java规范,“+”中有String的时候默认转换成String拼接
(基于任意类型都能通过toString转换成String类型,或者说是StringBuilder.append())
String的对象创建过程首先需要明确的
有new才有新的对象:假如我写的是String s = "Matty" + "lyh"呢,"Matty"和"lyh"并没有创建新对象,这两个字符串是直接被定义为了常量池中的字符串常量。
不是所有String都存在常量池中:通过new创建的String对象,是在堆中存放的。而常量池是在方法区的(JDK 1.7后改到堆的元数据区了)。
创建对象分析举例:
String s = new String("Matty") + new String("lyh");
这个语句创建了六个对象:
两个字符串常量池对象,两个String对象,一个StringBuilder对象(字符串相加是通过StringBuilder的append实现的),一个String对象(字符串相加结束后,由StringBuilder的toString返回一个String对象)。
使用“==”和“equals”比较String插播“==”的用法:当比较的对象是基础数据类型时,比对的就是数据是否相同,比如int、boolean、double等;当比较的对象是引用数据类型时,比对的就是内容的引用的地址是否相同。
看看下列几种情况:
String a = "a";
String b = "a";
System.out.print(a==b);//true
System.out.print(a.equals(b));//true
a、b都指向同一个常量池对象“a”,使用“==”比较的时候比较引用对象的地址都是“a”所在的堆地址。
String c = new String("MY");
String d = "M" + "Y";
System.out.print(c==d);//false
System.out.print(c.equals(d));//true
d的拼接结果为“MY”,但是由于没有new,所以没有创建新对象,所以d的“MY”是存在常量池中。而c是引用了new的String对象,所以c的“MY”存在堆中,所以两个引用指向的不是同一个地址。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧