什么是引用复制技术以及为什么不更改字符串对象引用值?

时间:2012-06-05 12:18:10

标签: java

* 强文 *什么是参考复制技术?

The reference copying technique is much more difficult to use for mutable objects, because if any user of a reference to a mutable object changes it, all other users of that reference will see the change

另一件事我在下面测试了示例代码,用于传值和& pass-by-reference。原始值是值传递,对象引用是pass-by-reference。在示例中,我测试了一个字符串,String对象,String缓冲区,int,ArrayList。

          String s="foo";
    String sample1=new String("dog");
    StringBuffer sb=new StringBuffer();
    sb.append("abc");
    ArrayList l=new ArrayList();
    l.add("ssss");
    l.add("bbbb");
    l.add("ssbbbss");
    l.add("bbbb");
    l.add("bbbb");
    int k=14,listsize=0;
    listsize=l.size();
    TesingPrimitivRefernce.generateString(s);
    TesingPrimitivRefernce.generateString(sample1);
    TesingPrimitivRefernce.generateStringBuilder(sb);
    TesingPrimitivRefernce.generateInt(k);
    TesingPrimitivRefernce.generateNewList(l);
    System.out.println("String============"+s+" String Buffer========"+sb+" String object "+sample1);
    System.out.println("int Primitive Values==="+k);
    System.out.println("Orignal List Size"+listsize+" After called method List Size=========="+l.size());


 public static void generateString(String s){
       s=s.concat("d");
   }
   public static void generateStringBuilder(StringBuffer s){
       s=s.append("d");

   }
   public static void generateInt(int s){
       s=10;

   }
   public static void generateNewList(ArrayList list){
      list.remove("bbbb");

   }

我怀疑是在调用 * TesingPrimitivRefernce.generateString(sample1)之后没有更改String对象(**即变量sample1 )。 但是在arraylist我删除了值“bbb”并自动删除size.Here我传递了String对象引用。那为什么它没有改变? *

3 个答案:

答案 0 :(得分:1)

我不知道是谁告诉你“原始值是按值传递,对象引用是按引用传递”。这是错误的。

在Java中,一切都是按值传递的。

现在,对象不是直接操作,而是通过引用操作。多个引用可以指向同一个对象,但这些引用会像任何其他参数一样被复制。

答案 1 :(得分:1)

Java中的引用按值传递。因此,如果您将TesingPrimitivRefernce.generateString中的第一个参数重新分配给其他内容,则sample1引用的副本会被更改(您没有尝试使用->参数修改参数一些...修饰符,是吗?:))。

所以,在修改之前:

  • sample1 ->
  • s ->

修改后:

  • sample1 ->
  • s {{1}} dogdd(一旦方法退出,此String对象就会丢失)。

在ArrayList的情况下,您正在修改基础列表,因此修改了最初引用的对象。

答案 2 :(得分:0)

字符串是不变的;它们的值在创建后无法更改。将字符串传递给方法时,会创建此字符串的副本。此方法的所有进一步更改都会修改此副本,而不是字符串本身。