• string,char的传递


    从一道面试题开始:

     1 public class test1{
     2     String str=new String("good");
     3     char[] ch={'a','b','c'};
     4     public static void main(String[] args){
     5         test1 ex=new test1();
     6         ex.change(ex.str,ex.ch);
     7         System.out.println(ex.str+"and");
     8         System.out.println(ex.ch);
     9     }
    10     public void change(String str,char ch[]){
    11         str="test ok";
    12         ch[0]='g';
    13     }
    14 }

    运行的结果是

    goodand
    gbc

    这道题很简单,主要考察的是值传递与引用传递,我想大家都很清楚。

    由这道题出发,我主要想讨论一下的是string和char[]传递的区别。虽然string不属于基本数据类型,理应是引用传递,但为什么会出现上面的结果。

    为此,我们再看一段代码 :

     1 class test1{
     2     public static void main(String[] args){
     3         String s="aa";
     4         int i=System.identityHashCode(s);
     5         System.out.println(i);
     6         System.out.println("-----------------");
     7         test(s);
     8     }
     9     public static void test(String s){
    10         int i=System.identityHashCode(s);
    11         System.out.println(i);
    12         System.out.println("-----------------");
    13         s="dd";
    14         int j=System.identityHashCode(s);
    15         System.out.println(j);
    16     }
    17 }

    运行结果为

    366712642
    -----------------
    366712642
    -----------------
    1829164700

    从上面4、5和10、11可以看出,当初始传过去的时候,main中的s和test中的s指向同一个地址,当我们给s赋值后,s指向了另一区间。为了说明问题,我们再看看char[]传递:

     1 class test1{
     2     public static void main(String[] args){
     3         char[] a={'1'};
     4         int i=System.identityHashCode(a);
     5         System.out.println(i);
     6         System.out.println("-----------------");
     7         test(a);
     8     }
     9     public static void test(char[] s){
    10         int i=System.identityHashCode(s);
    11         System.out.println(i);
    12         System.out.println("-----------------");
    13         s[0]='d';
    14         int j=System.identityHashCode(s);
    15         System.out.println(j);
    16     }
    17 }

    结果为

    366712642
    -----------------
    366712642
    -----------------
    366712642

    char[]传递的三个结果是一样的,为此我们可以明白了最初的面试题的结果。

    总结:string传递过去后和原变量指向同一地址,但当给string赋值后string指向了不同的地址,这正是string的不变性,对这一点可以做如下解释,

          当给string赋值时会先去常量池里去找有没有这一变量,如果有,就让string指向这一地址,如果没有则新开辟一个。如下代码:

    class test1{
        public static void main(String[] args){
            String s="1";
            int i=System.identityHashCode(s);
            System.out.println(i);
            System.out.println("-----------");
            String s1="1";
            int i1=System.identityHashCode(s1);
            System.out.println(i1);
        }
        
    }
    结果
    366712642
    -----------
    366712642
  • 相关阅读:
    java 测试 (junit+ junit 断言 + postman)
    junit 运行(eclipse + IDEA)
    junit 常用注解 + junit 断言详解
    工作周报模板
    spring boot tomcat 部署
    spring boot 集成JSP
    spring boot 集成 Mybatis,JPA
    JPA 常用注解
    员工年终绩效考核表模板
    2013 Noip提高组 Day1
  • 原文地址:https://www.cnblogs.com/Jc-zhu/p/4052468.html
Copyright © 2020-2023  润新知