java学习笔记 String对象的两种创建方式

来源:互联网 发布:2017nba总决赛球员数据 编辑:程序博客网 时间:2024/05/16 00:27

原文:http://1023mmmm.blog.163.com/blog/static/3884022520121022149911/

1.String  str1 = “abc”;

 2. String  str2 = new String("abc"); 

采用第一种方式创建字符串会去查找String Pool是否存在abc,如果有就直接将str1引用到String Pool中abc 的地址,没有则先在Stirng Pool中创建一个然后再将地址赋给str1.

采用第二种方式创建字符串则会直接在堆中创建对象abc,将该对象的地址赋给str2,每次调用 String  str2 = new String("abc"); 时都会创建一个新的对象。

对于类似:String s1 = new String("111");
         String s2 = "sss111";
           String s3 = "sss" + "111";
           String s4 = "sss" + s1;

对于s2,s3,s4是创建在String Pool 还是在堆中取决于该字符串是在编译期就已经确定还是在运行期确定的。S2,S3在编译期就确定,创建在String Pool中,s4是在运行期确定的,则是创建在堆中。

对于第一种方式创建的字符串,可能每次创建的不是新的,而是前一次创建的在String Pool中的字符串,而频繁使用第二种创建方式则会在堆中产生大量的对象。

String.intern()  

String类维护一个初始为空的字符串的对象池,当intern方法被调用时,如果对象池中已经包含这一个相等的字符串对象则返回对象池中的实例,否则添加字符串到对象池并返回该字符串的引用。 
   
   从程序的角度上怎么来看这个方法呢,我们假设有两个字符串s1,s2,当s1.equals(s2)时,s1.intern()==s2.intern(),也就是说这两个字符串在内存中使用的是同一个实例。如果当s1.equals(s2)时,s1.intern()!=s2.intern(),那么有可能在s1,s2是通过new的方式创建的或者其中一个是通过new的方式创建的。







0 0
原创粉丝点击