Java Handle String

Java对字符串的处理

 

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

  1. 通过new调用构造器创建java对象。
  2. 通过class对象的newInstance()方法调用构造器创建Java对象。
  3. 通过Java的反序列化机制从IO流中恢复Java对象。
  4. 通过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类来表示字符串。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值