`
爱上边城
  • 浏览: 5848 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
社区版块
存档分类
最新评论

String str1 = new String("abc"); Stirng str2 = "abc"; 的区别

阅读更多
java 代码
String str1 = new String("abc");    
Stirng str2 = "abc";  

     虽然两个语句都是返回一个String对象的引用,但是jvm对两者的处理方式是不一样的。对于第一种,jvm会马上在heap中创建一个String对象,然后将该对象的引用返回给用户。对于第二种,jvm首先会在内部维护的strings pool中通过String的 equels 方法查找是对象池中是否存放有该String对象,如果有,则返回已有的String对象给用户,而不会在heap中重新创建一个新的String对象;如果对象池中没有该String对象,jvm则在heap中创建新的String对象,将其引用返回给用户,同时将该引用添加至strings pool中。注意:使用第一种方法创建对象时,jvm是不会主动把该对象放到strings pool里面的,除非程序调用 String的intern方法。看下面的例子:

java 代码
String str1 = new String("abc"); //jvm 在堆上创建一个String对象   

 
//jvm 在strings pool中找不到值为“abc”的字符串,因此  
//在堆上创建一个String对象,并将该对象的引用加入至strings pool中  
//此时堆上有两个String对象  
Stirng str2 = "abc";   
  
 if(str1 == str2){   
         System.out.println("str1 == str2");   
 }else{   
         System.out.println("str1 != str2");   
 }  

  //打印结果是 str1 != str2,因为它们是堆上两个不同的对象  
 
 
String str3 = "abc";
  
//此时,jvm发现strings pool中已有“abc”对象了,因为“abc”equels “abc”  
//因此直接返回str2指向的对象给str3,也就是说str2和str3是指向同一个对象的引用  
  if(str2 == str3){   
         System.out.println("str2 == str3");   
  }else{   
         System.out.println("str2 != str3");   
  } 
 
//打印结果为 str2 == str3 
   再看下面的例子:


java 代码
String str1 = new String("abc"); //jvm 在堆上创建一个String对象  
  
str1 = str1.intern();   

//程序显式将str1放到strings pool中,intern运行过程是这样的:首先查看strings pool  
//有没“abc”对象的引用,没有,则在堆中新建一个对象,然后将新对象的引用加入至  
//strings pool中。执行完该语句后,str1原来指向的String对象已经成为垃圾对象了,随时会  
//被GC收集。  
 
//此时,jvm发现strings pool中已有“abc”对象了,因为“abc”equels “abc”  
//因此直接返回str1指向的对象给str2,也就是说str2和str1引用着同一个对象,  
//此时,堆上的有效对象只有一个。  
Stirng str2 = "abc";   
  
 if(str1 == str2){   
         System.out.println("str1 == str2");   
 }else{   
         System.out.println("str1 != str2");   
 }  

  //打印结果是 str1 == str2  
 



    为什么jvm可以这样处理String对象呢?就是因为String的非可变性。既然所引用的对象一旦创建就永不更改,那么多个引用共用一个对象时互不影响。
分享到:
评论

相关推荐

    java语言程序设计课后习题答案解析.doc

    使用"= ="会因为创建的形式不同而产生不同的结果: String str1 = "abc"; String str2 = "abc"; System.out.println<str1==str2>; //true String str1 = new String<"abc">; String str2 = "abc"; System.out....

    完整版Java全套入门培训课件 Java基础 06-集合(共24页).pptx

    String str1 = new String(“abc”); 有什么区别 ? String类部分方法 char charAt(int index) int length() char[] toCharArray(); int indexOf(String str); boolean endsWith(String str); String[] split...

    通过查询数据库里的方法名称,来调用方法

    string str = "select * from [KeyWord] where id='1'"; conn.Open(); SqlCommand cmd = new SqlCommand(str, conn); SqlDataReader dr = cmd.ExecuteReader(); // string str1 = ""; asac.abc c = new asac....

    String对象的创建与比较

    对象的创建方式  1、new创建  堆;至少创建一个对象,也可能两...  String str1 = new String("ABC");  String str2 = new String("ABC");  System.out.println(str1 == str2); // 比较对象的指针,false  

    C#中List和数组之间转换的方法

    List<string> listS=new List<string>(); listS.Add(str); listS.Add(hello); string[] str=listS.ToArray(); 二、数组转List (从string[]转到List<string>) string[] str={str,string,abc}; List<string> listS=...

    一套java模拟试题

    三、写出下面程序的运行结果(10分) 1、 import java.io.*; public class abc { public static void ... AB( String str1 , String str2 ) { s1 = str1; s2 = str2; } public String toString( ) { return s1+s2;} }

    各类监听合集

    ArrayAdapter<String> stringArrayAdapter= new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,str); autv_1.setAdapter(stringArrayAdapter); //Button 点击 Button btn_1 = (Button)...

    jv程序设计习题.docx

    public AB(String str1, String str2) { s1 = str1; s2 = str2; } public String toString( ) { return s1+s2; } } 运行结果: Hello!I love JAVA 2、 import java.io.* ; public class abc { public static void ...

    StringTest.java

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

    C#程序设计练习题.doc

    namespace 课堂练习3 { class Program { static void Main(string[] args) { string str1, str2; Console.Write("请输入字符串:"); str1=Console.ReadLine(); Console.Write("逆转后字符串为:"); for (int n = str...

    java题目(试卷)和答案

     String str=new String("good");  char[]ch={'a','b','c'};  public static void main(String args[]){  Example ex=new Example();  ex.change(ex.str,ex.ch);  System.out.print(ex.str+" and ");  ...

    Java语言程序设计期末复习综合练习题3

    AB( String str1 , String str2 ) { s1 = str1; s2 = str2; } public String toString( ) { return s1+s2;} } 答:Hello! I love JAVA. 2.import java.io.* ; public class abc { public static void main...

    了解String.substring的原理

    String str1 = "abc"; 这个时候会把字符串”abc”放入常量池。 又或者当编译器可以确定变量的值时,如下: String str1 = "abc" + "def"; 这个时候会把字符串”abcdef”放入常量池。 所以我们得出一个结论

    C#中List〈string〉和string[]数组之间的相互转换

    System.String[] str={“str”,”string”,”abc”}; List<System> listS=new List(str);   2, 从List转到System.String[] List<System> listS=new List(); listS.Add(“str”); listS.Add(“hello”); System....

    底层的技术-----反射技术

    通过new对象 String str = new String(“abc”); String不可变特性:长度、内容 Private final char value[]; 内容不是真的不可变,可以通过反射的技术进行修改 反射 reflect 类是用来描述一组对象 反射机制...

    delphi通用函数单元一

    function DaysBetween(Date1, Date2: TDateTime): integer; {//得到两个日期相隔的天数} //▎============================================================▎// //▎===================③ 扩展的位操作函数 ====...

    超强JS(javascript)正则类第三版

    * var imgtemp2=reg.getElememtByName(str,'myimg').string; * var imgsrc=reg.GetAttrib(reg.getElememtByName(str,'myimg').string,'src'); * var scripts=reg.Get(str,"<script type='text/...

    Java语言程序设计(第3版)第06章-字符串.pptx

    boolean contains(String str) String s1 = "ABC"; String s2 = "ABE"; System.out.println( s1.compareTo(s2); 输出-2 Java语言程序设计(第3版)第06章-字符串全文共31页,当前为第10页。 6.1.1 字符串的拆分和组合 ...

    Java面向对象程序设计试题一.doc

    public class Example{ String str=new String("good"); char[]ch={'a','b','c'}; public static void main(String args[]){ Example ex=new Example(); ex.change(ex.str,ex.ch); System.out.print(ex.str+" and ...

    Ruby语言中的String深入理解

    比如 代码如下: str1=”abc” str2=”abc” 在java中,对于字面量的字符串,jvm内部维持一张表,因此如果在java中,str1和str2是同一个String对象。而在Ruby中, str1和str2是完全不同的对象。同样,在java中对于...

Global site tag (gtag.js) - Google Analytics