1. Введение в строку, общие методы Анализ исходного кода
2. Анализ бассейна «Постоянный» строки
Общие методы
равно
подрезать
заменять
конг
расколоть
Startswith и Endswith
Подстроение
touppercase () и tolowercase ()
сравнение
Введение в строку
Класс строки изменяется окончательным, что означает, что объект String является неизменным, а одновременные программы предпочитают неизбежные. Класс строки реализует сериализуемые, сопоставимые и шарнирные интерфейсы.
Начните с куска кода:
public void stringTest () {String a = "a"+"b" +1; Строка b = "ab1"; System.out.println (a == b);}Угадай, каков результат? Если ваш вывод верен. Хорошо, давайте получим еще один код:
public void StringTest () {String a = new String ("ab1"); Строка b = "ab1"; System.out.println (a == b);}Какой результат? Правильный ответ ложный.
Посмотрим, как код, составленный компилятором
// первый код public void stringTest () {string a = "ab1"; Строка b = "ab1"; System.out.println (a == b);} // второй код public void stringTest () {String a1 = new String ("ab1"); Строка b = "ab1"; System.out.println (a1 == b);}Другими словами, первый кусок кода был оптимизирован в течение периода компиляции, потому что компилятор обнаружил, что эффекты «+» B »+1 и« AB1 »одинаковы, и оба они состоят из неподвижных. Но почему их память адресована одинаково? Если вы все еще заинтересованы в этом, давайте посмотрим на некоторые важные исходные коды класса строк.
Исходный код
1. Строковые атрибуты
Класс строки содержит неподвижный массив Char для хранения строк, и для хранения вычисленного хэш -значения используется вариабельный хэш int.
/** Значение используется для хранения символов. */private final value char [];/** кэшировать хэш -код для строки*/private int hash; // по умолчанию 0/** Используйте SerialVersionUID из JDK 1.0.2 для совместимости*/private Static Long Long SerialVersionUID = -6849794470754667710L;
2. Строковой конструктор
// Конструкторы без параметров, как правило, бесполезны, потому что значение представляет собой неизменную публичную string () {this.value = new char [0];} // Параметр - тип строки public string (string riginal) {this.value = original.value; this.hash = original.hash;} // Параметр - это массив char, используйте класс массивов в пакете java.utils, чтобы скопировать открыту Bytes [], int offset, int длина, String charsetName) бросает UnsupportedEncodingException {if (charsetName == null) бросить новое NullPointerException ("charsetName"); CHACKBOUNDS (байты, смещение, длина); this.value = stringCoding.decode (charsetName, байты, смещение, длина);} // вызвать общедоступную строку (байтовые байты [], смещение int, int, string charsetname) конструктораторная строка (байтовые байты [], string charsetname) thripseSexexexexexexexexexexexexexexexexexexexexexexexexexexex3. Общие методы строки
1. Равенство
Boolean Equals (Object anobject) public boolean equals (object anobject) {// Если ссылка является тем же объектом, верните true if (this == anobject) {return true; } // Если данные типа строки не являются строкой, вернуть false if (anobject encessionof string) {string anotherstring = (string) anobject; int n = value.length; // Если длина массива char не равна, вернуть false if (n == anotherstring.value.length) {char v1 [] = value; char v2 [] = anotherstring.value; int i = 0; // Судите с единого символа обратно на фронт, если есть какое-либо неравенство, верните false while (n--! = 0) {if (v1 [i]! = V2 [i]) вернуть false; i ++; } // Каждый символ равен, вернуть True return true; }} вернуть false;}String e1 = "good"; string e2 = "Хороший каждый день"; e1.equals (e2); // вернуть ложь
1 Сначала определите, ссылается ли один и тот же объект ==, то есть определить, одинаковы ли адреса памяти двух ссылок. Если то же самое, он прямо вернет истин.
2 определит, являются ли типы одинаковыми и являются ли они одинаковыми типами данных
3 Если используется тот же тип, длина преобразованной матрицы символов одинакова.
4 Сравните, одинаково ли каждый символ сзади
Орден суда =》 1. Адрес памяти 2. Тип данных 3. Длина массива символов 4. Сравнение единого символов
2. Сравнение
int compareto (String anotherstring) public int compareto (string anotherstring) {// Длина строки собственного объекта len1 int len1 = value.length; // длина строки сравниваемого объекта len2 = anotherstring.value.length; // минимальное значение длины двух строк lim int lim = math.min (len1, len2); char v1 [] = value; char v2 [] = anotherstring.value; int k = 0; // от первого символа значения до минимальной длины LIM, если символы не равны, возвращайте себя (символы, где объекты не равны - символы, которые сравниваются), в то время как (k <lim) {char c1 = v1 [k]; char c2 = v2 [k]; if (c1! = c2) {return c1 - c2; } k ++; } // Если фронты равны, возвращайте (сама длина - длина сравниваемого объекта) вернуть len1 - len2;}String co1 = "hello"; string co2 = "hello"; string co3 = "hello you"; System.out.println (co1.compareto (co2)); // 0system.out.println (co1.compareto (co3)); // -4
Этот метод изобретательно написан, и вы можете судить о размере персонажа от 0.
Если сравнение между двумя объектами может сравнивать символы, все еще равно, то длина сравниваемого объекта возвращается непосредственно. Если длина двух строк равна, то возврат равен 0, что умно судит три ситуации.
3. Hashcode
int hashcode () public int hashcode () {int h = hash; // Если хэш не был рассчитан и строка не является пустой, то вычисление хэшкода выполняется, если (h == 0 && value.length> 0) {char val [] = value; // Процесс вычисления // s [0]*31^(n-1) + s [1]*31^(n-2) + ... + s [n-1] для (int i = 0; i <value.length; i ++) {h = 31*h + vAl [i]; } // хеш -назначение хэш = h; } return h;}String a = "toyou"; char val [] = a.tochararray (); char c1 = 't'; char c2 = 'a'; int f = c1; int e = c2; System.out.println (e); // 97 asystem.out.println (f); // 116 tsystem.out.println (31*val [0]); // 3596System.out.println (31*C1); // 3596 // Расчет хэшкодов, потому что символы символов могут быть автоматически преобразованы в соответствующую формирование int
Класс строки переопределяет метод хэшкода, а метод хэшкода в объекте является собственным вызовом.
Хеш класса строк рассчитывается с использованием полиномов. Мы можем полностью получить один и тот же хэш через разные строки. Следовательно, хешкод двух строковых объектов одинаково, что не означает, что две строки одинаковы.
Hashcode того же строкового объекта должен быть одинаковым, но хэшкод одинаково, не обязательно тот же объект
4.StartSwith
Boolean Startswith (String Prefix, Int Toffset) public boolean startswith (string prefix, int toffset) {char ta [] = value; int to = toffset; char pa [] = prefix.value; int po = 0; int pc = prefix.value.length; // Примечание: Toffset может быть близок к -1 >>> 1. // Если стартовый адрес меньше 0 или (начальный адрес + длина сравниваемого объекта) больше, чем длина собственного объекта, верните false if ((toffset <0) || (toffset> value.length - pc)) {return false; } // Сравнение с конца объекта, сравниваемого, в то время как (--pc> = 0) {if (ta [to ++]! = Pa [po ++]) {return false; }} return true;} public boolean startswith (string prefix) {return startSwith (prefix, 0);} public boolean endswith (string suffix) {return startSwith (суффикс, value.length - суффикс. value.length);} String D = "www.58fxp.com"; System.out.println (D.StartSwith ("www")); // true System.out.println (D.endswith ("com")); // истинныйНачальное и окончательное сравнение являются общими методами. Например, при оценке того, является ли строка из протокола HTTP, или первоначально оценивая, является ли файл файлом MP3, вы можете использовать этот метод для сравнения.
5. Конкат
String concat (string str) public String concat (string str) {int dotherlen = str.length (); // Если добавленная строка пуста, верните сам объект, если (otherlen == 0) {вернуть это; } int len = value.length; char buf [] = arrays.copyof (value, len + dotherlen); str.getchars (Buf, Len); вернуть новую строку (buf, true);} String Cat = "много"; String newCat = cat.concat ("yes"); // много даМетод CONCAT также является одним из часто используемых методов. Сначала он определяет, пуста ли добавленная строка, чтобы решить, создать ли новый объект.
1 Если длина сплайсированного символа составляет 0, верните непосредственно к исходному объекту символа
2 Сплайсированные символы не пусты и возвращают новый объект символов
Определите длину символа для создания нового объекта
6. Поместите
Заменить строку (char oldchar, char newchar) public String заменить (char oldchar, char newchar) {// сравнить старые и новые значения первым if (oldchar! = Newchar) {int len = value.length; int i = -1; char [] val = value; / * Избегайте getfield opcode */ // Найти позицию, в которой сначала появляется старое значение, пока (++ i <len) {if (val [i] == oldchar) {break; }} // из этой позиции, до конца, замените старое значение, которое появляется с новым значением, если (i <len) {char buf [] = new char [len]; for (int j = 0; j <i; j ++) {buf [j] = val [j]; } while (i <len) {char c = val [i]; buf [i] = (c == Oldchar)? Newchar: C; i ++; } вернуть новую строку (buf, true); }} вернуть это;} String r1 = "Как дела"; String r2 = r1.replace ("do", "is"); system.out.println (r2); // как тыЭтот метод также имеет некоторую умность, например, выяснить, где появляется старое значение в начале, что экономит некоторое время сравнения.
Метод замены (String Oldstr, String Newstr) оценивается по регулярным выражениям.
7.trim
String trim () public String Trim () {int len = value.length; int st = 0; char [] val = value; / * Избегайте кода Getfield Opcode */ // Найдите положение без пробелов перед строкой, When while ((ST <len) && (val [ST] <= '')) {st ++; } // Найти позицию без пробелов в конце строки while ((ST <len) && (val [len-1] <= '')) {len--; } // Если нет пробелов спереди и после, верните саму строку ((st> 0) || (len <value.length))? Substring (St, Len): this;} Строка t1 = "public void"; // одно пространство впереди и после System.out.println ("T1:"+t1.length ()); // 13 с строкой длины пространства t2 = t1.trim (); System.out.println ("t2:"+t2.length ()); // 11 Удалить пространственную систему.out.println (t2);8. Винтер
String intern () public Native String intern ();
String dd = new String ("bb"). Negn ();Метод NENTER является собственным вызовом, и его функция состоит в том, чтобы найти объекты равного значения с помощью метода Equals в постоянном пуле в области метода.
Если не найдено, откройте пространство в постоянном бассейне, чтобы сохранить строку и вернуть ссылку на соответствующую строку. В противном случае, непосредственно вернуть ссылку на объект строки, уже существует в постоянном пуле.
Вы также можете заставить объект символа, созданный для нового метода, чтобы увидеть, существует ли постоянный пул.
Поместите второй код во введение
// string a = new String ("ab1"); // Изменить на строку a = new String ("ab1"). Negan ();Результат правда, потому что адрес, на который указывает A A, поступает из постоянного пула, а константа строки, на которую B, B, по умолчанию будет вызовет этот метод, так что A и B оба указывают на одно и то же адресное пространство.
int hash32 () private transiet int hash32 = 0; int hash32 () {int h = hash32; if (0 == h) {// безвредная раса данных на Hash32 здесь. h = sun.misc.hashing.murmur3_32 (hashing_seed, value, 0, value.length); // Убедитесь, что результат не равен нулю, чтобы избежать повторного возврата h = (0! = H)? H: 1; hash32 = h; } return h;}В JDK1.7, когда класс строки используется в качестве ключа, класс сбора, связанный с хеш, больше не использует метод хэшкода для дискретных данных, но использует метод HASH32.
В этом методе используется текущее время системы, адрес класса строк, адрес системы системного класса и т. Д. В качестве факторов для расчета семян хэш. Через семена хэша 32-разрядное значение int получают через семена хэша.
public int length() { return value.length;}public String toString() { return this;}public boolean isEmpty() { return value.length == 0;}public char charAt(int index) { if ((index < 0) || (index >= value.length)) { throw new StringIndexOutOfBoundsException(index); } возвращаемое значение [index];}Вышеуказанное - некоторые простые общие методы.
Суммировать
Строковые объекты являются неизменными типами. Строковые методы с возвращаемой строкой типа возвращаются каждый раз, когда возвращается новый строковый объект, за исключением определенных конкретных условий некоторых методов для возвращения.
Три способа сравнения строковых объектов:
== Сравнение памяти: непосредственно сравните значения памяти, на которые указывают две ссылки, которые являются точными, краткими и простыми.
Равенное сравнение значений строки: сравните, равны ли буквальные значения двух ссылочных объектов.
Сравнение численности строки HashCode: численность строк. Два ссылки на хешкоды одинаковы, и память не гарантированно будет такой же, и буквальные значения не гарантируются одинаковыми.
Дизайн идеи постоянного пула струны
1. Оригинальное намерение конструктивного дизайна пула строки
Каждая строка является строковым объектом, а строки будут часто использованы в разработке системы. При создании и уничтожении, как и другие объекты, это значительно повлияет на производительность программы.
Чтобы повысить производительность и уменьшить накладные расходы на память, JVM оптимизирует при создании строк.
Пул String Constant открывается для струн, аналогично области кеша
При создании константы строки сначала определите, существует ли пул строки постоянной.
Строка возвращает ссылочный экземпляр, не существует, создает строку и поместите ее в бассейн.
Осознавать основы
Основа для реализации этой оптимизации заключается в том, что каждая константа строки является окончательной модифицированной постоянной, поэтому нет необходимости беспокоиться о конфликтах данных в постоянном пуле.
В бассейне Global String Constrate, созданная экземпляром времени выполнения, есть таблица, которая всегда поддерживает ссылку для каждого уникального строкового объекта в бассейне, что означает, что они всегда ссылаются на объекты в бассейне String Constant, поэтому эти строки в постоянном пуле не будут собираться коллектором мусора.
Куча, стек, область метода
Понимание постоянных бассейнов строк, сначала посмотрите на область метода стека
куча
Что хранится, является объектом, каждый объект содержит соответствующий класс
JVM имеет только одну область кучи и разделяется всеми потоками. В куче нет основных типов и ссылок на объекты, но только сам объект
Объекты собираются коллекционером мусора, поэтому размер и жизненный цикл не должны быть определены
Куча
Каждый поток содержит область стека, в которой хранятся только основные объекты типа данных и пользовательские ссылки на объекты.
Данные (примитивный тип и ссылка на объект) в каждом стеке
Стек разделен на три части: область переменной базового типа, контекст среды выполнения и область инструкции по эксплуатации (инструкции по хранению операций)
Размер данных и жизненный цикл определенно, и когда нет ссылки на эти данные, данные исчезнут.
Метод зона
Статические зоны, такие как кучи, разделяются всеми нитями
Область метода содержит элементы, которые всегда уникальны во всей программе, такие как классовые и статические переменные;
Постоянный бассейн
Постоянный пул строки существует в области метода
Код: стек -метод хранит строки
String str1 = "abc"; string str2 = "abc"; string str3 = "abc"; string str4 = new String ("abc"); string str5 = new String ("abc");Вопросы интервью
String str4 = new String ("ABC") Сколько объектов создано?
Split: str4 =, new String (), "ABC"
Вы можете создать новый объект с помощью нового метода. Новый метод создает созданный объект и не пойдет в постоянный пул, чтобы обнаружить, существует ли он. До тех пор, пока новый, новый объект будет создан.
"ABC" Каждая строка - это строковый объект. Если в постоянном бассейне нет, будет создан новый объект и поставлен в постоянный бассейн. В противном случае ссылка на объект будет возвращена.
Назначить адрес объекта STR4 и создать ссылку
Итак, если в постоянном пуле нет буквального «ABC», создайте два объекта, в противном случае создайте один объект и создайте ссылку
String str1 = new String ("a"+"b"); Сколько объектов будет создано? String str2 = new String ("ABC") + "ABC"; Сколько объектов будет создано?
Вышеупомянутый всесторонний анализ исходного кода Java String и Pustrest Poull - это все контент, которым я делюсь с вами. Я надеюсь, что вы можете дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.