Как Java сравнява ключ, ако е файлов обект?

Да приемем, че имам HashMap, който съхранява действителните файлови обекти като ключ и стойността е датата на последната му промяна.

HashMap<File, Long> hashMap = new HashMap<File, Long>();

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

hashMap.replace(file, newModifiedTime); 

person Dane Balia    schedule 07.02.2013    source източник
comment
Опитахте ли да прочетете кода на File.equals()?   -  person Augusto    schedule 07.02.2013
comment
Не, но въз основа на отговорите, които трябва да имам :)   -  person Dane Balia    schedule 07.02.2013


Отговори (5)


От javadoc описание на equal

Тества този абстрактен път за равенство с дадения обект. Връща true, ако и само ако аргументът не е null и е абстрактно име на път, което обозначава същия файл или директория като това абстрактно име на път. Дали две абстрактни имена на пътеки са равни или не, зависи от основната система.

person UmNyobe    schedule 07.02.2013

.equals()/.hashCode() тест на File за името на файла, така че ключовете ви да са "безопасни".

Javadoc казва така.

Забележка: ако използвате JDK 7 или по-нова версия, направете си услуга: пуснете File, използвайте Files/Path.

Бележка 2: моля, имайте предвид, че ако сте в директория /foo, new File("bar") и new File("/foo/bar") не са еднакви. Ако искате да сте сигурни, че името на файла е „пълно“, използвайте .getCanonicalFile().

Но отново, направете си услуга и използвайте Files. Това е с порядъци по-добро.

person fge    schedule 07.02.2013

Това, което се съхранява има ключ, е хеширането на файла. Това всъщност няма да означава, че целият обект се хешира. Само пътят се използва за генериране на хеша на обекта File.

Когато съхранявате обект като ключ към хеш таблица. Ще извика вътрешно .hashCode()

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

От документите.

Изчислява хеш код за този абстрактен път. Тъй като равенството на абстрактните имена на пътища по своята същност зависи от системата, изчислението на техните хеш кодове е такова. В UNIX системи хеш кодът на абстрактно име на пътека е равен на ексклузивния или на хеш кода на неговия низ от името на пътя и десетичната стойност 1234321. В системите на Microsoft Windows хеш кодът е равен на ексклузивния или на хеш кода на неговият низ от името на пътя е преобразуван в малки букви и десетичната стойност 1234321. Локалът не се взема предвид при изписването на низа с малки букви в името на пътя.

person fmsf    schedule 07.02.2013

HashMap използва метода hashCode() на своите ключове. И File.hashCode() прави това, според документите:

Изчислява хеш код за този абстрактен път. Тъй като равенството на абстрактните имена на пътища по своята същност зависи от системата, изчислението на техните хеш кодове е такова. В UNIX системи хеш кодът на абстрактно име на пътека е равен на ексклузивния или на хеш кода на неговия низ от името на пътя и десетичната стойност 1234321. В системите на Microsoft Windows хеш кодът е равен на ексклузивния или на хеш кода на неговият низ от името на пътя е преобразуван в малки букви и десетичната стойност 1234321. Локалът не се взема предвид при изписването на низа с малки букви в името на пътя.

Накратко, хешът се изчислява въз основа на името на пътя, а не на съдържанието на файла.

person Oliver Charlesworth    schedule 07.02.2013

HashMap използва hashCode() и equals() методи на екземпляри на клас, които се използват като ключове, т.е. File във вашия случай. В случай на файл, той сравнява абстрактни пътища, като делегира функционалността на конкретна обвивка на файловата система.

Ако искате да промените това поведение, вероятно трябва да използвате TreeMap и да приложите свой собствен персонализиран компаратор, който сравнява съдържанието на файла, датата на последна модификация и т.н.

person AlexR    schedule 07.02.2013