存储意外值的 ArrayList 对象

ArrayList objects storing unexpected values

我有一个classDailyDetails.java

DailyDetails.java:

public class DailyDetails implements Serializable {
    Calendar calendar;
    int volume;
    int target;
}

我有一个 ArrayList(名为 tempDD)。 List<DailyDetails> tempDD = new ArrayList<>(); 我想使用后续日历值将对象添加到此 arrayList(请参阅代码)。 lastAppOpenedDatenow 是日历 class 的两个实例。 下面是在我的 MainActivity 中将对象添加到 arrayList 的代码。

MainActivity.java

while(lastAppOpenedDate.get(Calendar.MINUTE) != now.get(Calendar.MINUTE)) {
            DailyDetails dailyDetails = new DailyDetails();
            dailyDetails.volume = waterConsumed; 
            preferences =
            PreferenceManager.getDefaultSharedPreferences(this);
            if(preferences.getBoolean("default_target",true)) {
                dailyDetails.target =
                preferences.getInt("defaultTargetValue",4000);
            }
            else {
                dailyDetails.target =
                preferences.getInt("customTargetValue",4000);
            }
            dailyDetails.calendar = lastAppOpenedDate; // Adding the calendar value
            tempDD.add(dailyDetails); //Adding object to ArrayList.
            if(tempDD.size() > 30 || tempDD.get(0).calendar == tempDD.get(1).calendar) { // Can be ignored right now. 
                tempDD.remove(0);
            }
            lastAppOpenedDate.add(Calendar.MINUTE, 1); // Adding one MINUTE to lastAppOpenedDate
            waterConsumed = 0;
        }

dailyDetails.calendar是关注点

预期结果:每次循环运行时,lastAppOpenedDate 日历值增加一分钟。所以, 假设 arrayList tempDD 中的第一个对象的分钟值为 5,那么下一个对象的分钟值应为 6,7,8,9,10,11 等等。

但在实际输出中,arrayList的每个对象中日历中的分钟值是相同的。 IE。 我在上面的代码之后添加了这段代码:

String s = "";
for(int i = 0; i < tempDD.size();i++){
    s = s + tempDD.get(i).calendar.get(Calendar.MINUTE) + ",";
}
Log.d("Tag A","String: "+s);

这将在日志中打印 12,12,12,12,12,12,12....。

如有任何帮助,我们将不胜感激。 :)

您确实在循环的每次迭代中实例化了一个新的 DailyDetails 对象。但是您始终为其 .calender 属性分配 lastAppOpenedDate 的引用 - 而不是副本。

所以你会得到一个列表,其中包含十几个 DailyDetails,所有这些都引用存储在 lastAppOpenedDate 中的相同实例。每次您在 for-i 循环中访问它时,该实例自然会具有相同的值,您已经更新了大约十几次。

dailyDetails.calendar = lastAppOpenedDate;改为 dailyDetails.calendar=lastAppOpenedDate.clone();