如何将列表对象复制为指向原始对象的指针

How to copy List object as pointer to original object

我对 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();

             .......
         }
      }
  }

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

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

现在任何带有引用 listanotherPointer 的内容都会反映在对象本身上。

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

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

注意这段代码会抛出 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 是否有多个 parent,具有不同的原始处理日期?不同的交易是否共享相同的 ID?

如果您有权访问 IMonetaryTransaction 来源,保留对 parent 交易本身的引用而不是仅存储 ID 会更清晰。例如

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

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

但是如果你不能改变这个模型,并且只有一个所有交易的简单列表,parents 与 children 混合在一起,它可能更容易(也更有效)按 ID 创建交易地图:

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

这样当您需要获取给定交易的 parent 时,您只需要这样做而不是再次遍历整个列表。

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