String.intern(),String.subString()

转载以供学习:http://www.cnblogs.com/dolphin0520/p/3778589.html

String.intern()

JDK中对String.intern()方法的解释如下:

public String intern()
返回字符串对象的规范化表示形式。
一个初始为空的字符串池,它由类 String 私有地维护。
当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。
它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。
所有字面值字符串和字符串赋值常量表达式都使用 intern 方法进行操作。字符串字面值在 Java Language Specification 的 §3.10.5 定义。
返回:
一个字符串,内容与此字符串相同,但一定取自具有唯一字符串的池。


String是特殊的封装类型,使用String时可以直接赋值,也可以用new来创建对象,但是这二者的实现机制是不同的。
String池:Java运行时在运行时常量池中维护一个String池,池中的String对象不可重复。String池不属于堆和栈,而是属于常量池。
String s1 = "abc";   
String s2 = "abc";
System.out.println(s1 == s2);//true
对于这两个语句,JVM做了什么操作呢?运行第一个语句时,相当于调用"abc".intern()方法,然后将方法返回的引用赋值给s1,第二条语句与第一条语句的过程一样,所以打印结果是true。

下面再列一下实例:
String str1 = "a";    //常量池中对象
String str2 = "bc";    //常量池中对象
String str3 = "a"+"bc";    //常量池中对象
String str4 = str1+str2;    //new String(value, 0, count),堆中对象,因为str1,str2是String。字面值与变量进行+,则值是一个堆中对象
     
System.out.println(str3==str4); //false   
str4 = (str1+str2).intern();//常量池中对象    

System.out.println(str3==str4); //true


String.subString()

String a = new String("asdffsafds");String b = a.substring(2,4);
在String类中,此方法有两个版本,此方法的返回值是一个全新的字符串,但对象内部引用的字符数组却是一样的,两个对象的不同是在字符数组中的起始位置和长度不同。如果想要得到一个与原对象引用字符数组不相同的字串,可以采用String c = new String(b)方法。这样,c与b引用的字符数组就不相同,a与b引用的字符数组相同,就可以释放对原字符数组的引用,便于GC。

字符串常量池

JAVA字符串常理池增加有两种情况:第一种情况发生在JAVA文件被编译器编译时。JAVA编译器会将常量字符串放到常量池中,编译完成后,所有文件中的相同字符串最终都指向同一个位于常量池中的对象,“a”+"b","a"都是常量字符串;第二种情况是在运行时调用字符串对象的intern()方法。

字符串拼接

JAVA6后,编译器会将字符串的+操作(只要+操作中有字符串变量出现,全是字符串常量的情况除外)转换成stringbuilder.append操作。
String s = "";
String a="a";
String b="b";
String c="c";
s+=a;
s+=b;
s+=c;
这段代码会生成三个StringBuilder对象,执行三次sb.append,sb.tostring操作
s=a+b+c;
这段代码会生成一个StringBuilder对象,执行三次append和一次tostring。
所以,如果要拼接的字符串已经全得到的情况下,显式用+进行拼接更直观,如果最张字符串要多次拼接的话,显式用stringbuilder.append操作性能更好。

String(String original)

new String(String orininal)此构造函数生成的新对象内部引用的字符数组有两种情况,判断依据是源字符串内的字符数组的长度,如果源字符串的长度等于内部字符数组的长度,那么新字符串对象与源字符串是两个对象但引用同一个字符数组,如果源字符数组的长度大于源字符串的长度,那么新字符串会引用一个新的字符数组。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值