Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java

РазбираСмся с hashCode() ΠΈ equals()

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ…Π΅Ρˆ-ΠΊΠΎΠ΄?

Если ΠΎΡ‡Π΅Π½ΡŒ просто, Ρ‚ΠΎ Ρ…Π΅Ρˆ-ΠΊΠΎΠ΄ β€” это число. На самом Π΄Π΅Π»Π΅ просто, Π½Π΅ Ρ‚Π°ΠΊ Π»ΠΈ? Если Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΡ‡Π½ΠΎ, Ρ‚ΠΎ это битовая строка фиксированной Π΄Π»ΠΈΠ½Ρ‹, получСнная ΠΈΠ· массива ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹ (википСдия).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ β„–1
Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

Вторая Ρ‡Π°ΡΡ‚ΡŒ объяснСния гласит:

получСнная ΠΈΠ· массива ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹.

Π’ ΠΈΡ‚ΠΎΠ³Π΅, Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… Java, Ρ…Π΅Ρˆ-ΠΊΠΎΠ΄ β€” это цСлочислСнный Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π² качСствС Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

ΠŸΠΎΠ΄Π²Π΅Π΄Ρ‘ΠΌ ΠΈΡ‚ΠΎΠ³:

Π‘ΠΏΠ΅Ρ€Π²Π°, Ρ‡Ρ‚ΠΎ-Π±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Ρ‹, опрСдСлимся с Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΠ΅ΠΉ. ΠžΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ β€” это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ содСрТимым ΠΏΠΎΠ»Π΅ΠΉ.

ΠŸΠΎΠ½ΡΡ‚ΠΈΠ΅ эквивалСнтности. ΠœΠ΅Ρ‚ΠΎΠ΄ equals()

НачнСм с Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π² java, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° new ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² памяти. Для ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ создадим ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ класс, пускай ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ β€œBlackBox”.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ β„–2
Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Π² памяти создастся Π΄Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java

Π­ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ ΠΈ Ρ…Π΅Ρˆ-ΠΊΠΎΠ΄ тСсно связанны ΠΌΠ΅ΠΆΠ΄Ρƒ собой, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ…Π΅Ρˆ-ΠΊΠΎΠ΄ вычисляСтся Π½Π° основании содСрТимого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (значСния ΠΏΠΎΠ»Π΅ΠΉ) ΠΈ Ссли Ρƒ Π΄Π²ΡƒΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ класса содСрТимоС ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅, Ρ‚ΠΎ ΠΈ Ρ…Π΅Ρˆ-ΠΊΠΎΠ΄Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ (см. ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ 2).

Класс Object

ΠŸΡ€ΠΈ сравнСниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², опСрация β€œ == ” Π²Π΅Ρ€Π½Π΅Ρ‚ true лишь Π² ΠΎΠ΄Π½ΠΎΠΌ случаС β€” ΠΊΠΎΠ³Π΄Π° ссылки ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚-ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС Π½Π΅ учитываСтся содСрТимоС ΠΏΠΎΠ»Π΅ΠΉ.

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java

ЗаглянСм Π² исходный ΠΊΠΎΠ΄ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° hashCode() Π² классС Object :

ΠŸΡ€ΠΈ вычислСнии Ρ…ΡΡˆ-ΠΊΠΎΠ΄Π° для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² класса Object ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Park-Miller RNG Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ. Π’ основу Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ случайных чисСл. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ запускС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Π½Ρ‹ΠΉ Ρ…ΡΡˆ-ΠΊΠΎΠ΄.

Но, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΠΎΠΌΠ½ΠΈΠΌ, Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ: β€œΠ΅ΡΠ»ΠΈ Ρƒ Π΄Π²ΡƒΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ класса содСрТимоС ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅, Ρ‚ΠΎ ΠΈ Ρ…Π΅Ρˆ-ΠΊΠΎΠ΄Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ”. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, ΠΏΡ€ΠΈ создании ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ класса, принято ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ hashCode() ΠΈ equals() Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π»ΠΈΡΡŒ поля ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.
Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π»ΠΈΠ±ΠΎ воспользовавшись срСдствами Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ исходного ΠΊΠΎΠ΄Π° Π² IDE. НапримСр, Π² Eclipse это Source β†’ Generate hashCode() and equals().

Π’ ΠΈΡ‚ΠΎΠ³Π΅, класс BlackBox ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Ρ‚Π°Π΅Ρ‚ Π²ΠΈΠ΄:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ hashCode() ΠΈ equals() Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΈ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ содСрТимоС ΠΏΠΎΠ»Π΅ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°:

ΠšΠΎΠΌΡƒ интСрСсно ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π² Ρ€ΡƒΡ‡Π½ΡƒΡŽ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Effective Java β€” Joshua Bloch, chapter 3, item 8,9.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java

ВсСм ΠΏΡ€ΠΈΠ²Π΅Ρ‚. МСня Π·ΠΎΠ²ΡƒΡ‚ АлСксандр. Π― снимаю Π²ΠΈΠ΄Π΅ΠΎ Ρ€ΠΎΠ»ΠΈΠΊΠΈ посвящСнныС ΠΏΡ€ΠΎΡ…ΠΎΠΆΠ΄Π΅Π½ΠΈΡŽ собСсСдования Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ java developera. Напомню Ρ‡Ρ‚ΠΎ сСйчас я Ρ€Π°Π·Π±ΠΈΡ€Π°ΡŽ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ Π² java. БСгодняшняя Ρ‚Π΅ΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ HashMap. ΠŸΠΎΡ‡Π΅ΠΌΡƒ я Π²Ρ‹Π±Ρ€Π°Π» эту Ρ‚Π΅ΠΌΡƒ? Π”Π° всС ΠΏΠΎ Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅. Π•Π΅ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Ссли Π²Ρ‹ ΠΏΡ€ΠΈΡˆΠ»ΠΈ Π½Π° собСсСдованиС. НС Π·Π½Π°Π΅Ρ‚Π΅ = Π½Π΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹!

Π§Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ Ρ‡Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ HashMap ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ½ΡƒΠΌΠ΅Ρ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΡ€Π·ΠΈΠ½ΠΊΠΈ Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… хранятся ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅. ΠŸΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² HashMap ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ ΠΏΠΎΠΌΠΈΠΌΠΎ самого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π΅Ρ‰Π΅ ΠΈ ΠΊΠ»ΡŽΡ‡ ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π² дальнСйшСм Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Ρ‹ΡΠΊΠ°Ρ‚ΡŒ. Как ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ искомого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°? Для этого Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ hashCode ΠΊΠ»ΡŽΡ‡Π°. Π“Π΄Π΅ ΠΆΠ΅ Π΅Π³ΠΎ Π²Π·ΡΡ‚ΡŒ? Π”Π° это ΠΎΡ‡Π΅Π½ΡŒ просто Ссли ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ Π² качСствС ΠΊΠ»ΡŽΡ‡Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ любой ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² java. ВсС Π·Π½Π°ΡŽΡ‚ Ρ‡Ρ‚ΠΎ класс Object Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ hashCode() это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ унаслСдован ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ самим β€œΠΊΠ»ΡŽΡ‡ΠΎΠΌβ€. Π’.ΠΊ. всС Π² java Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ ΠΎΡ‚ класса Object. Π’Π΅ΠΏΠ΅Ρ€ΡŒ понятно ΠΎΡ‚ΠΊΡƒΠ΄Π° Ρƒ ΠΊΠ»ΡŽΡ‡Π° бСрСтся hashCode!
ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π² hashMap, Π±Ρ‹Π» ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ ΠΊΠ»ΡŽΡ‡ + сохраняСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ hash функция вычисляСт Ρ‚ΠΎ Π² ΠΊΠ°ΠΊΡƒΡŽ ΠΊΠΎΡ€Π·ΠΈΠ½Ρƒ отнСсти наши Π΄Π°Π½Π½Ρ‹Π΅.

Как Π²Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΊΠΎΡ€Π·ΠΈΠ½ΠΎΠΊ Π² HashMap-Π΅ Π½Π΅Ρ‚. ВмСсто ΠΈΡ… Π΅ΡΡ‚ΡŒ массив. ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ…Ρ€Π°Π½ΠΈΡ‚ ссылки Π½Π° связанныС списки Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… хранятся наши Π΄Π°Π½Π½Ρ‹Π΅. ΠšΠ°ΠΆΠ΄ΠΎΠΌΡƒ элСмСнту массива соотвСтствуСт ΠΎΠ΄ΠΈΠ½ список.

КакоС Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ количСство ΠΊΠΎΡ€Π·ΠΈΠ½ Π² HashMap?
Π”Π°Π½Π½Ρ‹ΠΉ вопрос ΠΌΠ½Π΅ Π½ΠΈ Ρ€Π°Π·Ρƒ Π½Π΅ Π·Π°Π΄Π°Π²Π°Π»ΠΈ я Π΅Π³ΠΎ нашСл Π½Π° Ρ…Π°Π±Ρ€Π΅. ΠžΡ‚Π²Π΅Ρ‚ 16. Но ΠΊΠ°ΠΊ ΠΈ с ArrayList-ΠΎΠΌ Π² конструкторС ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ количСство.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия? Бпособ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ.
Π­Ρ‚ΠΎΡ‚ вопрос Ρ‚Π°ΠΊ ΠΆΠ΅ часто встрСчаСтся. Коллизия это ΠΊΠΎΠ³Π΄Π° Π΄Π²Π° Ρ€Π°Π·Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² ΠΎΠ΄Π½Ρƒ ΠΊΠΎΡ€Π·ΠΈΠ½ΠΊΡƒ(связанный список). ΠŸΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ этому слуТат Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ hashcode. Для Π±ΠΎΠ»Π΅Π΅ эффСктивной Ρ€Π°Π±ΠΎΡ‚Ρ‹ с HashMap hashcode Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒΡΡ для Π½Π΅ эквивалСнтных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

Как я ΡƒΠΆΠ΅ упомянул Π²Ρ‹ΡˆΠ΅, всС Π΄Π°Π½Π½Ρ‹Π΅ хранятся Π² списках. ΠŸΠΎΡ‡Π΅ΠΌΡƒ Ρ‚Π°ΠΊ? ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π½Π΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ всСго ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚? ΠžΡ‚Π²Π΅Ρ‚ прост. ВсС ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это способ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ. Как происходит Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅? ΠŸΠ΅Ρ€Π²ΠΎΠ΅ это ΠΌΡ‹ выясняСм Ρ‚ΠΎ какая ΠΊΠΎΡ€Π·ΠΈΠ½Π° соотвСтствуСт ΠΊΠ»ΡŽΡ‡Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π—Π°Ρ‚Π΅ΠΌ провСряСм Π΅ΡΡ‚ΡŒ Π»ΠΈ Π² Π½Π΅ΠΉ ΡƒΠΆΠ΅ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ссли Π½Π΅Ρ‚ Ρ‚ΠΎ добавляСм Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ. Если Π΄Π° Ρ‚ΠΎ это ΡΠ»ΡƒΡ‡ΠΈΠ»Π°ΡΡŒ коллизия. Π’ΠΎΠ³Π΄Π° ΠΌΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ Ρ‚Π΅Ρ… ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ (Ссли ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΈΡ… Ρ‚Π°ΠΌ нСсколько). Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ производится ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ equals. Если equals Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true Π·Π½Π°Ρ‡ΠΈΡ‚ ΠΊΠ»ΡŽΡ‡ΠΈ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚, производится Π·Π°ΠΌΠ΅Π½Π°, Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ замСняСт Ρ‚ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΆΠ΅ Ρ‚Π°ΠΌ находится ΠΏΠΎΠ΄ Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ, Ссли Π½Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ добавляСтся Π² ΠΊΠΎΠ½Π΅Ρ† списка.

Как ΠΈ ΠΊΠΎΠ³Π΄Π° происходит ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ количСства ΠΊΠΎΡ€Π·ΠΈΠ½ Π² HashMap?
Π£ HashMap ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠΎΠ»Π΅ loadFactory. Оно ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π΄Π°Π½ΠΎ Ρ‡Π΅Ρ€Π΅Π· конструктор. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ равняСтся 0.75. Для Ρ‡Π΅Π³ΠΎ ΠΎΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ? Π•Π³ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π° количСство ΠΊΠΎΡ€Π·ΠΈΠ½ Π΄Π°Π΅Ρ‚ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ число ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΡΡ‚ΠΎΡΠ»ΠΎΡΡŒ ΡƒΠ΄Π²ΠΎΠ΅Π½ΠΈΠ΅ количСства ΠΊΠΎΡ€Π·ΠΈΠ½.. НапримСр Ссли Ρƒ нас ΠΌΠ°ΠΏΠΊΠ° с 16-ю ΠΊΠΎΡ€Π·ΠΈΠ½Π°ΠΌΠΈ, Π° loadFactory равняСтся 0.75, Ρ‚ΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ 16 * 0.75 = 12 ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². Мапка увСличиваСтся Π²Π΄Π²ΠΎΠ΅.

Какая ΠΎΡ†Π΅Π½ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ слоТности ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с HashMap? Π“Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π»ΠΈ HashMap ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ элСмСнта?

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ВнутрСнняя Ρ€Π°Π±ΠΎΡ‚Π° HashMap Π² Java

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, ΠΊΠ°ΠΊ ΠΈΠ·Π½ΡƒΡ‚Ρ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ get ΠΈ put Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ HashMap. КакиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ. Как происходит Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Как Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ извлСкаСтся ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ. Как хранятся ΠΏΠ°Ρ€Ρ‹ ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Как ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅, HashMap содСрТит массив Node ΠΈ Node ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ класс, содСрТащий ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, ΠΊΠ°ΠΊ всС это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Для Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ рассмотрим процСсс Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ.

Π₯ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Π—Π΄Π΅ΡΡŒ я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ свой собствСнный класс Key ΠΈ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠ³Ρƒ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ hashCode() для дСмонстрации Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… сцСнариСв. Мой класс Key:

Π—Π΄Π΅ΡΡŒ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ hashCode() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ASCII ΠΊΠΎΠ΄ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ символа строки. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли ΠΏΠ΅Ρ€Π²Ρ‹Π΅ символы строки ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅, Ρ‚ΠΎ ΠΈ Ρ…ΡΡˆ ΠΊΠΎΠ΄Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ. НС стоит ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ Π² своих ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ….

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ создан ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ для дСмонстрации. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ HashCode допускаСт ΠΊΠ»ΡŽΡ‡ Ρ‚ΠΈΠΏΠ° null, Ρ…ΡΡˆ ΠΊΠΎΠ΄ null всСгда Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π΅Π½ 0.

ΠœΠ΅Ρ‚ΠΎΠ΄ hashCode()

ΠœΠ΅Ρ‚ΠΎΠ΄ equals()

ΠœΠ΅Ρ‚ΠΎΠ΄ equals ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π΄Π²ΡƒΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π° равСнство. ΠœΠ΅Ρ‚ΠΎΠ΄ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ Π² классС Object. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² своСм собствСнном классС. Π’ классС HashMap ΠΌΠ΅Ρ‚ΠΎΠ΄ equals() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ равСнства ΠΊΠ»ΡŽΡ‡Π΅ΠΉ. Π’ случаС, Ссли ΠΊΠ»ΡŽΡ‡ΠΈ Ρ€Π°Π²Π½Ρ‹, ΠΌΠ΅Ρ‚ΠΎΠ΄ equals() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, ΠΈΠ½Π°Ρ‡Π΅ false.

ΠšΠΎΡ€Π·ΠΈΠ½Ρ‹ (Buckets)

ВычислСниС индСкса Π² HashMap

Π₯эш ΠΊΠΎΠ΄ ΠΊΠ»ΡŽΡ‡Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ достаточно большим для создания массива. Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ…ΡΡˆ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ цСлочислСнного Ρ‚ΠΈΠΏΠ° ΠΈ Ссли ΠΌΡ‹ создадим массив Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, Ρ‚ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ outOfMemoryException. ΠŸΠΎΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ индСкс для ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° массива. По сути для вычислСния индСкса выполняСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ опСрация:

Π³Π΄Π΅ n Ρ€Π°Π²Π½Π° числу bucket ΠΈΠ»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ Π΄Π»ΠΈΠ½Ρ‹ массива. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ я Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽ n, ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π²Π½ΠΎΠ΅ 16.

HashMap:
Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java

Π’Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π° <"vishal">. Оно Π±ΡƒΠ΄Π΅Ρ‚ сгСнСрированно, ΠΊΠ°ΠΊ 118.

Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ node.

ΠŸΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ с индСксом 6, Ссли мСсто свободно.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ HashMap выглядит ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java

Π’Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π° <"sachin">. Оно Π±ΡƒΠ΄Π΅Ρ‚ сгСнСрированно, ΠΊΠ°ΠΊ 115.

Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ node.

ΠŸΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ с индСксом 3, Ссли мСсто свободно.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ HashMap выглядит ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java

Π’Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π° <"vaibhav">. Оно Π±ΡƒΠ΄Π΅Ρ‚ сгСнСрированно, ΠΊΠ°ΠΊ 118.

Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ node.

ΠŸΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ с индСксом 6, Ссли мСсто свободно.

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ с индСксом 6 ΡƒΠΆΠ΅ сущСствуСт Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, этот случай называСтся ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠ΅ΠΉ.

Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС провСрям с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² hashCode() ΠΈ equals(), Ρ‡Ρ‚ΠΎ ΠΎΠ±Π° ΠΊΠ»ΡŽΡ‡Π° ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹.

Если ΠΊΠ»ΡŽΡ‡ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹, Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²Ρ‹ΠΌ.

Π˜Π½Π°Ρ‡Π΅ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΈ старый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ структуры Π΄Π°Π½Π½Ρ‹Ρ… «ΡΠ²ΡΠ·Π°Π½Π½Ρ‹ΠΉ список», ΡƒΠΊΠ°Π·Π°Π² ссылку Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΎΠ±Π° ΠΏΠΎΠ΄ индСксом 6.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ HashMap выглядит ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java

[ΠΏΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ ΠΎΡ‚ Π°Π²Ρ‚ΠΎΡ€Π° ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π°] Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ взято ΠΈΠ· ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΈ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ содСрТит ΠΎΡˆΠΈΠ±ΠΊΡƒ. Бсылка Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ vishal с индСксом 6 Π½Π΅ Ρ€Π°Π²Π½Π° null, Π² Π½Π΅ΠΉ содСрТится ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ vaibhav.

Π’Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Ρ…ΡΡˆ ΠΊΠΎΠ΄ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° <β€œsachin”>. Он Π±Ρ‹Π» сгСнСрирован, ΠΊΠ°ΠΊ 115.

Π’ нашСм случаС элСмСнт Π½Π°ΠΉΠ΄Π΅Π½ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π²Π½ΠΎ 30.

Π’Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Ρ…ΡΡˆ ΠΊΠΎΠ΄ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° <"vaibhav">. Он Π±Ρ‹Π» сгСнСрирован, ΠΊΠ°ΠΊ 118.

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΎΠ½ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ node Π½Π΅ Ρ€Π°Π²Π΅Π½ null.

Если ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ node Ρ€Π°Π²Π΅Π½ null, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ null.

Если ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ node Π½Π΅ Ρ€Π°Π²Π΅Π½ null, ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ Π½Π΅ΠΌΡƒ ΠΈ повторяСм ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Ρ‚Ρ€ΠΈ шага Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° элСмСнт Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½ ΠΈΠ»ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ node Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π΅Π½ null.

ИзмСнСния в Java 8

Для исправлСния этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π² Java 8 послС достиТСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ€ΠΎΠ³Π° вмСсто связанных списков ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ сбалансированныС Π΄Π΅Ρ€Π΅Π²ΡŒΡ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ HashMap Π² Π½Π°Ρ‡Π°Π»Π΅ сохраняСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² связанном спискС, Π½ΠΎ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ колличСство элСмСнтов Π² Ρ…ΡΡˆΠ΅ достигаСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ€ΠΎΠ³Π° происходит ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ сбалансированным Π΄Π΅Ρ€Π΅Π²ΡŒΡΠΌ. Π§Ρ‚ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π² Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС с O(n) Π΄ΠΎ O(log n).

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π§Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΎΠ± устройствС ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ, основанных Π½Π° Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ

ВсСм ΠΏΡ€ΠΈΠ²Π΅Ρ‚. На связи Владислав Π ΠΎΠ΄ΠΈΠ½. Π’ настоящСС врСмя я являюсь Ρ€ΡƒΠΊΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΌ курса «АрхитСктор высоких Π½Π°Π³Ρ€ΡƒΠ·ΠΎΠΊΒ» Π² OTUS, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅ΠΏΠΎΠ΄Π°ΡŽ Π½Π° курсах, посвящСнных Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ ПО.

Помимо прСподавания, ΠΊΠ°ΠΊ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, я занимаюсь написаниСм авторского ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π° для Π±Π»ΠΎΠ³Π° OTUS Π½Π° Ρ…Π°Π±Ρ€Π΅ ΠΈ сСгодняшнюю ΡΡ‚Π°Ρ‚ΡŒΡŽ Ρ…ΠΎΡ‡Ρƒ ΠΏΠΎΡΠ²ΡΡ‚ΠΈΡ‚ΡŒ запуску Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° курса «Алгоритмы для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ²Β».

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

ΠŸΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π΄Π°Ρ‡ΠΈ

Π”Π°Π²Π°ΠΉΡ‚Π΅ зададимся Ρ†Π΅Π»ΡŒΡŽ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ структуру Π΄Π°Π½Π½Ρ‹Ρ…, которая позволяСт:

Массив

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ эти ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ²Π΅Ρ€Ρ… массива, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся самой простой структурой Π΄Π°Π½Π½Ρ‹Ρ…. Договоримся, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ячСйку пустой, Ссли Π² Π½Π΅ΠΉ содСрТится null.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° наличия

НСобходимо ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ поиск ΠΏΠΎ массиву, вСдь элСмСнт ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² любой ячСйкС. АсимптотичСски это ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ Π·Π° O(n), Π³Π΄Π΅ n β€” Ρ€Π°Π·ΠΌΠ΅Ρ€ массива.

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅

Если Π½Π°ΠΌ Π½Π°Π΄ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ элСмСнт Π°Π±Ρ‹ ΠΊΡƒΠ΄Π°, Ρ‚ΠΎ Π²Π½Π°Ρ‡Π°Π»Π΅ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΠΏΡƒΡΡ‚ΡƒΡŽ ячСйку, Π° Π·Π°Ρ‚Π΅ΠΌ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Π½Π΅Π΅ элСмСнт. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ ΠΎΠΏΡΡ‚ΡŒ осущСствим Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ поиск ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ асимптотику O(n).

Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ элСмСнт, Π΅Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ сначала Π½Π°ΠΉΡ‚ΠΈ, Π° Π·Π°Ρ‚Π΅ΠΌ Π² Π½Π°ΠΉΠ΄Π΅Π½Π½ΡƒΡŽ ячСйку Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ null. ΠžΠΏΡΡ‚ΡŒ Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ поиск ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ нас ΠΊ O(n).

ΠŸΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅Π΅ Ρ…Π΅Ρˆ-мноТСство

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΌΡ‹ сначала искали индСкс Π½ΡƒΠΆΠ½ΠΎΠΉ ячСйки, Π° Π·Π°Ρ‚Π΅ΠΌ осущСствляли ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ, ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ поиск ΠΏΠΎΡ€Ρ‚ΠΈΡ‚ Π½Π°ΠΌ асимптотику! Если Π±Ρ‹ ΠΌΡ‹ Π½Π°ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹ΠΉ индСкс Π·Π° O(1), Ρ‚ΠΎ исходная Π·Π°Π΄Π°Ρ‡Π° Π±Ρ‹Π»Π° Π±Ρ‹ Ρ€Π΅ΡˆΠ΅Π½Π°.

Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π·Π°ΠΌΠ΅Π½ΠΈΠΌ Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ поиск Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ: Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ„ΡƒΠ½Ρ†ΠΈΠΈ β€” Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ставящСй Π² соотвСтствиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ класса Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ число. ПослС этого Π±ΡƒΠ΄Π΅ΠΌ ΡΠΎΠΏΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ число индСксу ячСйки массива (это достаточно Π»Π΅Π³ΠΊΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, взяв остаток ΠΎΡ‚ дСлСния этого числа Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ массива). Если Ρ…Π΅Ρˆ-функция написана Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° считаСтся Π·Π° O(1) (Π° ΠΎΠ½Π° Ρ‚Π°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈ написана), Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ΡΠ°ΠΌΡƒΡŽ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ…Π΅Ρˆ-мноТСства. Π―Ρ‡Π΅ΠΉΠΊΠ° массива Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… Ρ…Π΅Ρˆ-мноТСства ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ bucket‘ΠΎΠΌ.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ…Π΅Ρˆ-мноТСства

Как Π±Ρ‹ Π½ΠΈ Π±Ρ‹Π»Π° написана Ρ…Π΅Ρˆ-функция, число ячССк массива всСгда ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΎ, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ мноТСство элСмСнтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² структурС Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΎ. Π’Π΅Π΄ΡŒ ΠΌΡ‹ Π±Ρ‹ Π½Π΅ стали Π·Π°ΠΌΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ со структурой Π΄Π°Π½Π½Ρ‹Ρ…, Ссли Π±Ρ‹ Π±Ρ‹Π»Π° ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒ Π² сохранСнии всСго лишь дСсяти Π·Π°Ρ€Π°Π½Π΅Π΅ извСстных элСмСнтов, Π²Π΅Ρ€Π½ΠΎ? Π’Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π΅Π» ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π½Π΅ΠΈΠ·Π±Π΅ΠΆΠ½Ρ‹ΠΌ коллизиям. Под ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠ΅ΠΉ понимаСтся ситуация, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Ρ€Π°Π·Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΌΡ‹ ΠΏΠΎΠΏΠ°Π΄Π°Π΅ΠΌ Π² ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ ячСйку массива.

Для Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π½ΠΎ 2 ΠΌΠ΅Ρ‚ΠΎΠ΄Π°: ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ адрСсации.

ΠœΠ΅Ρ‚ΠΎΠ΄ Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ

ΠœΠ΅Ρ‚ΠΎΠ΄ Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ являСтся Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ простым ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ. Π’ ячСйкС массива ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π½Π΅ элСмСнты, Π° связанный список Π΄Π°Π½Π½Ρ‹Ρ… элСмСнтов. ΠŸΠΎΡ‚ΠΎΠΌΡƒ ΠΊΠ°ΠΊ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² Π½Π°Ρ‡Π°Π»ΠΎ списка (Π° Π½Π°ΠΌ всС Ρ€Π°Π²Π½ΠΎ Π² ΠΊΠ°ΠΊΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ списка Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ элСмСнт) ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ асимптотикой О(1), ΠΌΡ‹ Π½Π΅ испортим ΠΎΠ±Ρ‰ΡƒΡŽ асимптотику, ΠΈ ΠΎΠ½Π° останСтся Ρ€Π°Π²Π½ΠΎΠΉ О(1).

Π£ Π΄Π°Π½Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: Ссли списки Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‡Π΅Π½ΡŒ сильно Π²Ρ‹Ρ€Π°ΡΡ‚Π°Ρ‚ΡŒ (Π² качСствС ΠΊΡ€Π°ΠΉΠ½Π΅Π³ΠΎ случая ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ константу для любого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°), Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ асимптотику O(m), Π³Π΄Π΅ m β€” число элСмСнтов Π²ΠΎ мноТСствС, Ссли Ρ€Π°Π·ΠΌΠ΅Ρ€ массива фиксирован. Для избСТания Ρ‚Π°ΠΊΠΈΡ… нСприятностСй вводится понятиС коэффициСнт заполнСния (ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π΅Π½, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 1.5). Если ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ элСмСнта оказываСтся, Ρ‡Ρ‚ΠΎ доля числа элСмСнтов, находящихся Π² структурС Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ массива, прСвосходит коэффициСнт заполнСния, Ρ‚ΠΎ происходит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅: выдСляСтся Π½ΠΎΠ²Ρ‹ΠΉ массив, Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ прСвосходит Ρ€Π°Π·ΠΌΠ΅Ρ€ старого массива (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² 2 Ρ€Π°Π·Π°), ΠΈ структура Π΄Π°Π½Π½Ρ‹Ρ… пСрСстраиваСтся Π½Π° Π½ΠΎΠ²ΠΎΠΌ массивС.

Π”Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ ΠΈ примСняСтся Π² Java, Π° структура Π΄Π°Π½Π½Ρ‹Ρ… называСтся HashSet.

ΠœΠ΅Ρ‚ΠΎΠ΄ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ адрСсации

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Π² ячСйках хранятся сами элСмСнты, Π° Π² случаС ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΈ происходит ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ±, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ ΠΏΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Ρ‚ΡŒ ячСйки Π² Π½Π°Π΄Π΅ΠΆΠ΄Π΅ Π½Π°ΠΉΡ‚ΠΈ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡƒΡŽ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°ΠΌΠΈ (линСйная / квадратичная ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΎΠ±, Π΄Π²ΠΎΠΉΠ½ΠΎΠ΅ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅), ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ своими ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹Ρ… ΠΈΠ»ΠΈ Π²Ρ‚ΠΎΡ€ΠΈΡ‡Π½Ρ‹Ρ… кластСров).

ΠžΡ‚ Ρ…Π΅Ρˆ-мноТСства ΠΊ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π΅ (HashMap)

Π”Π°Π²Π°ΠΉΡ‚Π΅ создадим структуру Π΄Π°Π½Π½Ρ‹Ρ…, которая позволяСт Ρ‚Π°ΠΊ ΠΆΠ΅ быстро, ΠΊΠ°ΠΊ ΠΈ Ρ…Π΅Ρˆ-мноТСство (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π·Π° O(1)), Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ, ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ, ΠΈΡΠΊΠ°Ρ‚ΡŒ элСмСнты, Π½ΠΎ ΡƒΠΆΠ΅ ΠΏΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΊΠ»ΡŽΡ‡Ρƒ.

Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Ρ‚ΠΎΠΉ ΠΆΠ΅ структурой Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎ Ρƒ Ρ…Π΅Ρˆ-мноТСства, Π½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π±ΡƒΠ΄Π΅ΠΌ Π½Π΅ элСмСнты, Π° ΠΏΠ°Ρ€Ρ‹ элСмСнтов.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, вставка (put(Key key, Value value)) Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒΡΡ Ρ‚Π°ΠΊ: ΠΌΡ‹ посчитаСм ячСйку массива ΠΏΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Ρ‚ΠΈΠΏΠ° Key, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π½ΠΎΠΌΠ΅Ρ€ bucket’Π°. ΠŸΡ€ΠΎΠΉΠ΄Π΅ΠΌΡΡ ΠΏΠΎ списку Π² bucket’Π΅, сравнивая ΠΊΠ»ΡŽΡ‡ с ΠΊΠ»ΡŽΡ‡ΠΎΠΌ Π² Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Ρ… ΠΏΠ°Ρ€Π°Ρ…. Если нашли Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ ΠΊΠ»ΡŽΡ‡ β€” просто вытСсняСм староС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ссли Π½Π΅ нашли β€” добавляСм ΠΏΠ°Ρ€Ρƒ.

Как осущСствляСтся ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ элСмСнта ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ? Π”Π° ΠΏΠΎ ΠΏΠΎΡ…ΠΎΠΆΠ΅ΠΌΡƒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ: ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ bucket ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ, проходимся ΠΏΠΎ ΠΏΠ°Ρ€Π°ΠΌ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΏΠ°Ρ€Π΅, ΠΊΠ»ΡŽΡ‡ Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π²Π΅Π½ ΠΊΠ»ΡŽΡ‡Ρƒ Π² запросС, Ссли такая ΠΏΠ°Ρ€Π° Π΅ΡΡ‚ΡŒ, ΠΈ null Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС.

Данная структура Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ называСтся Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ.

Π’ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ вопросы Π½Π° собСсСдовании

Q: Как устроСны HashSet ΠΈ HashMap? Как ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‚ΡΡ основныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈΠΈ Π² Π΄Π°Π½Π½Ρ‹Ρ… коллСкциях? Как ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ equals() ΠΈ hashCode()?
A: ΠžΡ‚Π²Π΅Ρ‚Ρ‹ Π½Π° Π΄Π°Π½Π½Ρ‹Π΅ вопросы ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π²Ρ‹ΡˆΠ΅.

Q: Каков ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚ Π½Π° equals() ΠΈ hashCode()? Π§Π΅ΠΌ ΠΎΠ½ обусловлСн?
A: Если ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ€Π°Π²Π½Ρ‹, Ρ‚ΠΎ Ρƒ Π½ΠΈΡ… Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π½Ρ‹ hashCode. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, hashCode Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒΡΡ ΠΏΠΎ подмоТноству ΠΏΠΎΠ»Π΅ΠΉ, ΡƒΡ‡Π°Π²ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π² equals. ΠΠ°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€Π°ΠΊΡ‚Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ вСсьма интСрСсным эффСктам. Если ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ€Π°Π²Π½Ρ‹, Π½ΠΎ hashCode Ρƒ Π½ΠΈΡ… Ρ€Π°Π·Π½Ρ‹ΠΉ, Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π΅ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ΠΊΠ»ΡŽΡ‡Ρƒ, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π²Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² HashSet ΠΈΠ»ΠΈ Π² HashMap.

Π’Ρ‹Π²ΠΎΠ΄

На собСсСдованиях ΠΎΡ‡Π΅Π½ΡŒ Π»ΡŽΠ±ΡΡ‚ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ кСйсы, связанныС с этими структурами Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΡ€ΠΈ этом Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ любого ΠΈΠ· Π½ΠΈΡ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΎ ΠΈΠ· понимания ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² ΠΈΡ… Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π±Π΅Π· всякой Β«Π·ΡƒΠ±Ρ€Π΅ΠΆΠΊΠΈΒ».

На этом всС. Если Π²Ρ‹ Π΄ΠΎΡ‡ΠΈΡ‚Π°Π»ΠΈ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π°, ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ°ΡŽ Π½Π° бСсплатный ΡƒΡ€ΠΎΠΊ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅ Β«Π‘Π΅ΠΊΡ€Π΅Ρ‚Ρ‹ динамичСского программирования» Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΡƒΡ€ΠΎΠΊΠ° ΠΌΠΎΠΉ ΠΊΠΎΠ»Π»Π΅Π³Π° β€” Π•Π²Π³Π΅Π½ΠΈΠΉ Волосатов ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ ΠΊΠ°ΠΊ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΎΠ»ΠΈΠΌΠΏΠΈΠ°Π΄Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΈΠ΄Π΅ΠΈ динамичСского программирования.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π§Π°ΡΡ‚ΡŒ пСрвая ΠΎΡ‚Π²Π΅Ρ‚Π½ΠΈΠΊΠ°, Java

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ коллизия java

ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Π±Π»ΠΎΠΊΠΎΠΌ ΠΈΠ΄ΡƒΡ‚ вопросы ΠΎ языкС программирования Java.

1. ΠœΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ доступа Java (Π² порядкС ΠΎΡ‚ private Π΄ΠΎ public):

private β€” ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса.

protected β€” Поля ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ доступа protected, Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΈΠ΄Π½Ρ‹ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… всСх классов, находящихся Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΈ наш ΠΈ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… всСх классов-наслСдников нашСго класса.

public β€” НС Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Π½Π° доступ; ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π°ΡŽΡ‚ΡΡ для ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

2. РСализация Β«ΠΊΡƒΡ‡ΠΈΒ» (Π³Π΄Π΅ хранятся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹):

Π­Ρ‚Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ классов. НовыС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ всСгда ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π² ΠΊΡƒΡ‡Π΅, Π° ссылки Π½Π° Π½ΠΈΡ… хранятся Π² стСкС. Π­Ρ‚ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ доступ ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Ρ‹ ΠΈΠ· любого мСста ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π­Ρ‚Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти Ρ€Π°Π·Π±ΠΈΡ‚Π° Π½Π° нСсколько Π±ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π»ΠΊΠΈΡ… частСй, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… поколСниями:

Young Generation β€” ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π³Π΄Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π½Π΅Π΄Π°Π²Π½ΠΎ созданныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. Когда ΠΎΠ½Π° заполняСтся, происходит быстрая сборка мусора.

Old (Tenured) Generation β€” здСсь хранятся Π΄ΠΎΠ»Π³ΠΎΠΆΠΈΠ²ΡƒΡ‰ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. Когда ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠ· Young Generation Π΄ΠΎΡΡ‚ΠΈΠ³Π°ΡŽΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ€ΠΎΠ³Π° β€œΠ²ΠΎΠ·Ρ€Π°ΡΡ‚Π°β€, ΠΎΠ½ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² Old Generation.

Permanent Generation β€” эта ΠΎΠ±Π»Π°ΡΡ‚ΡŒ содСрТит ΠΌΠ΅Ρ‚Π°ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ классах ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… прилоТСния, Π½ΠΎ начиная с Java 8 данная ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти Π±Ρ‹Π»Π° ΡƒΠΏΡ€Π°Π·Π΄Π½Π΅Π½Π°.

Помимо рассмотрСнных Ρ€Π°Π½Π΅Π΅, ΠΊΡƒΡ‡Π° ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ особСнности:Когда эта ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ заполняСтся, Java бросаСт java.lang.OutOfMemoryError Доступ ΠΊ Π½Π΅ΠΉ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, Ρ‡Π΅ΠΌ ΠΊ стСку. Π­Ρ‚Π° ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ стСка, автоматичСски Π½Π΅ освобоТдаСтся. Для сбора Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ сборщик мусора. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ стСка, ΠΊΡƒΡ‡Π° Π½Π΅ являСтся потокобСзопасной ΠΈ Π΅Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ синхронизируя ΠΊΠΎΠ΄.

3. Π“Π΄Π΅ ΠΈ ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ equals() ΠΈ hashcode():

ΠœΠ΅Ρ‚ΠΎΠ΄ equals() ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π»ΠΈ Π΄Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΎΠ΄Π½ΠΎΠ³ΠΎ происхоТдСния логичСски Ρ€Π°Π²Π½Ρ‹ΠΌΠΈ. Π‘ΠΎΠ·Π΄Π°Ρ‚Π΅Π»ΡŒ класса сам опрСдСляСт характСристики, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ провСряСтся равСнство ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² этого класса.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ экзСмплярами ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ null. ΠŸΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ equals(), ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ соблюдСниС этих Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ:

Π Π΅Ρ„Π»Π΅ΠΊΡΠΈΠ²Π½ΠΎΡΡ‚ΡŒ: Π›ΡŽΠ±ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ equals() самому сСбС.

Π‘ΠΈΠΌΠΌΠ΅Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ: Если a.equals(b) == true, Ρ‚ΠΎ ΠΈ b.equals(a) Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ true.

Π’Ρ€Π°Π½Π·ΠΈΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ: Если Π΄Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ€Π°Π²Π½Ρ‹ ΠΊΠ°ΠΊΠΎΠΌΡƒ-Ρ‚ΠΎ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ, Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π½Ρ‹ Π΄Ρ€ΡƒΠ³ ΠΈ Π΄Ρ€ΡƒΠ³Ρƒ. Если a.equals(b) == true ΠΈ a.equals(c) == true, Π·Π½Π°Ρ‡ΠΈΡ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° b.equals(c) Ρ‚ΠΎΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ true.

ΠŸΠΎΡΡ‚ΠΎΡΠ½Π½ΠΎΡΡ‚ΡŒ: Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ equals() Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ входящих Π² Π½Π΅Π³ΠΎ ΠΏΠΎΠ»Π΅ΠΉ. Если Π΄Π°Π½Π½Ρ‹Π΅ Π΄Π²ΡƒΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π΅ мСнялись, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° equals() Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ всСгда ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ.

Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ с null для любого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° a.equals(null) Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ false.

ΠœΠ΅Ρ‚ΠΎΠ΄ hashCode() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ для любого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° 32-Π±ΠΈΡ‚Π½ΠΎΠ΅ число Ρ‚ΠΈΠΏΠ° int. Если Π΄Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ€Π°Π²Π½Ρ‹ (Ρ‚.Π΅. ΠΌΠ΅Ρ‚ΠΎΠ΄ equals() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true), Ρƒ Π½ΠΈΡ… Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Ρ…ΡΡˆ-ΠΊΠΎΠ΄. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΠΎ hashCode() Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠ΄Ρ‚ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΉ для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ быстродСйствия. Если ΠΌΠ΅Ρ‚ΠΎΠ΄ hashCode() вызываСтся нСсколько Ρ€Π°Π· Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΈ Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ число. ΠžΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Ρ…ΡΡˆ-ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρƒ Π΄Π²ΡƒΡ… Ρ€Π°Π·Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ equals ΠΈ hashCode Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ вмСстС.

4. Π§Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚, Ссли Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ hashcode():

Π’ΠΎΠ³Π΄Π° с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΌΠ΅Ρ‚ΠΎΠ΄Π° equals Π΄Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π±ΡƒΠ΄ΡƒΡ‚ логичСски Ρ€Π°Π²Π½Ρ‹, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΌΠ΅Ρ‚ΠΎΠ΄Π° hashCode ΠΎΠ½ΠΈ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΎΠ±Ρ‰Π΅Π³ΠΎ.

5. РСализация HashMap:

HashMap β€” основан Π½Π° Ρ…ΡΡˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ…, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс Map (Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² Π²ΠΈΠ΄Π΅ ΠΏΠ°Ρ€ ΠΊΠ»ΡŽΡ‡/Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅). ΠšΠ»ΡŽΡ‡ΠΈ ΠΈ значСния ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ², Π² Ρ‚ΠΎΠΌ числС ΠΈ null. Π‘Π½Π°Ρ‡Π°Π»Π° ΠΊΠ»ΡŽΡ‡ провСряСтся Π½Π° равСнство с null. Если это ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π²Π΅Ρ€Π½ΡƒΠ»Π° true, Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ putForNullKey(value). Π”Π°Π»Π΅Π΅ гСнСрируСтся Ρ…ΡΡˆ Π½Π° основС ΠΊΠ»ΡŽΡ‡Π°. Для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ hash(hashCode), Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСдаСтся key.hashCode(). Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° indexFor(hash, tableLength), опрСдСляСтся позиция Π² массивС, ΠΊΡƒΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ элСмСнт. Π’Π΅ΠΏΠ΅Ρ€ΡŒ, зная индСкс Π² массивС, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ список (Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ) элСмСнтов, привязанных ΠΊ этой ячСйкС. Π₯эш ΠΈ ΠΊΠ»ΡŽΡ‡ Π½ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта ΠΏΠΎΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎ ΡΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ с Ρ…ΡΡˆΠ°ΠΌΠΈ ΠΈ ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ элСмСнтов ΠΈΠ· списка ΠΈ, ΠΏΡ€ΠΈ совпадСнии этих ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ элСмСнта пСрСзаписываСтся. Если ΠΆΠ΅ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ шаг Π½Π΅ выявил совпадСний, Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ addEntry(hash, key, value, index) для добавлСния Π½ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта.

6. Как Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ коллизия Π² HashMap (ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ ΠΈΠ»ΠΈ открытая адрСсация):

Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ. КаТдая ячСйка массива H являСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° связный список (Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ) ΠΏΠ°Ρ€ ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ Ρ…Π΅Ρˆ-Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΊΠ»ΡŽΡ‡Π°. Коллизии просто приводят ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ Π΄Π»ΠΈΠ½ΠΎΠΉ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта.

7. Π’ΠΈΠ΄Ρ‹ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π² Java:

Unchecked(Error, RunTimeException); Checked(Exception)

8. Π’ΠΈΠ΄Ρ‹ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ Java (пСрСчисляСтС всё, Ρ‡Ρ‚ΠΎ Π·Π½Π°Π΅Ρ‚Π΅):

List, Set, Queue, Deque, Map.

9. Π’ΠΈΠΏΡ‹ ссылок Java ΠΈ Π³Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, Π² порядкС убывания Тёсткости:

Π‘ΠΈΠ»ΡŒΠ½Ρ‹Π΅, ΠΎΠ½ΠΈ ΠΆΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅, Π½ΡƒΠΆΠ½Ρ‹ для указания Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Π² памяти всё Ρ‚ΠΎ врСмя, Ρ‡Ρ‚ΠΎ эти ссылки Π½Π° Π½Π΅Π³ΠΎ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚. Если Π½Π΅ складываСтся, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ OutOfMemoryError.

МягкиС ссылки ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ для кэшСй, Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΊ доступному ΠΎΠ±ΡŠΡ‘ΠΌΡƒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΏΠΎ Π½ΠΈΠΌ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Ρ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒΡΡ, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² случаС нСобходимости. НапримСр, Ссли Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² с ΡΠΈΠ»ΡŒΠ½Ρ‹ΠΌΠΈ ссылками, Π° ΡƒΠΆΠ΅ Π½Π΅Π³Π΄Π΅, Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ кэш ΠΈ Π·Π°ΠΌΠ΅Π΄Π»ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ, Ρ‡Π΅ΠΌ ΡƒΡ€ΠΎΠ½ΠΈΡ‚ΡŒ процСсс Π½Π°ΠΏΡ€ΠΎΡ‡ΡŒ.

Π‘Π»Π°Π±Ρ‹Π΅ ссылки ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ для сопоставлСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ‡Π΅ΠΌΡƒ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π±Π΅Π· удСрТивания ΠΈΡ… ΠΎΡ‚ зачистки ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ большС Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹ (Π°-ля Map >). На Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ зачистки ΠΎΠ½ΠΈ Π½Π΅ Π²Π»ΠΈΡΡŽΡ‚ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½ΠΈΠΊΠ°ΠΊ, слабыС ссылки Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‡ΠΈΡ‰Π΅Π½Ρ‹ ΠΏΡ€ΠΈ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΌ запускС сборщика.

Π€Π°Π½Ρ‚ΠΎΠΌΠ½Ρ‹Π΅ ссылки Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΡƒΠΆΠ΅ ΠΏΡ€ΠΈΠ·Π½Π°Π½ мусором, Ρ„ΠΈΠ½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ ΠΈ находится Π² процСссС зачистки, ΠΎ Ρ‡Ρ‘ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ класса Cleaner ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π² это врСмя ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ собствСнныС дСйствия.

10. Бпособы синхронизации Java:

Бинхронизация относится ΠΊ многопоточности. Π‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. Бинхронизация достигаСтся Π² Java использованиСм Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ слова synchronized. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² своих классах, опрСдСляя синхронизированныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈΠ»ΠΈ Π±Π»ΠΎΠΊΠΈ. Π’Ρ‹ Π½Π΅ смоТСтС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ synchronized Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°Ρ… Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ класса.

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°-это ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, ΠΊΠΎΠ³Π΄Π° трСбуСтся ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ нСстатичСский ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΠ»ΠΈ нСстатичСский Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π° Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠ³ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π° Π½Π° Π΄Π°Π½Π½ΠΎΠΌ экзСмплярС класса. Π­Ρ‚ΠΎ всСгда Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ сдСлано, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ потокобСзопасными Π΄Π°Π½Π½Ρ‹Π΅ уровня экзСмпляра.

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° уровня класса ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π²Π²ΠΎΠ΄ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² синхронизированный Π±Π»ΠΎΠΊ Π² любом ΠΈΠ· всСх доступных экзСмпляров Π²ΠΎ врСмя выполнСния. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ссли Π²ΠΎ врСмя выполнСния Π΅ΡΡ‚ΡŒ 100 экзСмпляров DemoClass, Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ смоТСт Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ demoMethod() Π² любом ΠΈΠ· экзСмпляров ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, Π° всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ экзСмпляры Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ для Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².

11. Volatile β€” Ρ‡Ρ‚ΠΎ это:

Π—Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚ ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² кэш. ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово volatile указываСтся для поля для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ компилятору, Ρ‡Ρ‚ΠΎ всС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ присвоСния этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈ всС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ чтСния ΠΈΠ· Π½Π΅Ρ‘ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹ΠΌΠΈ. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, присвоСниС значСния этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ связь happens-before (ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ-Π΄ΠΎ) для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ‡Ρ‚Π΅Π½ΠΈΠΉ ΠΈΠ· этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ для Π»ΡŽΠ±Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ послС присвоСния Π½ΠΎΠ²ΠΎΠ³ΠΎ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ увидят это Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Java позволяСт ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ Π² цСлях ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΏΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅Ρ‘ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² ΠΊΠ΅ΡˆΠ°Ρ… ΠΈΠ»ΠΈ рСгистрах процСссора). Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС послС записи Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ Π½ΠΎΠ²ΠΎΠ³ΠΎ значСния Π² ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ свою Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ копию со старым Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ.

ИспользованиС ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова volatile Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ всСгда Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰Π΅Π΅, исходноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΈ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ измСнСния этого исходного значСния Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ сразу ΠΆΠ΅. Аналогично всС измСнСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π΄ΡˆΠΈΠ΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ sychronized-ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ synchronized-Π±Π»ΠΎΠΊΠΎΠ², Π° Ρ‚Π°ΠΊΠΆΠ΅ Π±Π»ΠΎΠΊΠΎΠ² с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ Π²Ρ€ΠΎΠ΄Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ интСрфСйса java.util.concurrent.locks.Lock послС Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Π²ΠΈΠ΄Π½Ρ‹ Π»ΡŽΠ±Ρ‹ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ послС взятия Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π½Π°Π΄ Ρ‚Π΅ΠΌ ΠΆΠ΅ самым ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, Π½ΠΎ Ссли Π±ΠΎΠ»Π΅Π΅ слоТныС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ volatile.

12. StringBuilder vs String:

Благодаря нСизмСнности, Ρ…ΡΡˆΠΊΠΎΠ΄ экзСмпляра класса String ΠΊΡΡˆΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ. Π•Π³ΠΎ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ значСния ΠΏΠΎΠ»Π΅ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ измСнятся послС Π΅Π³ΠΎ создания. Π­Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ Π²Ρ‹ΡΠΎΠΊΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈ использовании Π΄Π°Π½Π½ΠΎΠ³ΠΎ класса Π² качСствС ΠΊΠ»ΡŽΡ‡Π° для HashMap.

StringBuilder β€” измСняСмый класс, поэтому ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π½ΠΈΠΌ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΆΠ΅ количСства мусора Π² памяти, ΠΊΠ°ΠΊ со String. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ссли Π½Π°Π΄ строками проводится ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΉ, Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ StringBuilder.

13. НазовитС ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ HashMap (Hashtable, Π½ΠΎ устарСла):

SynchronizedMap ΠΈ ConcurrentHashMap.

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ SynchronizedMap ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ ConcurrentHashMap Π΅ΡΡ‚ΡŒ понятиС Β«Ρ‡Π΅Ρ€Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊΒ», ΠΊΠΎΠ³Π΄Π° вмСсто Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Π±Π»ΠΎΠΊΠΈ содСрТимого. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ΡΡ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

14. РСализация ArrayList Π² Java (Π½Π° Π±Π°Π·Π΅ массива):

Класс ArrayList Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс List ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒ свой Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²ΠΎ врСмя исполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΏΡ€ΠΈ этом Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈ создании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ ArrayList ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π»ΡŽΠ±Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π² Ρ‚ΠΎΠΌ числС ΠΈ null. Π’Π½ΡƒΡ‚Ρ€ΠΈ Ρƒ Π½Π΅Π³ΠΎ находится массив, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈ хранятся элСмСнты. Π£ArrayListΚΌa Π΅ΡΡ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΏΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π½ΠΈΠΌ: Когда этот Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ массив заполняСтся, ArrayList создаСт Π²Π½ΡƒΡ‚Ρ€ΠΈ сСбя Π½ΠΎΠ²Ρ‹ΠΉ массив. Π•Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ = (Ρ€Π°Π·ΠΌΠ΅Ρ€ старого массива * 1,5) +1. ВсС Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈΠ· старого массива Π² Π½ΠΎΠ²Ρ‹ΠΉ Π‘Ρ‚Π°Ρ€Ρ‹ΠΉ массив удаляСтся сборщиком мусора.

15. ΠœΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ final Π² Java β€” Π³Π΄Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΈ Ρ‡Ρ‚ΠΎ Π΄Π°Ρ‘Ρ‚:

ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΊ классам, ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ (Π² Ρ‚ΠΎΠΌ числС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²) Для класса это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ класс Π½Π΅ смоТСт ΠΈΠΌΠ΅Ρ‚ΡŒ подклассов, Ρ‚.Π΅. Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ наслСдованиС. Для ΠΌΠ΅Ρ‚ΠΎΠ΄Π° final ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² подклассах. Для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ‹ присвоСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ. Для ссылочных ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ послС присвоСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, нСльзя ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ссылку Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Бсылку ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ нСльзя, Π½ΠΎ состояниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ вопрос ΠΈΠ· своСго ΠΎΠΏΡ‹Ρ‚Π°:

КакиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Ρƒ класса Object?

public String toString() β€” Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ строковоС прСдставлСниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

public native int hashCode() ΠΈ public boolean equals(Object obj) β€” ΠŸΠ°Ρ€Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для сравнСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

public final native Class getClass() β€” Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ описываСт Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ класс.

public final native void notify(),
public final native void notifyAll(),
public final native void wait(long timeout),
public final void wait(long timeout, intnanos),
public final void wait() β€” ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ для контроля доступа ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ ΠΈΠ· Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π½ΠΈΡ‚Π΅ΠΉ. Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ синхронизациСй Π½ΠΈΡ‚Π΅ΠΉ.

protected void finalize() β€” ΠœΠ΅Ρ‚ΠΎΠ΄ позволяСт Β«ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒΒ» Ρ€ΠΎΠ΄Π½Ρ‹Π΅ Π½Π΅-Java рСсурсы: Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹, ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΈ Ρ‚.Π΄.

protected native Object clone() β€” ΠœΠ΅Ρ‚ΠΎΠ΄ позволяСт ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚: создаСт Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

ВсС ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ собраны ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… источников:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *