如何将List对象复制为原始对象的指针

时间:2016-01-14 20:06:09

标签: java list copy

我对Java很新,所以我希望我能正确解释这个场景。

我正在尝试复制List对象,但希望我的第二个副本指向与第一个List对象相同的对象。我需要两个副本的唯一原因是我需要独立地遍历每个副本。我试图找到一种方法甚至问过几个同事,但唯一有效的是一起创建另一个对象。

非常感谢任何帮助。

谢谢, 恭

更新:这是我正在尝试做的一个例子:

这就是我目前宣布列表的方式:

List monetaryTransactions = null;

//make a copy of the monetary trans list for use when info is needed about a parent transaction
List parentMonetaryTransactions = new ArrayList(monetaryTransactions);

And this is how I'm using them:

  //THE monetaryTransactions LIST IS POPULATED AND THEN.....

  //loop through the monetary transactions list
  for (Iterator iter = monetaryTransactions.iterator(); iter.hasNext();) {
       monetaryTransaction = (IMonetaryTransaction) iter.next();

      .....

      //if there is a parent transaction get info about that transaction
      if ( monetaryTransaction.getParentBillingTransactionId() != null) {                               
         //get the parent billing trans id of the current monetary transaction
         parentBillingTransId = monetaryTransaction.getParentBillingTransactionId();                                 

     IT'S THIS SECOND SORT AND ITERATION THAT I NEED TO MAKE SURE DOES NOT AFFECT MY OUTTER LOOP'S ITERATION
     Collections.sort(parentMonetaryTransactions, new MonetaryTransactionOriginalProcessDateDescOrderComparator());


         //loop through parent monetary trans list to find the parent transaction
     for (Iterator iter2 = parentMonetaryTransactions.iterator(); iter2.hasNext();) {
          parentMonetaryTransaction = (IMonetaryTransaction) iter2.next();

             .......
         }
      }
  }

3 个答案:

答案 0 :(得分:1)

您对列表的变量引用可以被视为指向该对象实例的指针。因此,您可以创建任意数量的指向列表的指针。

List<String> list = new ArrayList<>();
List<String> anotherPointer = list;

现在,您使用引用listanotherPointer的任何内容都会反映出对象本身。

list.add("Hello");
System.out.println(anotherPointer.size()); //Prints 1

答案 1 :(得分:0)

如果您不想创建另一个List对象,则可以使用两个int变量以及get(int index)函数来访问不同索引处的List。< / p>

答案 2 :(得分:0)

请注意,这段代码将抛出NullPointerException:

List monetaryTransactions = null;

//make a copy of the monetary trans list for use when info is needed about a parent transaction
List parentMonetaryTransactions = new ArrayList(monetaryTransactions);

更进一步说,为什么你需要再次对列表进行排序和迭代?每个IMonetaryTransaction是否都有多个父级,具有不同的原始处理日期?不同的交易是否共享相同的ID?

如果您有权访问IMonetaryTransaction源,那么保留对​​父事务本身的引用会更加清晰,而不是只存储ID。 E.g。

interface IMonetaryTransaction {
    // This...
    IMonetaryTransaction getParentBillingTransaction();

    // ...rather than this
    long getParentBillingTransactionId();
}

但是如果你不能改变这个模型,并且只有一个所有交易的平面列表,父母与子女混在一起,那么通过ID创建交易地图可能更容易(也更有效率): / p>

Map<Long, IMonetaryTransaction> transactions = new HashMap<>();
monetaryTransactions.forEach(txn -> transactions.put(txn.getId(), txn);

因此,当您需要获取给定事务的父级时,您只需要执行此操作,而不是再次遍历整个列表。

IMonetaryTransaction parent = transactions.get(txn. getParentBillingTransactionId());