String要点

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等方法时要特别注意是不是需要转义.

只有注册用户登录后才能发表评论。


网站导航:
 

posts - 6, comments - 8, trackbacks - 0, articles - 1

Copyright © 迟来的兵