当前位置: 代码迷 >> J2SE >> 一道简单的面试题,该怎么解决
  详细解决方案

一道简单的面试题,该怎么解决

热度:74   发布时间:2016-04-23 20:47:36.0
一道简单的面试题

public class Example {
String str = new String("good");
char[] ch = { 'a', 'b', 'c' };

public static void main(String[] args) {
Example example = new Example();
example.change(example.str, example.ch);
System.out.print(example.str + " and ");
System.out.println(example.ch);
}

public void change(String str, char ch[]) {
str = " test ok";
ch[0] = 'g';
}
}

请问为什么输出的结果是:good and gbc?
为什么String类型的值没有改,而char数组类型里面的值却改了?
虚心求助大神!
------解决方案--------------------
java当中都是值传递的。当一个对象[A]被当做参数传递以后,只是将对象[A]的一个副本传递给了方法。
原本对象[A]和副本对象[A]都指向同一块地址,当副本对象[A]被指向了一个new的对象,则副本对象[A]指向地址就变了,而原本对象[A]还是在指向原来的地址。
原本对象ch[]和副本对象ch[]也是指向同一块地址,但是ch[0]是对地址中的值进行操作,所以当ch[0]被改变时,原本对象ch[]和副本对象ch[]指向的同一块地址中记录的值就被改变了。

总结一点就是:值改变和地址改变。

具体请参考:http://www.cnblogs.com/clara/archive/2011/09/17/2179493.html
------解决方案--------------------
给楼主增加一下难度:
public static void main(String[] args) {      
StringBuilder str1=new StringBuilder("AAA");
StringBuilder str2=new StringBuilder("BBB");
StringBuilder str3=new StringBuilder("CCC");
change(str1,str2,str3);
System.out.println("str1是:"+str1);
System.out.println("str2是:"+str2);
System.out.println("str3是:"+str3);
}
public static void change(StringBuilder str1,StringBuilder str2,StringBuilder str3) {  
str3=str1;
str1=str2;
str2=str3;
str1.append("1");
str2.append("2");
}
------解决方案--------------------
String对象一个重要的特性就是永久性(定长的),一旦创建就不能被改变,让一个字符串发生变化,其实就是引用了另外一个字符串,比如
String str =“abc”;System.out.println(str.hashCode());str="bcd";System.out.println(str.hashCode());
显然不可能对同一个对象引用。
------解决方案--------------------
一个个参数是String类型,String是引用类型,str指向一个String对象good,String是final类型,所以方法里的str是str引用的一个拷背(两个str不是同一个对象),因为String是final类型,所以方法里的" test ok";其实是新创建的另一个对象,和"good";不是同一个对象.所以并没有改变原来的值.同理方法里的ch也是ch引用的一个拷背(两个引用不是同一个对象),但是两个引用指向的是同一个对象{ 'a', 'b', 'c' },所以会改变原来的值.
  相关解决方案