Java类的方法参数为字符串、字符串数组

前言

在看廖雪峰老师的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舍弃了指针,但是我觉得还是有指针的概念的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值