MyException - 我的异常网
当前位置:我的异常网» J2SE » 请问一个字符串和数组的值和引用的有关问题

请问一个字符串和数组的值和引用的有关问题

www.MyException.Cn  网友分享于:2013-02-14  浏览:11次
请教一个字符串和数组的值和引用的问题
请先看第一段代码
String []name3 = new String[]{"james","jerry"};
String []name4 = new String[2];
name4 = name3;
name4[0] = "lucy";
for(int i=0;i<name3.length;i++){
System.out.print(name3[i]+"\t");
}
输出结果 lucy jerry 我修改第二个数组的首位元素第一个数组的首位元素也跟着改变了

第二段代码
String name1 = new String("james");
String name2 = new String();
name2 = name1;
name2 = "lucy";
System.out.println(name1);
输出结果 james

我的问题是同样是引用数据类型为什么name3[0]的值就跟着变了,而name1的值没变呢?

------解决方案--------------------
首先name1 name2利用new的时候在堆区创建两个String对象,然后将引用赋值给name1 name2,然后执行name2=name1是将name2的引用的指向跟name1相同,这时候打印name2 name1的值都会是空字符串
接下来name2="lucy",因为String是不可变类,实际上堆区的空字符串对象没有改变,JVM在堆区重新创建的一个String对象内容是lucy并让name2的获得其引用,而name1的引用还是指向原来的内存地址(空字符串)
因此name2="lucy"因为重新开了一个String对象,name2值变化,而name1的引用对象没有销毁,还是原来的空值
------解决方案--------------------
对字符串进行操作的时候是针对对象的引用,并不是对象的本身
------解决方案--------------------
数组那个给你解释下,name3 name4都是数组名,理解为JVM解释执行数组对象的引用,两个数组长度一致,执行name4=name3之后两个数组的内容就会完全一样,因为你遍历数组比如检索name3[1]还是通过name3这个引用找name2[1],也是说说执行name4=name3之后 name3 name4里面元素的数组引用是朝向了同样的地址
并且因为是数组地址的引用,两者元素的指向会保持同步,不会像String类型一样会指向不同地方

探讨
里面的数组每个元素也是String类型性的,这有什么区别么?

------解决方案--------------------
name4 = name3
不是将name3里的元素考到name4中
而是将name4这个引用也指向name3指向的对象数组
你如果做
name4 = name3
上面一行的new String[2]可以省略
------解决方案--------------------
楼主 :第二个你应该是明白的吧,就说第一个吧。
首先 name3 指向----->name3[0]与name3[1]又是一个引用,而 name4指向--------->name4[0],name4[1]两个引用。
 通过赋值后 ,name4----->name3[0]与name3[1],name4就不能指向>name4[0],name4[1]这连个两个引用了。
因此name4[0]与name3[1]实际就是一个引用了。name4[0]与name3[0] 实际上是同一个内存单元。

而在第二个中name1 与name2 的引用占用的两个不同的内存地址。
name2中 每创建一个一个对象 或者赋值一个引用 他的值都会变化 。而name1中一直没得改变。
------解决方案--------------------
第一个两个引用指向的是同一个对象,对对象的任何修改都会引起两个引用引用的对象值的变化。

第二个问题,你是吧引用指向了另外一个对象了。
------解决方案--------------------
建议你看一下值传递那一块的描述

name4 = name3;//这里传递的是引用变量的地址值,也就是二个引用变量指向了同一个String数组对象



name2 = "lucy";//name2又重新引用了"Lucky"对象了 而name1没有改变

文章评论

程序员必看的十大电影
程序员必看的十大电影
10个调试和排错的小建议
10个调试和排错的小建议
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
鲜为人知的编程真相
鲜为人知的编程真相
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
代码女神横空出世
代码女神横空出世
一个程序员的时间管理
一个程序员的时间管理
那些争议最大的编程观点
那些争议最大的编程观点
中美印日四国程序员比较
中美印日四国程序员比较
为什么程序员都是夜猫子
为什么程序员都是夜猫子
如何成为一名黑客
如何成为一名黑客
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
每天工作4小时的程序员
每天工作4小时的程序员
程序员都该阅读的书
程序员都该阅读的书
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
程序员和编码员之间的区别
程序员和编码员之间的区别
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
我的丈夫是个程序员
我的丈夫是个程序员
我是如何打败拖延症的
我是如何打败拖延症的
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
老程序员的下场
老程序员的下场
总结2014中国互联网十大段子
总结2014中国互联网十大段子
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
Java程序员必看电影
Java程序员必看电影
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
漫画:程序员的工作
漫画:程序员的工作
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
编程语言是女人
编程语言是女人
 程序员的样子
程序员的样子
程序员的鄙视链
程序员的鄙视链
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
程序员应该关注的一些事儿
程序员应该关注的一些事儿
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有