【JavaSE】String相关知识-创新互联

String \ StringBuilder \ StringBuffer

String的值是不可变的,使用“+”或者“=”的方法尝试改变String的值并不是在原本的基础上修改,而是赋值给了新的字符串常量引用

创新互联公司是一家专注于网站设计制作、网站制作与策划设计,桃山网站建设哪家好?创新互联公司做网站,专注于网站建设十多年,网设计领域的专业建站公司;建站业务涵盖:桃山等地区。桃山做网站价格咨询:18980820575

StringBuffer是线程安全的,使用的是无脑加synchronized的方法

这三者的运行速度,StringBuilder >StringBuffer>String,这里的运行速度主要通过字符拼接时间来进行比较。String最慢是因为拼接过程需要创建大量无用对象造成资源消耗,StringBuffer慢是因为有加锁机制。

p.s.StringBuffer其实不一定比StringBuilder慢(在拼接量不够大的时候),因为通过一个缓冲区优化了性能。

带String的“+”运算

Java规范,“+”中有String的时候默认转换成String拼接

(基于任意类型都能通过toString转换成String类型,或者说是StringBuilder.append())

String的对象创建过程

首先需要明确的

  1. 有new才有新的对象:假如我写的是String s = "Matty" + "lyh"呢,"Matty"和"lyh"并没有创建新对象,这两个字符串是直接被定义为了常量池中的字符串常量。

  1. 不是所有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元起,快前往官网查看详情吧


分享题目:【JavaSE】String相关知识-创新互联
浏览地址:http://hbruida.cn/article/jpogd.html