A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© gtf 中级黑马   /  2014-7-26 22:23  /  784 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

new  String ="abc";
new String = new String("abc");
两个的区别?
说的是第一个在内存中是一个对象,第二个是两个对象,具体是哪两个对象呢?
求解答。

4 个回复

倒序浏览
第一个是一个对象字符串数组String  ;第二个是二个对象,左边的Sting和右边的String。但是这两个对象是相同的。
回复 使用道具 举报
举个例子;
String str1 = “hello”;
String str2 =  "hello";
String str3 = new String ("hello");
String str4 = new String ("hello");
--------------------------------------------
str1==str2?true
str1==str3?false
str3==str4?false
str3.equals(str4)?true
-------------------------------------------------
"hello"创建一个字符串对象的时候,那么首先JVM在字符串常量池中检测是否已经存在了该字符串。如果存在,那么直接返回字符串常量池中该字符串的内存地址。如果不存在,那么现在字符串常量池中创建该字符串的对象,然后返回该字符串对象的内存地址。

new String("hello")方式创建字符串的时候,那么jvm首先也会在字符串常量池中检测是否已经存在了"hello"字符串,如果不存在,那么直接在字符串常量池中创建该对象,而且还会去到堆内存中创建该字符串对象,把字符串常量池中字符串对象的内容拷贝过去,并且把堆内存中字符串对象内存地址返回。如果字符串常量池中已经存在了指定的字符串,那么不会在字符串常量池中再创建,但是也去到堆内存中创建一个字符串对象,并且把字符串常量池中的字符串内容拷贝过去。------------------------------------------------------------------------
回复 使用道具 举报
同意楼上
回复 使用道具 举报
个人认为,使用new创建出来的字符串对象,首先会在字符串池中查找是否有相同的字符串,没有的话就在字符串池中创建该字符串对象,然后在堆中再创建该字符串对象。如果在字符串池中已存在该字符串,就直接在堆中创建该字符串对象。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马