Как Java сравнивает Key, если это объект File?

Предположим, у меня есть HashMap, в котором хранятся фактические файловые объекты в качестве ключа, а значение - это последняя измененная дата.

HashMap hashMap = new HashMap();

Если Файл (test.log) существует в моем HashMap (я добавил его), но файл (test.log) изменен или изменен позже; когда я выдаю замену, найдет ли он существующий соответствующий объект или изменит СОСТОЯНИЕ файла, что изменит характер объекта. Таким образом, я косвенно добавлю новый ключ, Value Pair.

hashMap.replace(file, newModifiedTime); 
1
Нет, но на основе ответов, которые я, очевидно, должен иметь :)
добавлено автор Dane Balia, источник
Пробовали ли вы читать код File.equals ()?
добавлено автор Augusto, источник

5 ответы

From the javadoc equal's description

Проверяет этот абстрактный путь для равенства с данным объектом. Возвращает true тогда и только тогда, когда аргумент не является нулевым и представляет собой абстрактный путь, который обозначает тот же файл или каталог, что и этот абстрактный путь. Независимо от того, совпадают или нет две абстрактные пути, зависит от базовой системы.

2
добавлено

File's .equals()/.hashCode() test for the name of the file, so your keys are "safe".

Javadoc говорит так.

Примечание: если вы используете JDK 7 или новее, сделайте себе одолжение: drop File , используйте Files / Path .

Примечание 2: обратите внимание, что если вы находитесь в каталоге /foo , новый файл ("bar") и новый файл ("/ foo/bar") являются не одинаковыми . Если вы хотите, чтобы имя файла было «полным», используйте .getCanonicalFile() .

Но опять же сделайте себе одолжение и используйте Files . Это на порядок лучше.

1
добавлено

Что хранится, ключ - это Хеширование файла. Это не означает, что полный объект получает хэширование. Для генерации хеша объекта File используется только Path.

When storing an object as a Key to an hash table. It will internally call .hashCode()

http://docs.oracle.com /javase/6/docs/api/java/io/File.html#hashCode()

Из документов.

Вычисляет хэш-код для этого абстрактного пути. Поскольку равенство   абстрактные пути являются по своей сути зависящими от системы,   вычисление их хэш-кодов. В системах UNIX хеш-код   абстрактное имя пути равно исключительной или хэш-коду ее   строка пути и десятичное значение 1234321. В Microsoft Windows   систем хэш-код равен исключительной или хэш-коду   строки его пути, преобразованной в нижний регистр, и десятичного значения   1234321. Локаль не учитывается при нижней строке строки пути.

0
добавлено

HashMap uses hashCode() and equals() methods of class instances of which is used as keys, i.e. File in your case. In case of File it compares abstract paths by delegating the functionality to concrete file system wrapper.

Если вы хотите изменить это поведение, вероятно, вы должны использовать TreeMap и реализовать собственный собственный компаратор, который сравнивает содержимое файла, дату последней модификации и т. Д.

0
добавлено

HashMap uses the hashCode() method of its keys. And File.hashCode() does this, according to the docs:

Вычисляет хэш-код для этого абстрактного пути. Поскольку равенство   абстрактные пути являются по своей сути зависящими от системы,   вычисление их хэш-кодов. В системах UNIX хеш-код   абстрактное имя пути равно исключительной или хэш-коду ее   строка пути и десятичное значение 1234321. В Microsoft Windows   систем хэш-код равен исключительной или хэш-коду   строки его пути, преобразованной в нижний регистр, и десятичного значения   1234321. Локаль не учитывается при нижней строке строки пути.

Короче говоря, хеш вычисляется на основе имени пути, а не содержимого файла.

0
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async