|
网站首页
|
业界新闻
|
小组
|
威客
|
人才
|
下载频道
|
博客
|
代码贴
|
在线编程
|
编程论坛
|
登录
注册
短消息
我发表的主题
我参与的主题
我收藏的贴子
我上传的附件
我下过的附件
编辑个人资料
我的博客
用户控制面板
搜索
道具
恢复默认风格
碧海青天
秋意盎然
棕红预览
粉色回忆
蓝雅绿
紫色淡雅
青青河草
e点小镇
橘子红了
红红夜思
水晶紫色
雪花飘飘
新年快乐
风格
短消息
论坛展区
帮助
编程论坛
→
开发语言
→
『 JAVA论坛 』
→ 关于String s=new String("abc");
我的收件箱(0)
欢迎加入我们,一同切磋技术
用户名:
密 码:
共有
1281
人关注过本帖
标题:
关于String s=new String("abc");
只看楼主
加入收藏
xudongcsharp
等 级:
论坛游侠
威 望:
1
帖 子:129
专家分:156
注 册:2009-5-31
结帖率:
53.33%
楼主
收藏
已结贴
√
问题点数:20 回复次数:4
关于String s=new String("abc");
在网上无意间看见String s=new String("abc");这条语句有两个String Object产生,
我的理解是:由于string是一个final类,所有刚开始声明时系统会有一个默认的初始值null,
后来又有一个abc,固有两个对象,所以我们如果在反复操作字符串时使用StringBuffer或StringBuilder能节省很大的空间!
不知理解是否正确,请高人指点!谢谢
搜索更多相关主题的帖子:
String
abc
new
2010-05-03 19:45
举报帖子
使用道具
赠送鲜花
linjx0123
等 级:
贵宾
威 望:
14
帖 子:279
专家分:1362
注 册:2006-4-7
第
2
楼
收藏
得分:5
楼主的理解是错误的,string是一个final类这是对的。刚开始声明时系统会有一个默认的初始值null不大正确。
对象声明并不会生成实例。比如String str;这个str是一个空对象并没有被实例化。
String s = "abc";是两个对象,因为在java中,字符串是一个final类,值是不可以改变的,"abc"就是一个实例对象。
赋值是再生成另外一个对象s,这个对象的值也是abc。
假如String s="abc"; String s2 = s;这就是3个对象了,分别为s,s2,"abc"。检验用==号就能判断是否为同个实例。
2010-05-03 22:46
举报帖子
使用道具
赠送鲜花
lampeter123
等 级:
版主
威 望:
54
帖 子:2508
专家分:6424
注 册:2009-1-30
第
3
楼
收藏
得分:5
我们可以把上面这行代码分成String str、=、"abc"和new String()四部分来看待。String str只是定义了一个名为str的String类型的变量,因此它并没有创建对象;=是对变量str进行初始化,将某个对象的引用(或者叫句柄)赋值给它,显然也没有创建对象;现在只剩下new String("abc")了。那么,new String("abc")为什么又能被看成"abc"和new String()呢?我们来看一下被我们调用了的String的构造器:
public String(String original) {
//other code ...
}
大家都知道,我们常用的创建一个类的实例(对象)的方法有以下两种:
使用new创建对象。
调用Class类的newInstance方法,利用反射机制创建对象。
我们正是使用new调用了String类的上面那个构造器方法创建了一个对象,并将它的引用赋值给了str变量。同时我们注意到,被调用的构造器方法接受的参数也是一个String对象,这个对象正是"abc"。由此我们又要引入另外一种创建String对象的方式的讨论——引号内包含文本。
你的优秀和我的人生无关!!!!
我要过的,是属于我自己的生活~~~
2010-05-04 08:26
举报帖子
使用道具
赠送鲜花
baifenghan
等 级:
贵宾
威 望:
10
帖 子:258
专家分:952
注 册:2006-3-17
第
4
楼
收藏
得分:10
似乎大家说的都不是很对。其实是这样的:
如果在调用String s=new String("abc");之前并没有关于字符串"abc"的任何定义。那么确实会生成两个对象,
一个是在字符串静态池中,一个在堆中。字符串静态池是为了高效处理字符串而设置的。
但是如果是这样:
String s1 = "abc";
String s=new String("abc");// 那么这句就只生成了一个对象,在堆中生成了。因为前一句已经在静态池中生成了那个池中的字符串对象了。
反过来说:
String s=new String("abc");
String s1 = "abc";
//这一句实际上一个字符串对象也没有生成,只是将引用s1指向了字符串静态池中那个字符串对象。
我一会发一个帖子,专门解释下Java中的字符串,希望大家不管是面试还是平时,都不要再被字符串所迷惑。
2010-05-04 18:22
举报帖子
使用道具
赠送鲜花
xudongcsharp
等 级:
论坛游侠
威 望:
1
帖 子:129
专家分:156
注 册:2009-5-31
第
5
楼
收藏
得分:0
感谢各位的回答!
正确答案应该是:两个,一个在字符串的常量池中,另一个在堆中。
2010-05-04 19:03
举报帖子
使用道具
赠送鲜花
5
1/1页
1
快速回复:
关于String s=new String("abc");
数据加载中...
关于我们
|
广告合作
|
编程中国
|
清除Cookies
|
TOP
|
手机版
编程中国
版权所有,并保留所有权利。
Powered by
Discuz
, Processed in 0.015457 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved