Я хочу иметь один DateWrapper - представляющий дату (построенный для Hibernate persistance, но это уже другая история) - в большинстве случаев в то же время на ту же дату.Конфликты HashMap: мой код правильный?
Я немного смущен о столкновениях и хороших ключах для хеширования. Я пишу фабрику для объекта DateWrapper
, и я думал использовать миллисекунды разбора даты в качестве ключа, как я видел других. Но что происходит, если есть столкновение?. Миллисекунды всегда отличаются друг от друга, но внутренняя таблица может быть меньше, чем Long, которая может существовать. И как только хэш-карта имеет столкновение, она использует равные числа, но как она может отличить два разных объекта от моего Лонга? Может быть, это метод put, чтобы удалить (переписать) какое-то значение, которое я хотел бы вставить ... Итак, этот код безопасен или он прослушивается ??
package myproject.test;
import java.util.HashMap;
import java.util.Map;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import myproject.utilities.DateWrapper;
public class DateWrapperFactory {
static Map <Long, DateWrapper> cache = new HashMap<Long, DateWrapper>();
static DateTimeFormatter parser =
DateTimeFormat.forPattern("yyyy-MM-dd");
static DateWrapperFactory instance = new DateWrapperFactory();
private DateWrapperFactory() {
}
public static DateWrapperFactory getInstance() {
return instance;
}
public static DateWrapper get(String source) {
DateTime d = parser.parseDateTime(source);
DateWrapper dw = cache.get(d.getMillis());
if (dw != null) {
return dw;
} else {
dw = new DateWrapper(d);
cache.put(d.getMillis(), dw);
return dw;
}
}
}
package myproject.test;
import org.joda.time.DateTime;
public class DateWrapper {
private DateTime date;
public DateWrapper(DateTime dt) {
this.date = dt;
}
}
Разве это не эквивалентно набору с использованием DateTime.equals через getMillis()? – extraneon
@extraneon: Это не эквивалентно.Идея здесь (я думаю) заключается в том, чтобы реализовать один канонический/интернированный экземпляр для каждого используемого «DateTime», который требует возможности получить этот экземпляр без итерации ... для этого требуется карта. – ColinD