String类型函数传递问题(string 值传递)

  本篇文章为你整理了String类型函数传递问题(string 值传递)的详细内容,包含有string类的函数 string 值传递 string类型作为参数传入方法,值会改变吗 string做参数传递 String类型函数传递问题,希望能帮助你了解 String类型函数传递问题。

  以前没有注意过的一个问题, 最近在使用String类型作为函数入参的时候, 发现函数内对于String类型的改变并不会影响到外层调用对象本身;

  结论 (先说结论)

  这个问题根本不存在 (属于是自己把自己绕进去了);

  String类型与普通的java对象一样, 只不过是用final修饰的不可变对象 (具体看String类型的源码与相关介绍);

  测试数据(为什么会有这个问题, 来源于以下操作)

  发现String (其实Integer, Long... 等等这些类型也会这样)函数传递修改后, 对象的值并没有被改变;

  主要是因为String类型与Integer...等等这些类型的赋值方式迷惑了我们, 不需要通过"new"关键字和反射也可以构建对象;

  比如: Integer a = 123; 这种操作, 让我们误当作基本类型赋值(实际上这个问题比较基础, 但有时候也会迷糊);

  以下是对上述的操作案例;

  

package timer;

 

   * @author liwangcai E-mail:1252376504@qq.com

  public class StringDemo {

   public static void changeString(String tmp) {

   //此处操作具有一定的迷惑行为, 通常情况下只有基本数据类型才会这么操作;

   //但是对与String类型, 相当于新建了一个对象或者是拿到了常量池中的对象;

   tmp = "new";

   //打印通过函数传递进来的tmp参数的地址

   System.out.println(System.identityHashCode(tmp));

   public static void changeInteger(Integer tmp) {

   //此处操作和String类型一样

   tmp = 199;

   //打印通过函数传递进来的tmp参数的地址

   System.out.println(System.identityHashCode(tmp));

   public static void changeOther(StringDemo stringDemo) {

   System.out.println(System.identityHashCode(stringDemo));

  
//此处实际上是java的自动装箱, 相当于调用了valueOf函数

  // 实际上是new了一个Integer对象出来,或者将另一个Integer对象直接赋值(可以去看一下Integer的源码)

  a = 123;

  //基础类型的直接赋值

  int b;

  b = 123;

  //与Integer类似,String类型也有常量池, 相当于缓存, 此处不是重点;

  // 相当于new了一个对象出来, 或将另一个String对象直接赋值;

  String c;

  c = "abc"

  

 

  普通对象操作对比

  

/**

 

   * @author liwangcai E-mail:1252376504@qq.com

  public class StringTest {

   public static void changeUser(User user) {

   user = new User("zhang san", 24);

  
String对象是普通的Java对象, 不过是被final修饰了;

  实际上String对象的值存在其内部的char value[]数组中,如果想要改变String的值应该区修改这个数组的数据;

  不过上述数组是使用final修饰的, 所以如果使用jdk中的String类, 那么String的值是无法被修改的;

  如果要改变String的值应该怎么做?

  实现自己的String类型, 内部存储char[]数组不设置为final类型就可以了;

  

/**

 

   * @author liwangcai E-mail:1252376504@qq.com

  public class MyStringTest {

   public static void main(String[] args) {

   MyString myString = new MyString(new char[]{a, b});

   System.out.println(myString);

   changeMyString(myString);

   System.out.println(myString);

   private static void changeMyString(MyString myString) {

   myString.setValue(new char[]{c, d});

  
对于String,Integer类型 "=" 操作符号迷惑了我们, 实际上一开始提出的问题并不存在;

  如果要修改同一个对象, 需要修改其内的成员;

  以上就是String类型函数传递问题(string 值传递)的详细内容,想要了解更多 String类型函数传递问题的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: