Progress-servis55.ru

Новости из мира ПК
5 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Java lang string

Java.lang.String Class

Introduction

The java.lang.String class represents character strings. All string literals in Java programs, such as «abc», are implemented as instances of this class.Strings are constant, their values cannot be changed after they are created

Class Declaration

Following is the declaration for java.lang.String class −

Field

Following are the fields for java.lang.String class −

static Comparator CASE_INSENSITIVE_ORDER − This is a Comparator that orders String objects as by compareToIgnoreCase.

>

Sr.No.Constructor & Description1

This initializes a newly created String object so that it represents an empty character sequence.

This constructs a new String by decoding the specified array of bytes using the platform’s default charset.

String(byte[] bytes, Charset charset)

This constructs a new String by decoding the specified array of bytes using the specified charset.

String(byte[] bytes, int offset, int length)

This constructs a new String by decoding the specified subarray of bytes using the platform’s default charset

String(byte[] bytes, int offset, int length, Charset charset)

This constructs a new String by decoding the specified subarray of bytes using the specified charset.

String(byte[] bytes, int offset, int length, String charsetName)

This constructs a new String by decoding the specified subarray of bytes using the specified charset.

String(byte[] bytes, String charsetName)

This constructs a new String by decoding the specified array of bytes using the specified charset.

This allocates a new String so that it represents the sequence of characters currently contained in the character array argument.

String(char[] value, int offset, int count)

This allocates a new String that contains characters from a subarray of the character array argument.

String(int[] codePoints, int offset, int count)

This allocates a new String that contains characters from a subarray of the Unicode code point array argument.

This initializes a newly created String object so that it represents the same sequence of characters as the argument; in other words, the newly created string is a copy of the argument string.

This allocates a new string that contains the sequence of characters currently contained in the string buffer argument.

This allocates a new string that contains the sequence of characters currently contained in the string builder argument.

>

Sr.No.Method & Description1char charAt(int index)

This method returns the char value at the specified index.

This method returns the character (Unicode code point) at the specified index.

This method returns the character (Unicode code point) before the specified index.

This method returns the number of Unicode code points in the specified text range of this String.

This method compares two strings lexicographically.

This method compares two strings lexicographically, ignoring case differences.

This method concatenates the specified string to the end of this string.

This method ceturns true if and only if this string contains the specified sequence of char values.

This method compares this string to the specified CharSequence.

This method compares this string to the specified StringBuffer.

This method returns a String that represents the character sequence in the array specified.

This method returns a String that represents the character sequence in the array specified.

This method tests if this string ends with the specified suffix.

This method compares this string to the specified object.

This method compares this String to another String, ignoring case considerations.

This method returns a formatted string using the specified locale, format string, and arguments.

This method returns a formatted string using the specified format string and arguments.

This method encodes this String into a sequence of bytes using the platform’s default charset, storing the result into a new byte array.

This method encodes this String into a sequence of bytes using the given charset, storing the result into a new byte array.

This method encodes this String into a sequence of bytes using the named charset, storing the result into a new byte array.

This method copies characters from this string into the destination character array.

This method returns a hash code for this string.

This method returns the index within this string of the first occurrence of the specified character.

This method returns the index within this string of the first occurrence of the specified character, starting the search at the specified index.

This method returns the index within this string of the first occurrence of the specified substring.

This method returns the index within this string of the first occurrence of the specified substring, starting at the specified index.

This method returns a canonical representation for the string object.

This method returns true if, and only if, length() is 0.

This method returns the index within this string of the last occurrence of the specified character.

This method returns the index within this string of the last occurrence of the specified character, searching backward starting at the specified index.

This method returns the index within this string of the rightmost occurrence of the specified substring.

This method returns the index within this string of the last occurrence of the specified substring, searching backward starting at the specified index.

This method returns the length of this string.

This method tells whether or not this string matches the given regular expression.

This method returns the index within this String that is offset from the given index by codePointOffset code points.

This method tests if two string regions are equal with case ignored.

This method tests if two string regions are equal.

This method returns a new string resulting from replacing all occurrences of oldChar in this string with newChar.

This method replaces each substring of this string that matches the literal target sequence with the specified literal replacement sequence.

This method replaces each substring of this string that matches the given regular expression with the given replacement.

This method replaces the first substring of this string that matches the given regular expression with the given replacement.

This method splits this string around matches of the given regular expression.

This method splits this string around matches of the given regular expression.

This method tests if this string starts with the specified prefix.

This method tests if the substring of this string beginning at the specified index starts with the specified prefix.

This method returns a new character sequence that is a subsequence of this sequence.

This method returns a new string that is a substring of this string.

This method returns a new string that is a substring of this string.

This method converts this string to a new character array.

This method converts all of the characters in this String to lower case using the rules of the default locale.

This method converts all of the characters in this String to lower case using the rules of the given Locale.

This method returns the string itself.

This method converts all of the characters in this String to upper case using the rules of the default locale.

This method converts all of the characters in this String to upper case using the rules of the given Locale.

This method returns a copy of the string, with leading and trailing whitespace omitted.

This method returns the string representation of the boolean argument.

This method returns the string representation of the char argument.

This method returns the string representation of the char array argument.

This method Returns the string representation of a specific subarray of the char array argument.

This method returns the string representation of the double argument.

This method returns the string representation of the float argument.

This method returns the string representation of the int argument.

This method returns the string representation of the long argument.

This method returns the string representation of the Object argument.

Работа со строками

Введение в строки. Класс String

Строка представляет собой последовательность символов. Для работы со строками в Java определен класс String, который предоставляет ряд методов для манипуляции строками. Физически объект String представляет собой ссылку на область в памяти, в которой размещены символы.

Для создания новой строки мы можем использовать один из конструкторов класса String, либо напрямую присвоить строку в двойных кавычках:

При работе со строками важно понимать, что объект String является неизменяемым ( immutable ). То есть при любых операциях над строкой, которые изменяют эту строку, фактически будет создаваться новая строка.

Поскольку строка рассматривается как набор символов, то мы можем применить метод length() для нахождения длины строки или длины набора символов:

А с помощью метода toCharArray() можно обратно преобразовать строку в массив символов:

Строка может быть пустой. Для этого ей можно присвоить пустые кавычки или удалить из стоки все символы:

В этом случае длина строки, возвращаемая методом length(), равна 0.

Класс String имеет специальный метод, который позволяет проверить строку на пустоту — isEmpty() . Если строка пуста, он возвращает true:

Переменная String может не указывать на какой-либо объект и иметь значение null :

Значение null не эквивалентно пустой строке. Например, в следующем случае мы столкнемся с ошибкой выполнения:

Так как переменная не указывает ни на какой объект String, то соответственно мы не можем обращаться к методам объекта String. Чтобы избежать подобных ошибок, можно предварительно проверять строку на null:

Основные методы класса String

Основные операции со строками раскрывается через методы класса String, среди которых можно выделить следующие:

concat() : объединяет строки

valueOf() : преобразует объект в строковый вид

join() : соединяет строки с учетом разделителя

сompare() : сравнивает две строки

charAt() : возвращает символ строки по индексу

getChars() : возвращает группу символов

equals() : сравнивает строки с учетом регистра

equalsIgnoreCase() : сравнивает строки без учета регистра

regionMatches() : сравнивает подстроки в строках

indexOf() : находит индекс первого вхождения подстроки в строку

lastIndexOf() : находит индекс последнего вхождения подстроки в строку

startsWith() : определяет, начинается ли строка с подстроки

endsWith() : определяет, заканчивается ли строка на определенную подстроку

replace() : заменяет в строке одну подстроку на другую

trim() : удаляет начальные и конечные пробелы

substring() : возвращает подстроку, начиная с определенного индекса до конца или до определенного индекса

toLowerCase() : переводит все символы строки в нижний регистр

toUpperCase() : переводит все символы строки в верхний регистр

Java Specialist

Блог о памяти, сборщике мусора, многопоточности и производительности в java

Содержание

понедельник, 16 мая 2011 г.

java.lang.String: вы уверены, что знаете про строки все?

Казалось бы, что может быть непонятно о таком часто используемом объекте как строки? Я тоже так думал долгие годы, однако, если почитать документацию и копнуть поглубже о некоторых свойствах строк, то можно найти много интересного. Например, я только недавно узнал, что время операции intern зависит от размера пула, что, на самом деле, созданную строку можно поменять стандартными средствами java, а в версии JVM 1.4 использование String, строго говоря, не является потокобезопасным.

Класс java.lang.String состоит из трех final полей: массив символов, длина строки и сдвиг в массиве, с помощью которого реализуется метод substring. Так же в этом классе есть поле, в котором хранится посчитанный хэшкод, после первого вызова метода hashCode.

Свойство Immutable и потокобезопасность

Так как все логические поля класса являются final, то модель памяти java 5.0 гарантирует, что после вызова конструктора все потоки, которые видят ссылку на экземпляр этого класса, увидят и все final поля. Однако до java 5 этого никто не гарантировал, поэтому поток, который данную строку не создавал, вполне мог получить ссылку на инконсистентный (с его точки зрения) объект.

Постойте, но, ведь, значение строки можно поменять через reflection:
Таким образом, получается, что строку можно поменять, а другой поток этих изменений и не увидит? Неправда — видимость измененных final полей через reflection тоже гарантируется моделью памяти java 5.0.

Методы, над реализацией которых, мало кто задумывается

Как я уже упоминал вначале, метод substring(int beginIndex, int endIndex) не копирует содержимое массива символов, а использует ссылку на оригинальный массив и выставляет соответствующим образом поля длины строки и сдвига. Таким образом, если вы считали большой файл в строку, потом взяли из него подстроку и удалили ссылку на первый объект, то память у вас нисколько не освободиться. Так же если вы сериализуете полученную подстроку стандартными средствами и передаете её по сети, то опять же ничего хорошего не выйдет, так как будет сериализован весь оригинальный массив и количество передаваемых байтов по сети вас неприятно удивит. Если это ваш случай, то после нахождения подстроки вы можете воспользоваться конструктором String(String original), который скопирует только реально используемую часть массива. Кстати, если этот конструктор вызывать на стоке длиной равной длине массива символов, то копирования в этом случае происходить не будет, а будет использоваться ссылка на оригинальный массив.

Методы String(byte[] bytes) и getBytes() кодируют и декодируют строку в байты и наоборот, используя кодировку по умолчанию, которую можно переопределить запустив JVM с параметром «Dfile.encoding=». Если вы кодировку не переопределяете, то используется UTF-8. Если её не присутствует в системе, то — ISO-8859-1. Если нет и её, то JVM завершается с кодом -1. Но когда я пытался выставить «Dfile.encoding=» в java 1.4, то она у меня не подцеплялась. Погуглив немного, я выяснил, что с данной проблемой сталкивался не только я, правда, почему этот параметр не хочет работать, я так и не нашел.

Важно не путать вышеупомянутые методы с String(byte[] ascii, int hibyte), String(byte[] ascii, int hibyte, int offset, int count) и getBytes(int srcBegin, int srcEnd, byte[] dst, int dstBegin), которые могут некорректно преобразовать символы в байты и обратно.

Переопределение операции «+»

Здесь важно понимать, что данный оператор переопределяется не на уровне байткода, а еще на этапе компиляции java файла в байткод. Если вы декомпилируете байткод, то уже не увидите никакого сложения,а вместо операции
вы уже увидите что-то похожее на
Т.е. смысла засорять ваш код и вместо простого знака «+» городить громоздкий и плохо читаемый код из StringBuilder смысла никакого нет. Даже скажу больше, те кто в java 1.4. вместо плюсов писали StringBuffer, то их код в пятой джаве теперь может работать даже медленнее, так как StringBuffer работает не быстрее чем StringBuilder.
Еще в последних версиях JVM появился замечательный оптимизационный флаг -XX:+OptimizeStringConcat , который при вызове метода StringBuilder .toString() не будет копировать внутренний массив StringBuilder в новый String, а будет использовать тот же массив, таким образом операция конкатенации будет проходить вообще без копирования массивов.

Однако стоить заметить, что в циклах JVM вам может и не заменить операцию «+» на StringBuilder. Вернее она может заменить её на создание нового StringBuilder на каждом шаге цикла, т.е. код
может быть скомпилирован в
Да, раз уж начал об этом писать, то, наверное, стоить упомянуть, что код String a = «b» + «c» скомпилируется в String a = «bc»

Сколько же String занимает места в памяти?

Казалось, бы чего тут сложного — строка это объект с тремя полями int и массивом char’ов, т.е.

[8 bytes (заголовок объекта) + 3*4(int) + 4 (ссылка на массив)] <выравнивание по 8 байтам>+ [8 bytes (заголовок объекта массива) + 4(int длины массива) + 2(char)*длина_строки] <выравнивание по 8 байтам>= 24 + [12 + 2*length] <выравнивание по 8 байтам>= [36 + 2*length]

Получается пустая строка в сумме будет весить 40 байтов.

Теперь посмотрим во что это обернется на 64 битной jvm:

Таким образом пустая строка уже вести 64 байта.

Если же у нас включена опция (-XX:+UseCompressedOops), которая в последних JVM уже работает по умолчанию для куч размером меньше 32 гигов, то имеем следующую арифметику:

[16 bytes (заголовок объекта) + 3*4(int) + 4 (ссылка на массив)] <выравнивание по 8 байтам>+ [16 bytes (заголовок массива) + 2(char)*длина_строки] <выравнивание по 8 байтам>= 32 + [16 + 2*length] <выравнивание по 8 байтам>= 48 + 2*length

Значит для пустой строки в этом случае нам надо 48 байтов.

Так же не стоит забывать о существовании параметра -XX:+UseCompressedStrings, при использовании которого, ANSII строки будут содержать внутри массив байтов, а не символов. Таким образом в формулах выше нужно длину строки умножать на один, а не на два. Т.е. данная опция может сократить размер строк до двух раз.

Пул строк

Как вы уже знаете в java есть пул строк. Туда неявно попадают все литералы (строки в коде оформленные через двойные кавычки «literal»). Так же есть возможность положить строку в пул явно с помощью метода intern(). Например, классы java reflection интенсивно используют этот метод, и все имена полей и методов класса попадают в пул. Соответственно, то же самое происходит при использовании стандартной java сериализации, которая неявно использует reflection. Так же обычно библиотеки работающие с XML кладут в пул названия элементов и атрибутов документов.

Пул располагается в PermGen и хранит строки с помощью слабых ссылок. Таким образом при вызове Full GC, если ваша куча больше не ссылается на строки, находящиеся в пуле, то сборщик мусора их очищает. Однако не стоит увлекаться складыванием всего попало в пул: чем больше в вашем пуле находится строк, тем дольше будет операция на проверку находится ли строка уже там или нет. Мои замеры показали, что зависимость примерно прямо пропорциональна (О(n)) и при размере пула 1 миллион строк, каждая такая операция у меня уже занимала несколько микросекунд.

Говоря о пуле строк, не могу не упомянуть почему некоторые библиотеки при объявлении констант используют вышеописанный метод intern:
Данная конструкция может показаться абсурдной не искушенному программисту. И правда, зачем класть эту строку в пул, если она и так константа и присутствует в единственном экземпляре. И вообще, это же литерал, он и так должен неявно попадать в пул. Однако цель, с которой это делается в библиотеках — совсем не пулинг. Дело в том, что если бы эта константа была объявлена в библиотеке просто как
и вы бы использовали её в своем коде, то при компилировании в байткод эта строка заинлайнилась. И если бы вы потом подложили jar с новой версией библиотеки, и не перекомпилировали ваши исходники, то ваш код изменения в данной константе просто бы не заметил.

Класс String

В языке программирования Java строки — это объект, который представляет из себя последовательность символов. Здесь мы рассмотрим методы создания и управления строками.

ТипМетодОписание
charcharAt(int index)Возвращает char со значением равным символу с индексом index.
intcompareTo(String anotherString)Сравнивает указанную строку. Используется при сортировке.
intcompareToIgnoreCase(String str)Сравнивает указанную строку. Здесь не учитывается регистр.
Stringconcat(String str)Присоединяет строку str к концу родительской строки.
booleancontains(CharSequence s)Возвращает true, если строка содержит указанную последовательность символов.
booleancontentEquals(CharSequence cs)Сравнивает данную строку с указанным CharSequence .
booleancontentEquals(StringBuffer sb)Сравнивает данную строку с указанным StringBuffer .
booleanendsWith(String suffix)Проверяет, заканчивается ли строка с указанной строкой.
booleanequals(Object anObject)Сравнивает строки по значению с учетом регистра.
booleanequalsIgnoreCase(String anotherString)Сравнивает строки по значению без учета регистра.
static Stringformat(String format, Object… args)Возвращает отформатированную строку, используя специальный формат строки и аргументы.
byte[]getBytes()Возвращает представление строки в виде массива байт.
inthashCode()Возвращает хеш-код строки.
intindexOf(int ch)Возвращает индекс первого вхождения символа в строку.
intindexOf(int ch, int fromIndex)Возвращает индекс первого вхождения символа в строку, начиная с указанной позиции.
intindexOf(String str)Возвращает индекс первого символа подстроки в строке.
intindexOf(String str, int fromIndex)Возвращает индекс первого символа подстроки в строке, начиная с указанной позиции.
booleanisEmpty()Проверяет, пустая строка или нет.
intlastIndexOf(int ch)Поиск последнего символа в строку.
intlastIndexOf(int ch, int fromIndex)Поиск последнего вхождения символа в строку. Он Осуществляется назад, от указанной позиции до начала строки.
intlastIndexOf(String str)Поиск последнего вхождения строки.
intlastIndexOf(String str, int fromIndex)Поиск последнего вхождения строки. Он Осуществляется назад, от указанной позиции до начала строки.
intlength()Возвращает количество символов в строке.
booleanmatches(String regex)Проверяет, удовлетворяет ли строка указанному регулярному выражению.
Stringreplace(char oldChar, char newChar)Заменяет в строке один символ на другой
Stringreplace(CharSequence target, CharSequence replacement)Заменяет одну подстроку другой.
StringreplaceAll(String regex, String replacement)Заменяет каждую подстроку данной строки, которая соответствует данному регулярному выражению на заданную строку.
StringreplaceFirst(String regex, String replacement)Заменяет первую подстроку данной строки, которая соответствует данному регулярному выражению на заданную строку.
booleanstartsWith(String prefix)Проверяет, начинается ли строка с указанной строки.
booleanstartsWith(String prefix, int toffset)Проверяет, начинается ли строка в указанной позиции с указанной строки.
Stringsubstring(int beginIndex)Возвращает подстроку начиная с beginIndex (включительно) до конца строки.
Stringsubstring(int beginIndex, int endIndex)Возвращает подстроку начиная с beginIndex (включительно) до endIndex (не включительно).
char[]toCharArray()Преобразует строку в массив символов.
StringtoLowerCase()Конвертирует все символы строки в нижний регистр.
StringtoString()Возвращает сам объект, который уже является строкой.
StringtoUpperCase()Конвертирует все символы строки в верхний регистр.
Stringtrim()Удаляет пробелы в начале и конце строки.
static StringvalueOf(boolean b)Возвращает значение булевой переменной в виде стоки.
static StringvalueOf(char c)Возвращает значение символьной переменной в виде стоки.
static StringvalueOf(char[] data)Возвращает значение массива символов в виде стоки.
static StringvalueOf(char[] data, int offset, int count)Возвращает значение массива символов в виде стоки.
static StringvalueOf(double d)Возвращает значение double-переменной в виде стоки.
static StringvalueOf(float f)Возвращает значение float-переменной в виде стоки.
static StringvalueOf(int i)Возвращает значение int-переменной в виде стоки.
static StringvalueOf(long l)Возвращает значение long-переменной в виде стоки.
static StringvalueOf(Object obj)Возвращает строковое представление объекта.

Создание строк

Самый простой способ создания строки:

Создание строки из символа:

Создание строки из массива символов:

Также задать диапазон символьного массива. Для этого нужно указать начало диапазона и количество символов:

Получение длины строки

length() — возвращает количество символов в строке.

Проверка строки на пустоту

isEmpty() — проверяет, пустая строка или нет.

Конкатенация (объединение) строк

concat(String str) — присоединяет строку str к концу родительской строки.

Операторы + и += для String

Оператор «+» — аналог метода concat для String.

Оператор «+=» — присоединяет к строке, стоящей до оператора строку, стоящую после этого оператора.

Сравнивание строк

equals(String anotherString) — сравнивает строки по значению с учетом регистра.

equalsIgnoreCase(String anotherString) — сравнивает строки по значению без учета регистра

Разница между == и equals()

Оператор == сравнивает ссылаются ли две ссылки на один и тот же объект, в то время как equals() сравнивает содержат ли два объекта одни и те же данные.

Форматирование строки

format(String format, Object… args) — возвращает отформатированную строку, используя специальный формат строки и аргументы.

Поиск подстроки в строке

indexOf(String str) — возвращает индекс первого символа подстроки в строке.

indexOf(String str, int fromIndex) — возвращает индекс первого символа подстроки в строке, начиная с указанной позиции.

lastIndexOf(String str) — поиск последнего вхождения строки.

lastIndexOf(String str, int fromIndex) — поиск последнего вхождения строки. Он осуществляется назад, от указанной позиции до начала строки.

startsWith(String prefix) — проверяет, начинается ли строка с указанной строки.

startsWith(String prefix, int toffset) — проверяет, начинается ли строка в указанной позиции с указанной строки.

endsWith(String str) — проверяет заканчивается ли строка на указанную строку.

contains(CharSequence s) — возвращает true, если строка содержит указанную последовательность символов.

Сортировка строк

compareTo(String anotherString) — сравнивает указанную строку. Используется при сортировке. Здесь учитывается регистр и слова с верхним регистром стоят выше слова с нижним регистром.Если строки совпадают, то возвращается 0, если вызывающая строка меньше строки string то возвращается число меньше нуля, вызывающая строка больше строки string, то возвращается число больше нуля.

compareToIgnoreCase(String anotherString) — сравнивает указанную строку. Здесь не учитывается регистр.

Получение хеш-кода строки

hashCode() — возвращает хеш-код строки.

Хеш-код у двух одинаковых строк будет одним и тем же.

Изменение регистра строки

toLowerCase() — конвертирует все символы строки в нижний регистр.

toUpperCase() — конвертирует все символы строки в верхний регистр.

Удаление лишних пробелов

trim() — удаляет пробелы в начале и конце строки.

Получение символа из строки

charAt(int index) — возвращает char со значением равным символу с индексом index.

Получение подстроки из строки

substring(int beginIndex, int endIndex) — возвращает подстроку начиная с beginIndex (включительно) до endIndex (не включительно).

substring(int beginIndex) — возвращает подстроку начиная с beginIndex (включительно) до конца строки.

Замена символов и строк

replace(char oldChar, char newChar) — заменяет в строке один символ на другой.

replace(CharSequence target, CharSequence replacement) — заменяет одну подстроку другой.

Получение строковых представлений классов

valueOf(boolean b) — возвращает значение булевой переменной в виде стоки.

valueOf(char c) — возвращает значение символьной переменной в виде стоки.

valueOf(char[] data) — возвращает значение массива символов в виде стоки.

valueOf(char[] data, int offset, int count) — возвращает значение массива символов в виде стоки.

valueOf(double d) — возвращает значение double-переменной в виде стоки.

valueOf(float f) — возвращает значение float-переменной в виде стоки.

valueOf(int i) — возвращает значение int-переменной в виде стоки.

valueOf(long l) — возвращает значение long-переменной в виде стоки.

valueOf(Object obj) — возвращает строковое представление объекта.

Проверка строки регулярным выражением

matches(String regex) — проверяет, удовлетворяет ли строка указанному регулярному выражению.

Перевод строки в байты

getBytes() — возвращает представление строки в виде массива байт.

Читать еще:  Javascript window close
Ссылка на основную публикацию
Adblock
detector