Java 字符串常见问题

1.String s = new String("abc") 与 String s = "abc"  分别创建了几个对象?

  Java中的字符串实现了常量池技术,当需要一个对象时,可以从常量池中取出(如果没有则自己创建一个)。

  测试如下代码块:

    String s1 = "abc";

    String s2 = "abc";

    System.out.println(s1==s2);

    String s3 = new String("abc");

    String s4 = new String("abc");

    System.out.println(s1==s3);

    System.out.println(s3==s4);

   

  输出的结果为true,false,false

  Java中==符号是用来查询两个对象是否是同一个引用(即是否引用同一个内存中的对象); equals方法是用来判断两个对象的内容是否相同。

  String的属性是final类型的,由于它的不可变机制,使得每次修改字符串的值时都会产生新的对象。Java中为了更好的使用内存,在编译阶段遇到String字符串时,会先检查常量池中有没有相同的字符串对象,如果有则直接将新变量的引用指向该字符串,不会创建新的字符串。如果没有则将创建一个新的字符串,并放入到常量池中。当s1在常量池中创建新对象"abc"后,s2只需要引用常量池中"abc"对象即可,无需创建新的。s1 s2指向的是同一常量池中的对象,所以第一句打印为true。

  new String()所创建的字符串并不是常量,在编译期时并不能确定。所以new String()创建的字符串并不是放入常量池中的,它有自己的内存空间,一般放入堆内存中。所以s1指向的是常量池中的对象,s3指向的是堆内存中的对象。s3在创建字符串时,其实相当于String s = "abc";String s3 = new String(s);可以看成s3在创建过程中创建了两个或一个对象,在程序运行之初,常量池中没有"abc"对象时,是需要完成两次创建对象步骤,后期再次运行后,就只需创建后一个对象即可。所以第二句打印为false。

  s3 s4虽然值都是"abc",但是他们指向的是不同堆内存中的对象,所以结果为false。

  

  

posted @ 2015-07-09 09:58  博出未来  阅读(136)  评论(0编辑  收藏  举报