Java列表按引用或值传递

时间:2014-07-01 13:24:51

标签: java list memory-management

我来自C ++,带有指针和引用(const string& str / string* str)。

我了解到您通过新语句在Java中创建了一个对象。

Bucket b1 = new Bucket();

所以现在我有一个名为b1的引用,"指向" Bucket类型的对象,对吗?

在我的Android应用程序中,我处理了很多列表。这些列表里面可能有1000个对象。

for( int i = 0; i < 1000; i++ )
   myList.add( new Bucket() );

我的列表现在包含1000个Bucket个对象。或者它包含1000个对Bucket个对象的引用?

但是如果我在列表中添加另一个项目:

b1 = new Bucket();
myList.add( b1 );

执行b1myList引用/包含相同的对象(当然,myList的最后一个索引)?

如果我有另一份清单:

List<Bucket> anotherList = myList;

两个列表引用包含相同的对象?或者anotherList 引用到myList

4 个答案:

答案 0 :(得分:3)

Java 始终按值传递。但是,任何Object实例的值都是引用地址。

在您的问题中anotherList不是另一个List。它是对myList

的引用
List<Bucket> anotherList = new ArrayList<>(myList);

这是List的另一个例子。

答案 1 :(得分:2)

Java使用地址引用。

例如,在您的情况下,如果更改myList,则将anotherList更改为。

要拥有两个具有相同信息的不同列表,您需要执行以下操作:

List<String> a = new ArrayList<String>();
List<String> b = new ArrayList<String>();
Collections.copy(b, a);

在这种情况下,您可以更改列表a而不更改列表b。

答案 2 :(得分:1)

所以现在我有一个名为b1的引用,其中&#34;指向&#34;对于Bucket类型的对象,对吧? 从右

我的列表现在包含1000个Bucket对象。或者它包含1000个Bucket对象的引用? 1000个参考

执行b1和myList引用/包含相同的对象 是相同的

这两个列表是否引用或包含相同的对象?或者anotherList是否引用myList? 只有一个列表 - anotherList和myList都引用它

答案 3 :(得分:1)

由于您没有为anotherList创建任何对象。它将引用myList。 例如:

List<> x = new ArrayList<>();

List<> y =x;

此处y将引用x