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中的一切都是按值传递的。什么是参考复制技术的可能重复?