java里的String

阅读更多

1. java里的new 一个String对象时都会在堆内存里产生一个对象。

String str = new String("abc") 首先检查String Pool里有没有值为abc的对象,如果没有会先在String Pool里产生一个值为abc的对象,然后再在堆内存里拷贝一个值为abc的对象,然后把堆内存里的对象的地址赋值给str,如果String  Pool里有一个值为abc的对象,则直接从String Pool里的值拷贝一份值为abc的对象到堆内存,然后把堆内存里的对象的地址赋值给str.

String str = "abc' 这种方式创建的字符串,会首先看String Pool里有没有值为abc的对象,如果有,则直接把String Pool里abc对象的内存地址复制给str即可,如果没有则在String Pool里创建一个值为abc的对象,然后把创建的新的对象的内存地址赋值给str即可

java 代码
  1. public class Test {   
  2.   
  3.     public static void main(String[] args) {   
  4.         String str1 = new String("abc");   
  5.         String str2 = "abc";   
  6.         String str3 = new String("abc");   
  7.            
  8.         System.out.println(str1 == str2);   
  9.         System.out.println(str1 == str3);   
  10.         System.out.println(str2 == str3);   
  11.     }   
  12.   
  13. }   
  14.   
  15. 输出结果;   
  16. false  
  17. false  
  18. false  

 

2. String.intern() ,返回的是String Pool里相同值的对象的地址。

所以:

java 代码
  1. public class Test {   
  2.   
  3.     public static void main(String[] args) {   
  4.         String str1 = new String("abc");   
  5.         String str2 = "abc";   
  6.         String str3 = new String("abc");   
  7.            
  8.         System.out.println(str1 == str1.intern());//false   
  9.         System.out.println(str2 == str2.intern());//true   
  10.         System.out.println(str1.intern() == str3.intern());//true   
  11.     }   
  12.   
  13. }  

 

3  字符串用+号连接

如果+号两边都是字面常量的话,都会先去String Pool里找值相等的对象.如果没有找到则会在String Pool里创建一个新的对象。

如果+号两面有一个不是字面常量的话,则会在堆里创建一个新的对象。

java 代码
  1.   
  2. public class Test {   
  3.   
  4.     public static void main(String[] args) {   
  5.         String hello = "hello";   
  6.         String lo = "lo";   
  7.            
  8.         System.out.println(hello == "hel" + "lo");//+号两边都是字面常量,会在String Pool里创建,所以返回true   
  9.         System.out.println(hello == "hel" + lo);//+号右边不是字面常量,则会在堆内存里创建,所以返回false   
  10.     }   
  11.   
  12. }  

你可能感兴趣的:(Java)