Java 为什么ArrayList.add()会修改添加的对象?

Java 为什么ArrayList.add()会修改添加的对象?,java,arraylist,Java,Arraylist,当我将一个对象添加到ArrayList时,它会被转换 我正在尝试制作一个JavaFXAgenda应用程序,因此我需要将一个包含表中所需对象的ArrayList传递给ObservableList 问题就发生在这个函数中,位于tableToday.addret 公共阵列列表getTableToday{ LocalDateTime时钟=LocalDateTime.ofLocalDate.now,LocalTime.of0,0; 而clock.untilLocalDateTime.ofcaldate.n

当我将一个对象添加到ArrayList时,它会被转换

我正在尝试制作一个JavaFXAgenda应用程序,因此我需要将一个包含表中所需对象的ArrayList传递给ObservableList

问题就发生在这个函数中,位于tableToday.addret

公共阵列列表getTableToday{ LocalDateTime时钟=LocalDateTime.ofLocalDate.now,LocalTime.of0,0; 而clock.untilLocalDateTime.ofcaldate.now,LocalTime.of23,59,ChronoUnit.MINUTES>0{ System.out.printlnclock:+clock.toLocalTime.toString; SkEvent ret=新SkEventLocalDate.now,clock.toLocalTime; 如果存在第七个时钟{ System.out.printlnEvent存在。; ret=getEventclock; ret.setLocalDateTimeclock; } tableToday.addret; System.out.println添加事件+ret.getName+at+ret.getTime.toString; LocalDateTime updatedClock=clock.plusMinutesgap; 时钟=更新的时钟; } 这是输出的一部分:

clock: 21:00
Added event  at 21:00
clock: 21:30
Added event  at 21:30
clock: 22:00
Event exists.
Added event e at 22:00
clock: 22:30
Event exists.
Added event e at 22:30
clock: 23:00
Event exists.
Added event e at 23:00
clock: 23:30
Added event  at 23:30
Times in the table: 
21:00
21:30
23:00
23:00
23:00
23:30
如您所见,我在22:00、22:30和23:00添加了3个事件,但在ArrayList上输出事件时间会输出23:00的3倍

它应该输出

Times in the table: 
21:00
21:30
22:00
22:30
23:00
23:30
另外,这里是SkEvent类:

公共类SkEvent{ 私有本地日期; 私有本地时间; 私有字符串名称; 私有字符串描述; 公共SkEventLocalDate日期、整数小时、整数分钟、字符串名称、字符串描述{ this.date=日期; this.time=LocalTime.of小时,分钟; this.name=名称; this.description=描述; } 公共SkEventLocalDate日期,LocalTime时间{ this.date=日期; 这个时间=时间; this.name=; 这个.description=; } 公共LocalDateTime getLocalDateTime{ 返回LocalDateTime.ofgetDate,getTime; } 公共SkEvent setLocalDateTimeLocalDateTime localDateTime{ this.date=localDateTime.toLocalDate; this.time=localDateTime.toLocalTime; 归还这个; } 公共LocalDate getDate{ 返回日期; } 公共无效setDateLocalDate日期{ this.date=日期; } 公共本地时间获取时间{ 返回时间; } 公共无效设置时间局部时间{ 这个时间=时间; } 公共字符串getName{ 返回名称; } public void setNameString名称{ this.name=名称; } 公共字符串getDescription{ 返回说明; } public void setDescription字符串描述{ this.description=描述; } } 以及getEvent方法:

私有映射actualEvents=新HashMap; //... 私有SkEvent getEventLocalDateTime时钟{ 表格条目:actualEvents.entrySet{ 如果!entry.getKey.getLocalDateTime.isAfterclock&!entry.getValue.isBeforeclock{ 返回entry.getKey; } } 返回null; }
非常感谢您的时间。

三个无法解释的事件是:

clock: 22:00
Event exists.
Added event e at 22:00
clock: 22:30
Event exists.
Added event e at 22:30
clock: 23:00
Event exists.
Added event e at 23:00
正如您在控制台上看到的:对于这三个事件,您输入了if语句,因为存在打印的事件

if(existsEvent(clock)){
  System.out.println("Event exists.");
  ret = getEvent(clock);
  ret.setLocalDateTime(clock);
}
我只能猜测所使用的函数在做什么,但我假设existsEventclock返回true,如果存在一个SkEvent,其时间和日期说明符与clock actual date相同,那么对于上述三种情况,这在中显然是正确的。getEventclock然后检索此SkEvent并用它重写ret变量。ret然后是c挂起ret.setLocalDateTimeclock

tableToday.addret会将指向SkEvent的引用添加到列表中。这意味着,在以后更改SkEvent对象时,也会更改其在列表中的引用,因为它只是指向实际更改对象的指针


在这里,您要做的是将对新对象的引用添加到列表中,然后3次检索、更改它,然后再次将对同一对象的附加引用添加到此列表中。

add不会修改对象。最可能的解释是,在将对象添加到列表中后,您自己正在修改该对象。SkE的实现如何通风孔看起来像什么?您正在ifexistsEventclock中修改它{add根本没有修改它。这显然是因为所讨论的3次进入if块,如事件exists所示。output,用getEventclock方法返回的名为e的单个事件替换ret值。查看getEvent方法了解原因。我们当然不能告诉您,因为我们看不到该代码。@Carcigenicate我仔细检查了你的Hyptosis,不,我在添加后不更改值。正如你在代码中看到的,我在添加前输出ret的LocalTime,添加后在ArrayList上迭代以查看其值的LocalTime。我指的是添加对象时发生的修改,而不是之前的修改,因为对象我想补充的是什么 我想添加,如输出中所示。我现在正在为SkEvent类和``getEvent`方法添加代码,由于我刚才解释的原因,我认为没有必要这样做。非常感谢您的帮助。我打电话给setTime时,并没有在引用中使用它,而是在事件本身中,将时间更改为结束时间。我通过返回事件的副本而不是事件本身解决了这个问题,谢谢你:如果我有必要的声誉,你会得到一张选票