【问题标题】:Does duplicating an array list object duplicate what is stored in the original array list?复制数组列表对象是否会复制原始数组列表中存储的内容?
【发布时间】:2015-07-17 08:46:56
【问题描述】:

我使用此代码创建了一个重复数组

List<Games> gameSortList = new ArrayList<Games>(gamesList);

我对这个概念很陌生,并不知道它是如何工作的。我正在使用这个重复的数组列表对原始文件进行排序而不对其进行编辑。但是,新的数组列表不允许我对原始数组列表使用任何获取和集合。我说得对吗?

这里是副本的声明

  private void BtnAscActionPerformed(java.awt.event.ActionEvent evt) {
if (evt.getActionCommand().equals("⇑")) {
 List<Games> gameSortList = new ArrayList<Games>(gamesList);
 int newSmall = 9999999 ;
 int smallIndex = 0;
 switch (RadSelection){
     case "index":
        while (gameSortList.size() != 0)  {
           for (int i = 0; i < gameSortList.size(); i++) {
            // if (gameSortList.)  {
              gameSortList.getDev();   
            // }
           }

       } 
         break;
     case "Meta":

         break;
     case "Personal":

         break;
 }
 }

 }  

.getdev 是用于Games 类的方法之一,在gamesList 中使用

我想要的是这个伪代码:

Make Duplicate array list
smallnum = 99999;
smallIndex = 0

 until ( GetSizeOfDuplicate = 0){

for ( i  > GetSizeOfDuplicate , i ++)

     If Duplicate.getRank < small num{

       smallnum = Duplicate.getRank

      smallIndex = i } 

print Duplicate.getRank(smallIndex )

delete Duplicate.getRank(smallIndex )

smallnum = 99999;

}loop

【问题讨论】:

  • 您的代码示例制作了 gamesList 的浅表副本并将其分配给 gameSortList。我对不允许“将获取和集合用于原始数组列表”感到有些困惑。想澄清一下吗?
  • 我已将数组设为 public class DataBaseGUI extends javax.swing.JFrame { Games game; ArrayList gamesList = new ArrayList(); `关联变量,例如名称流派等..`
  • 当您尝试使用原始数组列表的获取和设置时,它会给您一个例外吗?编译错误?
  • @MarsAtomic 这实际上不是浅拷贝,而是根据ArrayList's constructor 的 javadocs 的深层拷贝,这可能是 OP 问题的根源
  • @MitchellCarroll 我没有在 Java Doc 中看到表明他正在制作深拷贝的语言。我的评论是基于这个 SO answer

标签: java arraylist duplicates


【解决方案1】:

您遇到的错误是因为您试图在 List 类型的对象上调用 ArrayList 方法,即使您使用 ArrayList 构造函数构造它,它也不能隐式转换回 @ 987654324@。换行就行了

List<Games> gameSortList = new ArrayList<Games>(gamesList); 

ArrayList<Games> gameSortList = new ArrayList<Games>(gamesList);

【讨论】:

    【解决方案2】:

    不,您只会在新列表中拥有相同的对象。

    记住一个对象可以有多个引用

    发生的情况是,新列表具有引用的副本,这些对象与您在第一个列表中拥有的相同对象。当您使用第一个列表的方法时,您操作的是该特定列表中的引用序列,而不是包含的对象本身。

    [编辑:修正草率的措辞。]

    【讨论】:

    • 这取决于对象是什么,是否包含对它们的引用。原始类型总是按值传递,除非您使用它们的包装类。如果它确实持有引用,那么原始对象会被更改,它不会操纵引用。这是一个荒谬的说法,并且绝对错误
    • @MitchellCarroll 那么,如何在 Java ArrayList 中存储原语?
    • @MitchellCarroll 另外请澄清什么是荒谬的说法。
    • 你不操纵引用。变量不持有引用,它们引用。在 java 中使用引用时,就像使用实际对象本身一样。 C++ 是您必须担心引用并确保在使用它之前取消引用的地方。在ArrayList 中存储基元与存储对象之间没有区别,唯一的区别在于数据的实际放置位置,但初始化和存储的语法几乎相同。
    • @MitchellCarroll “类类型 T 的变量可以持有空引用或对 T 类或任何属于 T 子类的类的实例的引用。 "请参阅 JLS §4.12.2。据我所知,您不能将原语存储在 ArrayList 中。
    猜你喜欢
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 2013-03-11
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多