当前位置:IT168首页 > 技术开发 > JDK1.5下的String优化
[收藏此页] [打印] [推荐] [评论]

JDK1.5下的String优化

责任编辑:cynthia作者:ITPUB论坛   2008-07-04   

  【IT168 技术文档】java中的String是个特殊的类型,它即不是基本类型,也不是真正意义上的变量,而是个固定类型,即final型。所以在写SQL语句或繁琐的字符串表达式的时候,为了提高效率,我们一般使用StringBuffer来代替String。原因是字符串A和字符串B运算后,会生成新的对象C。如下:

  String a = "mx";   String b = "java";   String c = a + b;   System.out.println(c);

  上面的代码一共有三个String类型的对象,即a、b和a + b。之前我们也说过,因为String类型是固定值,所以运算后java编译器会重新为其分配一块内存用于存放结果。不过,这是jdk1.5以前对String类型运算的处理方式了。1.5以后对String运算进行了优化,以上面的代码为例,使用JDK1.4.2编译后的程序如下:

  String s = "mx";   String s1 = "java";   String s2 = s + s1;   System.out.println(s2);

  可以看到,编译后的程序中,s2的计算仍然使用了s + s1的方式,换句话说还是生成了第三个字符串对象。那么JDK1.5编译后的程序又是怎样的呢?

  String s = "mx";   String s1 = "java";   String s2 = (new StringBuilder()).append(s).append(s1).toString();   System.out.println(s2);

  可以看到,经JDK1.5编译后的代码使用了StringBuilder来进行字符串的运算,如果象上面代码那样仅仅一个运算,那么看不出什么效果(因为在运算时,新创建了一个StringBuilder的对象),若存在大量运算时,效果就非常明显了。因此,在使用JDK1.5以后的版本编程时,字符串加运算就不必在意了。

  在网上看到有些网友在测试JDK1.5的String时,用了下面的方法:

  String a = "ab";   String b = "a";   String c = "b";   System.out.println(a == (b + c));

  返回true,就认为是JDK1.5对String的优化。其实这是不对的,即使在JDK1.5以前的版本下执行上面这段代码,返回值依然是true。这是因为java有String池的概念。

  java中的String池

  先来看看下面这段代码,你知道它的结果吗?

  程序代码

  public class StringTest1{   public static void main(String[] args) {   String str1 = "abc";   String str2 = "abc";   System.out.println(str1 == str2);   }   }

  正确答案应该是true。再来看下面这段代码:

  程序代码

  public class StringTest2 {   public static void main(String[] args) {   String str1 = new String("abc");   String str2 = new String("abc");   System.out.println(str1 == str2);   }   }

  正确答案是false。

  众所周知,java的String是不可改变的字符串对象。为了提高效率,java为String类提供了串池。正如大家所看到的那样,在StringTest1中就使用了串池。当你重新声明一个String型变量为abc时,将使用串池里原来的那个abc,而不重新分配内存,也就是说,str2与str1将会指向同一块内存。所以结果为true。在StringTest2中使用了普通对象的声明方式,系统将会为str1和str2各分配一块内存。所以结果为false。

上一页
1
下一页
收藏到: 添加到“百度搜藏”添加到“QQ书签”添加到“Google书签”添加到“Yahoo收藏”添加到“和讯网摘”
【内容导航】
本文欢迎转载,转载请注明:转载自IT168 [ http://www.it168.com/ ]
本文链接:http://tech.it168.com/jd/2008-07-04/200807040937762.shtml
技术开发相关文章  
  • 暂无
友情推介