字符串传递的问题
来源:互联网 发布:mac绘图软件 编辑:程序博客网 时间:2024/05/22 18:06
这个问题大家肯定碰到了很多了。今天来讲点原理性的,方便大家的理解。
首先来看个例子:
最常见的问题是结果怎么是javajavac呢??很多人把这个原因归结为callby value还是call by reference的问题,其实并非如此。
首先java对象都是建立在heap上的,对java对象的传递规定使用callby reference,所以String和StringBuffer都是call byreference,可以参考《thinking injava》,这是完全没有争议的。因此StringBuffer输出了call byreference的正确值javac;但同时看到String却没有输出lava,因此你可能会误认为String是callbyvalue的,这是一个概念性的错误。String是一个特殊的类,特殊在它用了final关键字修饰,也就是说每个String都是不变的(immutable)。你可能会问像s= s +"abc";这样的语句String变了。那么,分析下这句话就知道了,虚拟机新分配一段空间,将s这个引用指向的字符串和另一个字符串abc拿出来拼在一起装在这个空间中,之后将s指向这个空间,所以String实际上没变,注意到第一个String是s的老空间,第二个String是"abc",第三个字符串是s+ "abc",它们三个的地址都不同。
回过头来解决上面这个问题。当String被传进stringReplace()后多了一个引用text指向原引用textString,这时我们对text进行操作text=text.replace("j","l");当执行完后新分配了一个存储空间放"lava",text指向这个存储空间,但接下来函数执行完返回。可以想像结果,因为String的特殊性,text并没有操作了原来那个字符串(textString指向的那个),而是在一个新的地址,所以原来那个textString仍然不变,输出自然也不会变。
如果要得到改变了的值,那么就需要把地址传回来,具体代码如下:
呵呵,就写到这里吧,希望通过这么一讲能够让我们少犯点错误。
- 字符串传递的问题
- RPC由客户端到服务器传递字符串的问题
- vb.net 调用c++dll的 字符串传递问题
- 传递过来的字符串
- java密钥字符串byte[]传递问题
- jQuery ajax传递特殊字符串问题
- js拼接传递参数字符串问题
- 数据传递的问题
- C# 调用 C++ dll 函数 时传递字符串 需要注意的问题
- C# 调用 C++ dll 函数 时传递字符串 需要注意的问题
- 实习笔记6 WebService Axis2 传递Gzip压缩后的字符串乱码问题
- 关于多张图片分单张传递返回拼接字符串的问题
- Java的方法的参数传递,值传递和引用传递还有String字符串传递
- javascript中值传递,地址传递,引用传递的问题。
- java的参数传递问题。
- c# 参数的传递问题
- 函数指针的传递问题
- 单选框传递值的问题
- asp.net 2.0中TREEVIEW中动态增加结点
- 判断TextBox中的内容是否为正确的日期的方法
- ASP .NET - ArrayList对象
- 获取ul参数
- ADO.NET中的视图和过滤器
- 字符串传递的问题
- ADO.NET在开发中的部分使用方法和技巧
- Windows API大全
- 妈妈写给热恋中的女儿的信!建议女孩都要看!
- Spring2.5+Struts2+Jpa(Hibernate实现)整合之四
- smartforms替代table的方案!
- 超经典电影语录13句
- Ajax无刷新实现图片切换特效
- 常用数据库的连接方式