Java 什么是引用复制技术?为什么字符串对象引用值不变?

Java 什么是引用复制技术?为什么字符串对象引用值不变?,java,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-value和pas

*强文本*什么是引用复制技术

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-value和pass-by-reference的示例代码。原语值是pass-by-value,而对象引用是pass-by-reference。在示例中,我测试了字符串contant、string-object、string-buffer、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)后,为什么字符串对象没有更改(**即变量sample1)。但在arraylist中,我删除了值“bbb”并自动减小大小。这里我传递了字符串对象引用。那么为什么它不被更改呢?*

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

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


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

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

因此,在修改之前:

  • 样本1
    ->
  • s
    ->
修改后:

  • 样本1
    ->
  • s
    ->
    dogd(一旦方法退出,这个字符串对象就会丢失)

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

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

字符串对象是不可变的。请阅读此内容。Java中的一切都是按值传递的。什么是参考复制技术的可能重复?