存储意外值的ArrayList对象

时间:2015-11-02 14:19:06

标签: java android arraylist calendar

我有一个班级DailyDetails.java

DailyDetails.java:

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

我有一个ArrayList(名为tempDD)。 List<DailyDetails> tempDD = new ArrayList<>(); 我想使用后续日历值向此arrayList添加对象(请参阅代码)。 lastAppOpenedDatenow是Calendar类的两个实例。 下面是在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的每个对象中日历中的分钟值是相同的。即 我在上面的代码之后添加了这段代码:

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 ....

任何帮助将不胜感激。 :)

1 个答案:

答案 0 :(得分:4)

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

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

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