java版严重的问题,新鸟老鸟都进来看看吧

awfe 2003-11-26 10:55:12
曾经有一个帖子《对Java参数传递不懂的请进来!》里面给出一个地址http://www.csdn.net/Develop/read_article.asp?id=22025,里面介绍了关于传参的问题。很受初学者的欢迎。我没事也看了一下,一看大吃一惊。里面写道:
“因此,你只要按上面的方法去分析,就会发现String对象和基本类型一样,一般情况下作为参数传递,在方法内改变了值,而原对象是不会被改变的。”

这句话有明显的问题。java中的传参,基本类型是传递他的数值,而对象类型是传递他实例的内存地址,这个也是个数值。这也就是平常所说java是传值的。

上面那句“就会发现String对象和基本类型一样”所说的是什么意思呢,很难让人理解。我想作者的意思是想说明“在方法内改变了值,而原对象是不会被改变的”这个现象看起来是一样的。但是这样的说法非常不妥。这是我联想起来最近有很多人在给别人回帖的时候写道,“String和基本类型传参是一样的”这样的错误说法,估计其中有部分是受到那篇文章的误导。

“在方法内改变了值,而原对象是不会被改变的”并不是它传参的原因,而是他是“immutable”的原因。所以我觉得作者不应该在关于传参这个标题下谈论这点,如果非要谈论就一定要说清楚,否则会误导很多人的

我只是看了那帖子的回复,发现有很多人看过了,但是没有一个人提出问题,担心有许多无辜的初学者被误导了。所以在这里发这个帖子澄清一下,希望yuanmeng163 (今天我有空) 不要见怪,有问题请和我联系。

顺便说一句“String str = “Hello”; 等价于String str = new String(“Hello”);”这句话也有问题
...全文
69 78 打赏 收藏 转发到动态 举报
写回复
用AI写文章
78 条回复
切换为时间正序
请发表友善的回复…
发表回复
anis0444 2003-12-08
  • 打赏
  • 举报
回复
mark
CharlesWang 2003-12-08
  • 打赏
  • 举报
回复
int count = 1000000;

long start = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
String str = "AAA" + String.valueOf(i);
}
long end = System.currentTimeMillis();

long d1 = end - start;

start = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
String str = new String(String.valueOf(i) + "AAA" );
}
end = System.currentTimeMillis();

long d2 = end - start;

System.out.println("1 cost : " + d1 + " ms");
System.out.println("2 cost : " + d2 + " ms");

1 cost : 1234 ms
2 cost : 1516 ms
alienbat 2003-12-08
  • 打赏
  • 举报
回复
再发句牢骚。中国的程序员不仅水平低,素质更低。难怪拿那么低的工资。
alienbat 2003-12-08
  • 打赏
  • 举报
回复
to kinzey34(无声之舞)
如果你不懂java就不要跑出来出丑。你根本就没有弄清楚基本变量类型和对象型变量的区别。
另外告诉你,我是SCWCD,对于String变量我想我有发言权;并且我的论据也不是我独创的。如果你没有看过《Effective java》这本书,就请不要来这里冒充高手。
xiaohaiz 2003-12-08
  • 打赏
  • 举报
回复
TO CharlesWang(秘峰) :
呵呵,这个问题和你的执行顺序有关系。当初为了图省事,把这两个放在一起写。实际上不应该这么做。放在一个代码段中,后面String str = new String(...)执行的时候这些字符串都已经被被第一次循环产生过了。虚拟机的实现提供了这个缓存的机制。
不信俺们把执行顺序换一下,在俺的PII.266,RHEL AS 3下面count=10000运行结果:
<<
1 cost : 266 ms
2 cost : 75 ms
>>
相差更远了。呵呵。

当初为了图省事,没有想到真的有较真的朋友。这样的测试应该写到两个不同的java中,各自运行一次才比较公正的。

<<BTW,不知道和JIT的编译实现是否有关系,这里不敢确认。>>
donitz 2003-12-08
  • 打赏
  • 举报
回复
这样讨论的帖子太好了,希望以后能够多看到这样的帖子,这样我们就会进步的更快,基础知识也更牢固。
CharlesWang 2003-12-08
  • 打赏
  • 举报
回复
int count = 1000000;
long start = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
String str = "AAA" + String.valueOf(i);
}
long end = System.currentTimeMillis();
long d1 = end - start;

start = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
String str = new String("AAA" + String.valueOf(i));
}
end = System.currentTimeMillis();

long d2 = end - start;

System.out.println("1 cost : " + d1 + " ms");
System.out.println("2 cost : " + d2 + " ms");

count = 10000
1 cost : 32 ms
2 cost : 15 ms

1 cost : 31 ms
2 cost : 15 ms
count = 100000
1 cost : 203 ms
2 cost : 156 ms

1 cost : 140 ms
2 cost : 157 ms
count = 1000000
1 cost : 1250 ms
2 cost : 1484 ms

1 cost : 1234 ms
2 cost : 1500 ms

谁能解释一下?
binny 2003-12-08
  • 打赏
  • 举报
回复
这帖子怎么没人顶了?我来
xiaohaiz 2003-11-27
  • 打赏
  • 举报
回复
[小更正]
应该是 :
<<public String toString() {return "I am anonymous.";}>>
俺也依葫芦画瓢。:)
xiaohaiz 2003-11-27
  • 打赏
  • 举报
回复
TO alemjann(裸睡) :
呵呵,原来你这么解释。
俺也说说俺的看法:在我看来,new String(charArray)这个不叫做匿名对象。它确实没有直接引用到它的变量,但是它还是java.lang.String对象。它还是有一个名字叫做“java.lang.String”,所以俺的观点并不认为这是匿名对象。
俺认为的匿名对象是类似这样的:
<<
Object obj = new Object() {
public String toString("I am anonymous.");
};
>>
这里的obj才是一个匿名的对象,它从java.lang.Object派生出来,override了toString方法,但是自己又没有名字,所以叫做匿名对象。
以上是俺的看法,不知以为如何?
cxyPioneer 2003-11-27
  • 打赏
  • 举报
回复
String str = “Hello”; 等价于String str = new String(“Hello”);
这句话尚有问题,第二个是用String的包装类来构造它
alemjann 2003-11-27
  • 打赏
  • 举报
回复
[小更正]
应该是int integer = ...
alemjann 2003-11-27
  • 打赏
  • 举报
回复
char[] charArray = {'1', '2', '3', '4', '5'} ;
Integer integer = Integer.parseInt(new String(charArray)) ;//parseInt()方法的参数就是匿名对象。


当然也可以利用String是静态的这点来避免用new关键字:
Integer integer = Integer.parseInt(String.copyValueOf(charArray)) ;
-------------------------------------------------------------------------
xiaohaiz(老土进城,两眼通红)

我可没说过"继承"两个字。不过还是象听听你的见解。
truezerg 2003-11-27
  • 打赏
  • 举报
回复
呵呵,谈传参怎么谈到String上来了。 ^_^
xiaohaiz 2003-11-27
  • 打赏
  • 举报
回复
呵呵,String那里能作为匿名类使用?String本身就是final的,怎么匿名继承。“alemjann(裸睡)”的观点不知从何而来?
binny 2003-11-27
  • 打赏
  • 举报
回复
楼上的能说说有什么好处吗?
cql0007 2003-11-27
  • 打赏
  • 举报
回复
为了JAVA版的繁荣昌盛,顶!!!!
wb10000cn 2003-11-27
  • 打赏
  • 举报
回复
这样的讨论越多越好,
我们只有在交流中才能快速进步
像我现在是感觉插不上嘴的
不过希望我很快能赶上:)
tangxc2003 2003-11-27
  • 打赏
  • 举报
回复
这里真热闹啊!
HurricanDavidLiu 2003-11-27
  • 打赏
  • 举报
回复
学了不少,顶
加载更多回复(58)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧