前言
在看廖雪峰老师的Java教程,有个疑问在心头挥之不去,类的方法参数为字符串时,改变main函数中原本的String,并不会改变类的实例中的String。但是为字符串数组时,却改变了类的实例中的String[].
所以,做个测试即可知道为什么了。
方法参数为String时
package BasicTest;
public class ConstantTest {
public static void main(String[] args) {
Person person = new Person();
String str = new String("Main");
person.setName(str);
System.out.print("main的字符串 为: ");
System.out.print(str);
System.out.print(" 哈希码为:");
System.out.println(System.identityHashCode(str));
System.out.print(" 类的字符串为: ");
System.out.print(person.name);
System.out.print(" 哈希码为:");
System.out.println(System.identityHashCode(person.name));
str = "Main-two";
System.out.print("main的字符串为: ");
System.out.print(str);
System.out.print(" 哈希码为:");
System.out.println(System.identityHashCode(str));
System.out.print(" 类的字符串为: ");
System.out.print(person.name);
System.out.print(" 哈希码为:");
System.out.println(System.identityHashCode(person.name));
}
}
class Person {
public String name;
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
运行结果
main的字符串 为: Main 哈希码为:460141958
类的字符串为: Main 哈希码为:460141958
main的字符串为: Main-two 哈希码为:1163157884
类的字符串为: Main 哈希码为:460141958
分析
可以看出,改变了main函数中的String后,Person实例中的Stirng的地址是不变的,指向的还是原来的内存地址,因此仍然是“Main”
方法参数为String[ ]时
package BasicTest;
public class ConstantTestTwo {
public static void main(String[] args) {
PersonTwo person = new PersonTwo();
String[] strArray = new String[] {"One", "Two", "Three"};
person.setName(strArray);
System.out.print("main的字符串 为: ");
System.out.print(strArray[0]);
System.out.print(" ");
System.out.print(strArray[1]);
System.out.print(" ");
System.out.print(strArray[2]);
System.out.println(" ");
System.out.print(" 哈希码为:");
System.out.print("strArray: ");
System.out.println(System.identityHashCode(strArray));
System.out.print("strArray[0]: ");
System.out.println(System.identityHashCode(strArray[0]));
System.out.print("strArray[1]: ");
System.out.println(System.identityHashCode(strArray[1]));
System.out.print("strArray[2]: ");
System.out.println(System.identityHashCode(strArray[2]));
System.out.print("类的字符串 为: ");
System.out.print(person.name[0]);
System.out.print(" ");
System.out.print(person.name[1]);
System.out.print(" ");
System.out.print(person.name[2]);
System.out.println(" ");
System.out.print(" 哈希码为:");
System.out.print("person.name: ");
System.out.println(System.identityHashCode(person.name));
System.out.print("person.name[0]: ");
System.out.println(System.identityHashCode(person.name[0]));
System.out.print("person.name[1]: ");
System.out.println(System.identityHashCode(person.name[1]));
System.out.print("person.name[2]: ");
System.out.println(System.identityHashCode(person.name[2]));
strArray[1] = "change";
System.out.println("\n################分界线################################");
System.out.print("main的字符串 为: ");
System.out.print(strArray[0]);
System.out.print(" ");
System.out.print(strArray[1]);
System.out.print(" ");
System.out.print(strArray[2]);
System.out.println(" ");
System.out.print(" 哈希码为:");
System.out.print("strArray: ");
System.out.println(System.identityHashCode(strArray));
System.out.print("strArray[0]: ");
System.out.println(System.identityHashCode(strArray[0]));
System.out.print("strArray[1]: ");
System.out.println(System.identityHashCode(strArray[1]));
System.out.print("strArray[2]: ");
System.out.println(System.identityHashCode(strArray[2]));
System.out.print("类的字符串 为: ");
System.out.print(person.name[0]);
System.out.print(" ");
System.out.print(person.name[1]);
System.out.print(" ");
System.out.print(person.name[2]);
System.out.println(" ");
System.out.print(" 哈希码为:");
System.out.print("person.name: ");
System.out.println(System.identityHashCode(person.name));
System.out.print("person.name[0]: ");
System.out.println(System.identityHashCode(person.name[0]));
System.out.print("person.name[1]: ");
System.out.println(System.identityHashCode(person.name[1]));
System.out.print("person.name[2]: ");
System.out.println(System.identityHashCode(person.name[2]));
}
}
class PersonTwo {
public String[] name;
public void setName(String[] name) {
this.name = name;
}
}
运行结果
main的字符串 为: One Two Three
哈希码为:strArray: 460141958
strArray[0]: 1163157884
strArray[1]: 1956725890
strArray[2]: 356573597
类的字符串 为: One Two Three
哈希码为:person.name: 460141958
person.name[0]: 1163157884
person.name[1]: 1956725890
person.name[2]: 356573597
################分界线################################
main的字符串 为: One change Three
哈希码为:strArray: 460141958
strArray[0]: 1163157884
strArray[1]: 1735600054
strArray[2]: 356573597
类的字符串 为: One change Three
哈希码为:person.name: 460141958
person.name[0]: 1163157884
person.name[1]: 1735600054
person.name[2]: 356573597
Process finished with exit code 0
分析
当参数为String[]时,改变String数组中某一个值,改变的是对应内存地址的值,字符串数组中存放的是三个地址(指针)。尽管说Java舍弃了指针,但是我觉得还是有指针的概念的。