当前位置:编程学习 > JAVA >>

Java Handle String

Java对字符串的处理

 

程序中创建对象的常规方式有如下4种:

通过new调用构造器创建java对象。
通过class对象的newInstance()方法调用构造器创建Java对象。
通过Java的反序列化机制从IO流中恢复Java对象。
通过Java对象提供的clone()方法复制一个新的Java对象。
对于Java程序中的字符直接量,JVM会使用一个字符串池来保存它们;当第一次使用某个字符串直接量时,JVM会将它放入字符串池进行缓存。在一般情况下,字符串池中字符串对象不会被垃圾回收,当程序再次需要使用该字符串时,无需重新创建一个新的字符串,而是直接引用变量指向字符串池中已有的字符串。

public class StringJoinTest2 {

    public static void main(String[] args){

      Stringstr1 = "Hello Java:10";

      Stringstr2 = "Hello " + "Java" + ":10";

      System.out.println(str1==str2);

      int len=10;

      Stringstr3 = "Hello "+"Java"+":"+len;

      System.out.println(str1==str3);

      System.out.println(str2==str3);

    }

}

Output:

True

False

False

String str = “Hello“+”Java”+”crazy.org”;这里只创建了一个字符串对象,因为str的值可以在编译时确定下来,JVM会在编译时就计算str的值为”Hello Javacrazy.org”,然后将该字符串直接放入字符串池中,并让str指向它。

当程序中需要使用字符串,基本类型包装类实例时,应该尽量使用字符串直接量,基本类型值的直接量,避免通过new String(),new Integer()的形式来创建字符串,基本类型包装类实例。这样能保证较好的性能。

String类是一个典型的不可变类。当一个String对象创建完成后,该String类里包含的字符序列就被固定下来了,以后永远都不会改变。

public class ImmutableString {

    public static void main(String[] args){

      Stringstr = "Hello ";

      System.out.println(System.identityHashCode(str));

      str= str + "Java";

      System.out.println(System.identityHashCode(str));

      str= str + ", Crazy.org";

      System.out.println(System.identityHashCode(str));

    }

}

Output:

14576877

12677476

33263331

“Hello”字符串也许永远都不会被用到,但这个字符串并不会被垃圾回收,因为它将一直存在于字符串池中-这就是Java内存泄露的原因之一。

上面程序中使用了System类的identityHashCode()静态方法来获取str的identityHashCode值,将会发生3次返回的identityHashCode值并不相同的状况,这表明3次访问str时分别指向3个不同的String对象。

System提供的identityHashCode()静态方法用于获取某个对象唯一的HashCode值,这个identityHashCode()的返回值与该类是否重写了hashCode()方法无关。只有当两个对象相同时,它们的identityHashCode值才会相等。

通常应该优先考虑StringBuilder.StringBuilder与StringBuffer唯一的区别在于,StringBuffer是线程安全的,也就是说StringBuffer类里绝大部分都增加了Synchronized修饰符。对方法增加该修饰符可以保证该方法线程安全,但会降低该方法的执行效率。在没有多线程的环境下,应该优先使用StringBuilder类来表示字符串。

 

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,