String 基础(一)

来源:互联网 发布:模糊图像修复软件 编辑:程序博客网 时间:2024/05/29 19:35

   String 基础(一)
   一:String引用类型(也有人称是一个对象),不是简单类型!默认值是null.
   
   二:new String() 和new String("")是创建一个空字符串对象。不是null。
  
   三:String str = "abc" 和 String str = new String("abc")的区别:
       为了区别,我们引入一个概念——常量池
       常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的
       一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。

       (1):String str = "abc"
       首先查看字符串池中是否存在字符串"abc",如果存在则直接将"abc"赋给str,
              如果不存在就在字符串池中新建一个字符串"abc",然后赋给str。也就是说,
       jvm会确保字符串池中仅有一个字符串拷贝。
              例如:
              String str1 = "abc";
              String str2 = "abc";
              String str3 = "a"+"b"+"c";
       
              System.out.println(str1==str2);
              System.out.println(str1==str3);

              结果:true
      true

             因为例子中的str1 和str2 中的”kvill”都是字符串常量,它们在编译期就被确定了,所以str1==str2为true;
      而”a”和”b”,"c"也都是字符串常量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量,
      所以str3 也同样在编译期就被解析为一个字符串常量,所以str3 也是常量池中” abc”的一个引用。


       (2):  new String("abc")
      创建的字符串不是常量,不能在编译期就确定,所以new String()创建的字符串不放入常量池中,它们有自己的地址空间
      例:       
      String str1 = "abc";
             String str2 = new String("abc");
             String str3 = "a"+"b"+new String("c");
       
             System.out.println(str1==str2);
             System.out.println(str1==str3);
             System.out.println(str2==str3); 
             结果:
  false
         false    
  false                
              str2 因为无法在编译期确定,所以是运行时创建的新对象”abc”的引用,
       str3 因为有后半部分new String(“c”)所以也无法在编译期确定,
              所以也是一个新创建对象”abc”的应用;明白了这些也就知道为何得出此结果了。 

 四:最后总结一下

       创建字符串对象不建议用new 的方式,new效率比较低,而且也占用空间。如果要用new String();建议用

      StringBuffer!