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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 心灵的微幸福 中级黑马   /  2014-3-11 20:16  /  1405 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String name="" 跟 String name = new String();是相同的吗,这一块不太理解,帮忙解释一下。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

7 个回复

倒序浏览
这两者是不相同的,
因为string name=“”是声明一个string型的变量name,然后可以为其赋值,
而string name=new string()是声明了一个string型的变量name,并且创建了一个string型的对象,并且把该对象的引用传递给name,即对象的实例化。

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
String name 声明了一个类型为 String 的变量 'name' ;String name =new String()  创建了一个 String 类型的对象,。用new String() 创建的字符串不是常量,不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,它们有自己的地址空间。
               

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
不相同,
String name="" 是字符串常量赋值给字符串变量name。
例如:
         String name1=”we are student!“;
         String name2=”we are student!“;
         这样name1与name2具有相同的引用,具有相同的实体。name1与name2具有相同的地址空间!
String name = new String();的意思就是用new创建一个String型的对象并赋值给String型的变量name。
例如:
         String name1=new  String(”we are student!“);
         String name2=new  String (”we are student!“);
         这样name1与name2分别指向不同地址空间的对象。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报 1 0
当用String name = ""的时候,这些定义的数据存储在一个常量池里面,注意,这个常量池不是堆中,所以不是对象,当再一次用这种方式定义一个String类型的数据时,会先查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个Unicode等于自己定义的字符串并返回它的引用。
而String name = new String("")就是在堆中实例化一个String对象,就算再一次实例化一个相同字符串的对象的时候,也会再实例化一个String类型的对象。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
给你总结一下:
1、String类是final的,不可被继承。
2、String类是的本质是字符数组char[], 并且其值不可改变。
3、String类对象有个特殊的创建的方式,就是直接指定比如String x = "abc","abc"就表示一个字符串对象。而x是"abc"对象的地址,也叫做"abc"对象的引用。
4、String对象可以通过“+”串联。串联后会生成新的字符串。
5、Java运行时会维护一个String Pool(String池),JavaDoc翻译很模糊“字符串缓冲区”。String池用来存放运行时中产生的各种字符串,并且池中的字符串的内容不重复。而一般对象不存在这个缓冲池,并且创建的对象仅仅存在于方法的堆栈区。
6、创建字符串的方式很多,归纳起来有三类:
其一,使用new关键字创建字符串,比如String s1 = new String("abc");
其二,直接指定。比如String s2 = "abc";
其三,使用串联生成新的字符串。比如String s3 = "ab" + "c";

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
补充说一下吧,用String name = new String("")这种方法实例化字符串在需要定义大量字符串的情况下是比较占用内存的,因为每实例化一个字符串,系统都会在内存中为字符串开辟出一个新空间,虽然你每次都用同一个变量名但这个内存占用问题依然不能解决。建议多用String name = ""这种方法。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
还有一点不太明白,就是像 String s="student"; String s1 ="student", s1=s2成立吗(查找常量池中是否有相同Unicode的字符串常量,若有是不是两个就使用一个地址值了呢)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马