这能算是个效率问题不(Java、C++)

zcdabing 2014-06-10 02:37:16

public class shishi
{
public static void main (String args[])
{
String ss = "123";
System.out.println(ss);
fun(ss);
System.out.println(ss);

}
public static void fun(String s)
{
s = "asd"; //为什么不在原内存地址修改内容,而要新开辟内存空间再改变指向?
}
}


对比C++

#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;

void fun(string &s)
{
s = "asd";
}


int _tmain(int argc, _TCHAR* argv[])
{
string ss = "123";
cout<<ss<<endl;
fun(ss);
cout<<ss;

return 0;
}



结果完全不同,有没有知道改如何理解这点区别的
...全文
190 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zcdabing 2014-06-10
  • 打赏
  • 举报
回复
引用 9 楼 preferme 的回复:
我日,Java的引用和C++中的引用,不是一个概念。 C++的引用,传的是地址或者说是指针, Java的引用,没有指针的概念,不会传地址或者指针过去的。 只是一个称谓而已,你别当真啊。
额,以后再也不会当真了
俺是小王子 2014-06-10
  • 打赏
  • 举报
回复
引用 7 楼 zcdabing 的回复:
[quote=引用 2 楼 benma378 的回复:] 你把C++版本的引用&去掉结果应该就一样了吧~~~~~ 没看出差别在哪,请明示
去掉之后就不是引用了啊 String 不是引用数据类型吗 这两段代码,JAVA的赋值失败,C++赋值成功 [/quote] Java里String不算是纯粹意义的引用数据类型吧 坐等专家解释~~~ 我没有非常肯定的语气来回答了,只是自己的一些想法~~~
俺是小王子 2014-06-10
  • 打赏
  • 举报
回复
引用 5 楼 vnvlyp 的回复:
本来Java绝对效率就不如C/C++,你要说这是个效率问题,那垃圾回收,各种错误预防机制,超多层次各种封装继承更是致命的效率问题,学Java重点是实现和算法,能正确实现的代码比你有效率但Bug百出的代码强一百倍,使用优秀算法的Java程序效率往往能比小白C/C++程序员写出的垃圾算法程序强好多倍,一味质疑某种语言效率是没有意义的,同样只抓细枝末节而忽视全局的优化是愚蠢的,大师高德纳说过,过早优化是一切邪恶之源。 回到问题本身,首先在C/C++中,一切关于指针的操作都是危险的,它有可能指到系统保护区或其他乱七八糟的地方如果你不注意,所以Java里直接废了指针。而且你那个C++代码,看似没问题,但实际上为了那一点效率你要牺牲很多安全性,比如string重新赋值的时候有可能越界,而C/C++自身不提供越界保护,但Java不能容忍这样的情况。再者Java里的String和C++里的String有很大区别,Java的String是不可变值的,也就是一个String对象的值永远只有一个,你重新赋值的话实际上是重新创建一个对象。你要像C/C++那样操作String,唯一相近的只有char数组,你可以对char数组进行修改它不会重新开辟内存空间,或者按照OOP的原则可以使用StringBuffer和StringBuilder。 总之C/C++是用安全性来换取最大的自由,他们充分相信每个程序员都能做优秀的程序员,但实际情况并不是这样,所以Java诞生了,它牺牲了很多自由但换取了高度的安全性和开发效率。学一种语言就要理解它的精髓和意义,你总是用另一种语言的思维来思考一种语言是学不好这种语言的,这个道理和为什么很多人学了十几年的英语都基本还是个半哑巴半聋子是一样的,因为他们学英语总是要问中文是什么意思,总是抱着各种汉英英汉词典,各种单词书语法书,却从来没有真正用过英文来感知世界。
让我膜拜一下吧~~~~理解到位~但是略笼统~
vnvlyp 2014-06-10
  • 打赏
  • 举报
回复
引用 6 楼 zcdabing 的回复:
[quote=引用 5 楼 vnvlyp 的回复:] 本来Java绝对效率就不如C/C++,你要说这是个效率问题,那垃圾回收,各种错误预防机制,超多层次各种封装继承更是致命的效率问题,学Java重点是实现和算法,能正确实现的代码比你有效率但Bug百出的代码强一百倍,使用优秀算法的Java程序效率往往能比小白C/C++程序员写出的垃圾算法程序强好多倍,一味质疑某种语言效率是没有意义的,同样只抓细枝末节而忽视全局的优化是愚蠢的,大师高德纳说过,过早优化是一切邪恶之源。 回到问题本身,首先在C/C++中,一切关于指针的操作都是危险的,它有可能指到系统保护区或其他乱七八糟的地方如果你不注意,所以Java里直接废了指针。而且你那个C++代码,看似没问题,但实际上为了那一点效率你要牺牲很多安全性,比如string重新赋值的时候有可能越界,而C/C++自身不提供越界保护,但Java不能容忍这样的情况。再者Java里的String和C++里的String有很大区别,Java的String是不可变值的,也就是一个String对象的值永远只有一个,你重新赋值的话实际上是重新创建一个对象。你要像C/C++那样操作String,唯一相近的只有char数组,你可以对char数组进行修改它不会重新开辟内存空间,或者按照OOP的原则可以使用StringBuffer和StringBuilder。 总之C/C++是用安全性来换取最大的自由,他们充分相信每个程序员都能做优秀的程序员,但实际情况并不是这样,所以Java诞生了,它牺牲了很多自由但换取了高度的安全性和开发效率。学一种语言就要理解它的精髓和意义,你总是用另一种语言的思维来思考一种语言是学不好这种语言的,这个道理和为什么很多人学了十几年的英语都基本还是个半哑巴半聋子是一样的,因为他们学英语总是要问中文是什么意思,总是抱着各种汉英英汉词典,各种单词书语法书,却从来没有真正用过英文来感知世界。
别这么激进好吧,C++刚转JAVA才几天,当然喜欢比较不同,就是想知道这点不同是否合理而已,别的没考虑[/quote] 你直接问Java这样设计的原因嘛,或者与C++的区别什么的,既然关心的不是效率干嘛放在标题里,我现在看到问Java某某操作效率的就激动,因为大多数问题听着就像为什么人要站起来两只脚跑步,四只脚跑岂不是快得多?
冰思雨 2014-06-10
  • 打赏
  • 举报
回复
我日,Java的引用和C++中的引用,不是一个概念。 C++的引用,传的是地址或者说是指针, Java的引用,没有指针的概念,不会传地址或者指针过去的。 只是一个称谓而已,你别当真啊。
zcdabing 2014-06-10
  • 打赏
  • 举报
回复
引用 3 楼 ygycomon 的回复:
void fun(string &s)引用的是地址,java里没有指针,不引用地址,对于对象的操作是值引用
这个值引用是什么意思啊 能不能说下JAVA的引用和C++引用的区别的 新手没搞懂啊
zcdabing 2014-06-10
  • 打赏
  • 举报
回复
引用 2 楼 benma378 的回复:
你把C++版本的引用&去掉结果应该就一样了吧~~~~~ 没看出差别在哪,请明示
去掉之后就不是引用了啊 String 不是引用数据类型吗 这两段代码,JAVA的赋值失败,C++赋值成功
zcdabing 2014-06-10
  • 打赏
  • 举报
回复
引用 5 楼 vnvlyp 的回复:
本来Java绝对效率就不如C/C++,你要说这是个效率问题,那垃圾回收,各种错误预防机制,超多层次各种封装继承更是致命的效率问题,学Java重点是实现和算法,能正确实现的代码比你有效率但Bug百出的代码强一百倍,使用优秀算法的Java程序效率往往能比小白C/C++程序员写出的垃圾算法程序强好多倍,一味质疑某种语言效率是没有意义的,同样只抓细枝末节而忽视全局的优化是愚蠢的,大师高德纳说过,过早优化是一切邪恶之源。 回到问题本身,首先在C/C++中,一切关于指针的操作都是危险的,它有可能指到系统保护区或其他乱七八糟的地方如果你不注意,所以Java里直接废了指针。而且你那个C++代码,看似没问题,但实际上为了那一点效率你要牺牲很多安全性,比如string重新赋值的时候有可能越界,而C/C++自身不提供越界保护,但Java不能容忍这样的情况。再者Java里的String和C++里的String有很大区别,Java的String是不可变值的,也就是一个String对象的值永远只有一个,你重新赋值的话实际上是重新创建一个对象。你要像C/C++那样操作String,唯一相近的只有char数组,你可以对char数组进行修改它不会重新开辟内存空间,或者按照OOP的原则可以使用StringBuffer和StringBuilder。 总之C/C++是用安全性来换取最大的自由,他们充分相信每个程序员都能做优秀的程序员,但实际情况并不是这样,所以Java诞生了,它牺牲了很多自由但换取了高度的安全性和开发效率。学一种语言就要理解它的精髓和意义,你总是用另一种语言的思维来思考一种语言是学不好这种语言的,这个道理和为什么很多人学了十几年的英语都基本还是个半哑巴半聋子是一样的,因为他们学英语总是要问中文是什么意思,总是抱着各种汉英英汉词典,各种单词书语法书,却从来没有真正用过英文来感知世界。
别这么激进好吧,C++刚转JAVA才几天,当然喜欢比较不同,就是想知道这点不同是否合理而已,别的没考虑
vnvlyp 2014-06-10
  • 打赏
  • 举报
回复
本来Java绝对效率就不如C/C++,你要说这是个效率问题,那垃圾回收,各种错误预防机制,超多层次各种封装继承更是致命的效率问题,学Java重点是实现和算法,能正确实现的代码比你有效率但Bug百出的代码强一百倍,使用优秀算法的Java程序效率往往能比小白C/C++程序员写出的垃圾算法程序强好多倍,一味质疑某种语言效率是没有意义的,同样只抓细枝末节而忽视全局的优化是愚蠢的,大师高德纳说过,过早优化是一切邪恶之源。 回到问题本身,首先在C/C++中,一切关于指针的操作都是危险的,它有可能指到系统保护区或其他乱七八糟的地方如果你不注意,所以Java里直接废了指针。而且你那个C++代码,看似没问题,但实际上为了那一点效率你要牺牲很多安全性,比如string重新赋值的时候有可能越界,而C/C++自身不提供越界保护,但Java不能容忍这样的情况。再者Java里的String和C++里的String有很大区别,Java的String是不可变值的,也就是一个String对象的值永远只有一个,你重新赋值的话实际上是重新创建一个对象。你要像C/C++那样操作String,唯一相近的只有char数组,你可以对char数组进行修改它不会重新开辟内存空间,或者按照OOP的原则可以使用StringBuffer和StringBuilder。 总之C/C++是用安全性来换取最大的自由,他们充分相信每个程序员都能做优秀的程序员,但实际情况并不是这样,所以Java诞生了,它牺牲了很多自由但换取了高度的安全性和开发效率。学一种语言就要理解它的精髓和意义,你总是用另一种语言的思维来思考一种语言是学不好这种语言的,这个道理和为什么很多人学了十几年的英语都基本还是个半哑巴半聋子是一样的,因为他们学英语总是要问中文是什么意思,总是抱着各种汉英英汉词典,各种单词书语法书,却从来没有真正用过英文来感知世界。
sleeplacker 2014-06-10
  • 打赏
  • 举报
回复
这是C++比Java灵活的一个表现 C++支持值传递、地址传递和引用传递,而Java只支持值传递,这样C++那段程序就显得高效率。 你的第一段程序中,虽然调用fun方法时参数是引用,但是我们可以把这个引用看成一个值,所以这个值是无法改变的,所以当你在函数体中试图改变这个值时,必然是会失败的;但是C++支持引用传递,所以可以轻松的改变这个引用指向的值。
致知Fighting 2014-06-10
  • 打赏
  • 举报
回复
void fun(string &s)引用的是地址,java里没有指针,不引用地址,对于对象的操作是值引用
俺是小王子 2014-06-10
  • 打赏
  • 举报
回复
你把C++版本的引用&去掉结果应该就一样了吧~~~~~ 没看出差别在哪,请明示
sunbo624 2014-06-10
  • 打赏
  • 举报
回复
因为Java声明Xxx x声明的是引用

62,634

社区成员

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

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