0

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

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

另一件事我测试了下面的示例代码以传递值和传递引用。原始值是传递值,对象引用是传递引用。在示例示例中,我测试了字符串常量,字符串对象,字符串缓冲区,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");

   }

我的疑问是为什么 String 对象在调用*TesingPrimtivRefernce.generateString(sample1) 后没有改变(**ie,variable sample1)。但是在arraylist中我删除了值“bbb”并自动减小大小。这里我传递了String对象引用。那么为什么它没有改变?*

4

3 回答 3

1

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

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

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

于 2012-06-05T12:21:46.957 回答
1

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

所以,修改前:

  • sample1->
  • ->

修改后:

  • sample1->
  • s ->dogdd(一旦方法退出,这个 String 对象就会丢失)。

在 ArrayList 案例中,您正在修改基础列表,因此修改了最初引用的对象。

于 2012-06-05T12:22:13.320 回答
0

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

于 2012-06-05T12:29:17.453 回答