Posted on 2008-12-06 19:39
迟来的兵 阅读(227)
评论(0) 编辑 收藏 所属分类:
Java
一.String对象的比较,+操作和intern方法
这里从一个问题入手来看看。
package testPackage;
public class Test {
public static void main(String[] args) {
String hello = "Hello", lo = "lo";
System.out.print((hello == "Hello") + " ");
System.out.print((Other.hello == hello) + " ");
System.out.print((other.Other.hello == hello) + " ");
System.out.print((hello == ("Hel" + "lo")) + " ");
System.out.print((hello == ("Hel" + lo)) + " ");
System.out.println(hello == ("Hel" + lo).intern());
}
}
class Other {
static String hello = "Hello";
}
package other;
public class Other {
static String hello = "Hello";
}
正确答案:true true true true false true
主要要点有:
1.所有内容相同的String指向同一个内存块。但String对象不能是通过new操作创建出来。主要原因是JVM对String做了优化,String加载之后会持有一个常量池,
只要在常量池中找到内容相同的String就会把其引用返回。而new操作是直接在内存中分配新空间。
2.Java中有两种绑定,静态和动态。如果+操作的两边是常量表达式那么会在采用静态绑定,也就是说编译之后值已经定下来了。而如果有一边是通过new操作创建出
来的那么会采用动态绑定,只有在运行的时候才知道其具体的值。
3.String的intern方法会到常量池里面找是否有相同内容的String,如果有则返回其引用。如果没有则把这个String对象添加到常量池之中并放回其引用。额外说
下,intern在英文中有保留区的意思,这样好理解其作用。intern方法还是native的。
二.String中的正则表达式使用
String中有些方法是需要正则表达式作为参数的。这个时候就要主要不要传错参数。最典型的例子就是replaceAll(String regex, String replacement)。第一个
参数是需要正则表达式的,而第二参数是普通的字符串。
String ss = "???";
ss = ss.replaceAll("?", "=");//运行到这里会抛出PatternSyntaxException,因为“?”在正则表达式里面是特殊符号,需要转义。
ss = ss.replaceAll("[?]", "=");//正确,我个人比较倾向于这种写法。
ss = ss.replaceAll("\\?", "=");//正确,对“?”做转义。
因此在使用split,replaceAll,replaceFirst等方法时要特别注意是不是需要转义.