Пристрій і методи порівняння рядків в Java


Опубликованно 07.12.2018 08:48

Пристрій і методи порівняння рядків в Java

Люди і машини спілкуються між собою за допомогою збудованих особливим чином наборів символів. Символи збираються в слова, а слова — в пропозиції або рядки, з яких складається текст. Яку б програму не створювалося, набір символів завжди буде присутній, незалежно від мови. Об'єкт String в Java

В мові Java рядок є особливим об'єктом і позначається англійським словом String. До версії Java 1.7.0_06 в її основі лежав масив char value, що складається з особливого типу даних char. Об'єктом був 16-бітний символ Unicode зі значенням за замовчуванням 'u0000'. Також була присутня змінна int offset, яка говорила, з якого символу в цьому масиві починається рядок. Змінна int count описувала кількість символів, що приймаються рядком, починаючи з int offset. Але з появою Java 9, змінні offset та count перестали використовуватися. Ще одним нововведенням стала так звана «концепція compact string». Спроба ввести її робили і раніше, ще в Java 6, але тоді з'явилися проблеми з продуктивністю, і від цієї ідеї відмовилися.

Нововведення в Java 9

Масив char value в новій версії став byte value, так як за статистикою більшу частину рядків можна було уявити символами латинського алфавіту. А для них не потрібно використовувати 2 байти, достатньо одного. Тому було прийнято рішення ввести масив байтів і byte coder, який зберігає кодування — latin-1 або utf-16, де в першому випадку байт дорівнює нулю, а в другому — одиниці. У рядку для кожного символу виділено 1 байт, і як тільки зустрічається символ, який не вміщується, то для нього відводиться 2 байти. З-за цього довжина рядка не завжди дорівнює довжині масиву. Вони збігаються тільки в випадку якщо в ньому міститься кодування latin-1. Рядок дорівнює половині довжини масиву, якщо кодуванням є utf-16. Також в новій версії з'явилася константа boolean COMPACT_STRINGS.

Особливості класу String

Клас String — immutable, що означає незмінність. Також він final, тобто від нього не можна успадковуватись, не можна зробити якусь свою рядок на основі цього класу. Його об'єкти не можна змінювати після створення. Насправді всі методи, які нібито змінюють рядок, створюють новий об'єкт. Основними причинами цього є безпека і String pool. Безпека з точки зору потоків, полягає у відсутності необхідності синхронізувати операції. Можна передавати рядок між потоками. Тому не потрібно турбуватися, що рядок буде змінена.

Також є можливість зберігати hash-код безпосередньо в об'єкті. Безпека також полягає в тому, що рядки можна спокійно передавати в якості параметрів для авторизації, а незмінюваність гарантує, що в процесі пересилання вони не будуть перехоплені і змінені. String pool — це певний рядків кеш. В пам'яті, де зберігаються об'єкти, є місце, куди зберігаються рядки, створені шляхом зазначення в коді літералів. Для прискорення роботи та збереження пам'яті можна зберігати декілька посилань на одну рядок, якщо значення їх однакові. Для реалізації змінюваних String існують спеціальні класи — StringBuilder і StringBuffer. Обидва вони практично ідентичні, але другий потокобезопасный.

Методи класу String

З рядками можна працювати за допомогою різних методів. Вони дозволяють виконувати наступні дії: проводити порівняння довжин рядків Java; витяг підрядка рядка; отримувати символ за індексом або індекс символу; перевіряти рядок на порожнечу; дізнаватися довжину одного рядка; перетворення рядка в масив; змінювати регістр; з'єднувати рядка; розбивати рядок на масив; видаляти порожні символи спочатку і в кінці; замінювати підрядка.

До того, як прибрали offset та count метод вилучення підрядка рядка працював трохи інакше, ніж в новій версії. Він лише створював нову оболонку для об'єкта String, масив при цьому залишався старим. Можна було замінити частину рядка, але при цьому залишалася посилання на попередню версію. Це призводило до витоків пам'яті. Уникнути подібної проблеми можна було лише використовуючи копіює конструктор. У новій версії Java рядок зберігає тільки ті дані, які в неї записані.

Порівняння двох рядків Java

Розглянемо один з методів більш уважно. Особливо часто застосовується спеціальне дію в мові Java — порівняння рядків. У класу String для цього є два варіанти методу compareTo(). Метод compareTo(String anotherString) використовується для порівняння рядків Java об'єкт String з отриманим аргументом String і зіставляє їх лексично. Він поверне int зі значенням -1 для «менше», 0 для рівності або 1 для «більше». Цей метод корисний для алгоритмів сортування. Аналогічний метод для порівняння рядків в Java — Equals(). Він використовує логічні значення рівності і, коли об'єкти еквівалентні, повертається значення true. Якщо перший варіант застосовується для сортування, другий потрібен для визначення рівності. Ще один варіант порівняння рядків Java — метод compareToIgnoreCase(String str). Він схожий на попередній, але ігнорує регістр символів. Автор: Марія Штернберг 28 Серпня 2018



Категория: Техника