社区
Java SE
帖子详情
请教String怪问题
dgsrest
2003-08-12 02:05:16
我初始化
String s1="abc";
String s2="abc";
String s3=new String("abc");
String s4=new String("abc");
我们知道"=="是引用的对比
我用程序测试 s1==s2 true //为什么会是true呢
s1=="abc" true //?
s3==s4 false
这两种初始化有什么本质上的区别吗?请指教!谢谢!
...全文
67
32
打赏
收藏
请教String怪问题
我初始化 String s1="abc"; String s2="abc"; String s3=new String("abc"); String s4=new String("abc"); 我们知道"=="是引用的对比 我用程序测试 s1==s2 true //为什么会是true呢 s1=="abc" true //? s3==s4 false 这两种初始化有什么本质上的区别吗?请指教!谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
32 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
polyhill
2003-08-14
打赏
举报
回复
顺便说一句上述方法查看到的内存占用情况并不是真实100000000字符串对象占用的内存大小,因为垃圾回收机制会回收先前构件而不再需要的字符串对象。如果想通过采用数组方式来保存这些对象实现查看到真实的内存占用情况,你将会的到out of memory的错误信息
polyhill
2003-08-14
打赏
举报
回复
效率将低得多,需要76560ms
这是因为首先要通过String.valueOf(i)构建字符串"i"对象,然后执行+操作,再构建new String("abci")对象,这样造成效率低下
zoominet
2003-08-14
打赏
举报
回复
楼上的解释很透彻。
我有一个问题,楼上的用引用是针对同一个“abc”,如果引用的是不同
对象呢?比如:
for(int i=0;i<100000000;i++){
String s1 = "abc" + i;
}
这样的效率怎样?
polyhill
2003-08-14
打赏
举报
回复
如果我们声明String str = new String(“abc”);时jvm将构造一个新的字符串对象,其值为“abc”;如果我们声明String str = “abc”;时jvm将首先判断在堆中是否已经存在“abc”对象,如果存在那么则将已存在的“abc”对象的引用赋给str,否则将构造“abc”对象,然后再将“abc”对象的引用赋给str。
上述情况将带来一推论:程序中使用多次如String str = “abc”;这样的赋值方式并不会新增多个字符串对象,而只是对一个字符串对象的不同引用。
我们采用如下方式证明上述描述:
1、String s1=“abc”;
String s2=“abc”;
System.out.println(s1= =s2);//print true
String s3=new String(“abc”);
String s4=new String(“abc”);
System.out.println(s3= =s4);//print false
上述证明了这两种情况的赋值和构建对象的方式是不同的。
2、我们下面通过显示两种情况性能的差异来进一步证明String s2=“abc”;的方式是不构建对象的(我们知道构造对象效率将较低,并且通过构造对象内存的占用率也要相应提高,下面数据是在本机(P42.4G MEM1G)测试的结果)。
long time = System.currentTimeMillis();
for(int i=0;i<100000000;i++){
String s1 = new String("abc");
}
System.out.println(System.currentTimeMillis() - time);//print 6000ms,
//内存占用5364
while(true){}//为了查看内存占用率较方便
long time = System.currentTimeMillis();
for(int i=0;i<100000000;i++){
String s1 = "abc";
}
System.out.println(System.currentTimeMillis() - time);//print 300ms,
//内存占用4820
while(true){}//为了查看内存占用率较方便
dgsrest
2003-08-14
打赏
举报
回复
java中没有String这种基本类型的,
我知道s3,s4是指向对象的引用,所以s3!=s4,
但
String s1="abc";
String s2="abc";
s1,s2是引用吗?是指向同一对象的引用?每一个"abc"都是一个独立的对象吧?
请指教,谢谢!
feiyuegaoshan
2003-08-14
打赏
举报
回复
经典老问题了:)依次解释如下:
String s1="abc";
String s2="abc";
jvm对以上两个对象做了优化,内存里是分配的同一个地址。
String s3=new String("abc");
String s4=new String("abc");
jvm为new 分配不同的地址。
所以,产生了你的“疑惑”。
Jumperr
2003-08-14
打赏
举报
回复
收藏收藏
shine333
2003-08-14
打赏
举报
回复
代码中有"......"的地方,编译的时候,都将所有String s = "....."的指向统一个地方,以作优化
formalin
2003-08-14
打赏
举报
回复
对于s1==s2,s3!=s4,确实如polyhill(hill)所说
而s1=="abc",确实是重载的缘故。
tele
2003-08-14
打赏
举报
回复
看过java认证考试的书,polyhill(hill)说的是正确的
zez
2003-08-14
打赏
举报
回复
polyhill(hill)
的解释是正解 ...
------------------------------------------------------
我们还年轻牛奶会有的奶牛也会有的
可天天在 csdn 混这些会有吗 ??
formalin
2003-08-14
打赏
举报
回复
抱歉,查了一下,不是String类做的重载,而是java.lang.Object,比较常量时比的是所有属性,比较对象时比的是引用。
David_7678
2003-08-14
打赏
举报
回复
不错,对!
formalin
2003-08-14
打赏
举报
回复
其实是运算符重载
对象比较时,比的是引用,所以s3==s4 false
String类重载了运算符:==。与"abc"(String类常量)比较时,比的是value,而不是对象引用,所以s1=="abc" true
HenryY
2003-08-14
打赏
举报
回复
很透彻
alemjann
2003-08-14
打赏
举报
回复
好贴子!丁!
lotofu
2003-08-14
打赏
举报
回复
s1, s2 是常量,常量只分配一个空间。
而s3,s3是新new的变量,各分配一个空间!!!明白?
teaky2002
2003-08-12
打赏
举报
回复
s1,s2,s3,s4都是对象,情况跟老驴说的一样。
ringphone
2003-08-12
打赏
举报
回复
s3,s4其实说起来是指针,所以s3!=s4
whyxx
2003-08-12
打赏
举报
回复
在jdk1.4中,好像已经对String的"=="做过处理,使得String类的==和int,long等类型的==具有相同的功能,也就是说在jdk1.4中,String类的==和equals()应该是一样的结果了
加载更多回复(12)
C++刷
怪
笼(7)
string
类
前面我们对C++的封装这一大特性进行了详细的学习,接下来我们来欣赏C++的另一大杰作——STL容器。其包含许多工具,其中
string
类就是最常见的工具之一。我们为什么要熟练掌握
string
类?首先,C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。
java
String
的经典
问题
(new
String
() ,
String
)
先来看一个例子,代码如下: 1.public class Test { 2. public static void main(
String
[] args) { 3.
String
str = "abc"; 4.
String
str1 = "abc"; 5.
String
str2 = new
String
("ab
C#
String
与
string
的
问题
今天突然用到C#的
string
,突然想起来一直没弄明白
string
和
String
有什么区别,查了一下电子书、MSDN以及百度和Google,更进一步看看
String
的一些
问题
。 0.
问题
: 1. C#到底是什么时候传引用?什么时候传值?2.
String
传值还是传引用3.
string
和
String
有什么区别?4.
String
为什么是Immutable,怎么实现的?以下查询结果以及我的理解:
Java关于
String
问题
1.
string
常量
问题
1.1. 运行时常量池与Class文件常量池区别 JVM对Class文件中每一部分的格式都有严格的要求,每一个字节用于存储那种数据都必须符合规范上的要求才会被虚拟机认可、装载和执行;但运行时常量池没有这些限制,除了保存Class文件中描述的符号引用,还会把翻译出来的直接引用也存储在运行时常量区 java代码编译后,程序会先被编译为.class文件,编译后的字节码文件格式...
Java SE
62,622
社区成员
307,252
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章