Есть плюсы. Раз String неизменен, то хэшкод экземпляра класса String кэшируется, его не нужно каждый раз вычислять заново, поэтому в качестве ключа в HashMap использование String дает хорошую производительность. Еще для string перегружен оператор + , отсюда простая конкатенация.
кто - нибудь может сказать почему первоначальная строка изменяется, хотя не должна??? public class Main { public static void main(String[] args) { String s1 = new String("abc");//String s1 = "abc"; s1 += "def"; System.out.println(s1);//вывод abcdef s1 += new String("ghi");//s1 += "ghi"; System.out.println(s1);//вывод abcdefghi } }
В java операторы + или += являются перегруженными ( ведь строки не числа). В данном случае оператор += не использует метод concat. Как я понимаю, данный код выполняется примерно вот так: public class Main { public static void main(String[] args) { String s1 = new String("abc"); s1 = new StringBuilder().append(s1).append(new String("def")).toString(); System.out.println(s1); // вывод abcdef s1 =new StringBuilder().append(s1).append(new String("ghi")).toString(); System.out.println(s1);// вывод abcdefghi } } То есть используя + или += по отношениям к строкам по сути используется StringBuilder или StringBuffer. Если я ошибаюсь - поправьте меня.
s1 += "def"; //стринг позволяет слаживать стринги между собой. У тебя есть s1 со значением . И ты говоришь: s1 = s1(abc) + . Получается abcdef. Теперь s1 это . Далее ты таким же образом слаживаешь + ghi. Что здесь может быть неясного?
На самом деле, когда ты делаешь > , то ты берёшь два объекта STRING со значениями "abc" и "def", и получаешь новый объект "abcdef", и ссылку на него (новый объект) ты ложишь в переменную s1. Таким образом, до этого переменная s1 указывала на строку "abc", а после - на строку "abcdef". А объекты (строки) "abc" и "def" будут уничтожены сборщиком мусора, так как на них никто не ссылается. Кстати, переменная s1 - это указатель. В Java все переменные делятся на две группы: примитивы и указатели. Укзатели бывают только на экземпляры объектов (или на null), других указателей в Java не бывает. То есть, фактически в Java "сложение" строк порождает новый объект, а существующие объекты типа String не меняются никогда, до самого конца своего существования. Если не понятно, тогда изучи что такое указатели (можно взять Си или Паскаль, а лучше Ассемблер), а потом попробуй снова понять. Думаю, вопросов не останется.
Не знаю, что касается памяти, но по времени результат получился такой // Вывод: // //Проверка >> Длинна а = 1000 //Метод a.concat >> время выполнения 1 398 751 наносекунд // //Проверка >> Длинна а = 1000 //Метод a = a + b >> время выполнения 48 299 503 наносекунд // //Проверка >> Длинна а = 1000 //Метод StringBuilder >> время выполнения 2 069 626 наносекунд // //Проверка >> Длинна а = 1000 //Метод StringBuffer >> время выполнения 3 559 796 наносекунд public class Main { public static void main(String[] args) { System.out.println("Метод a.concat >> время выполнения " + String.format("%,12d", test("a.concat")) + " наносекунд"); System.out.println("Метод a = a + b >> время выполнения " + String.format("%,12d", test("a = a + b")) + " наносекунд"); System.out.println("Метод StringBuilder >> время выполнения " + String.format("%,12d", test("StringBuilder")) + " наносекунд"); System.out.println("Метод StringBuffer >> время выполнения " + String.format("%,12d", test("StringBuffer")) + " наносекунд"); } public static long test(String method) { long start, stop; start = System.nanoTime(); String a = ""; String b = "1"; switch (method) { case "a.concat": for (int i = 0; i < 1000; i++) { a = a.concat(b); } break; case "a = a + b": for (int i = 0; i < 1000; i++) { a = a + b; } break; case "StringBuilder": for (int i = 0; i < 1000; i++) { StringBuilder a1 = new StringBuilder(a); a1.append(b); a = a1.toString(); } break; case "StringBuffer": for (int i = 0; i < 1000; i++) { StringBuffer a2 = new StringBuffer(a); a2.append(b); a = a2.toString(); } break; } stop = System.nanoTime(); System.out.println(" Проверка >> Длинна а = " + a.length()); return stop - start; } }
Очень мелкий шрифт. Для обучающих видосов - так не годится. В разрешении менее 1080p вообще всё плывёт, а на 1080p всё-равно сложно, так как мелко. Глаза устают всматриваться.
Спасибо. Отлично объяснил. В книге читая не разобрался с StringBulder.
Спс
Ставим на 1.5 или 1.75 скорость. Замечательно)
Thanks,it really helps me.
X2 лучше
Всегда так делаю)
красава!
А зачем тогда вообще нужны String строки? Или у них есть преимущества по сравнению с StringBuilder строками?
Есть плюсы. Раз String неизменен, то хэшкод экземпляра класса String кэшируется, его не нужно каждый раз вычислять заново, поэтому в качестве ключа в HashMap использование String дает хорошую производительность. Еще для string перегружен оператор + , отсюда простая конкатенация.
кто - нибудь может сказать почему первоначальная строка изменяется, хотя не должна???
public class Main {
public static void main(String[] args) {
String s1 = new String("abc");//String s1 = "abc";
s1 += "def";
System.out.println(s1);//вывод abcdef
s1 += new String("ghi");//s1 += "ghi";
System.out.println(s1);//вывод abcdefghi
}
}
В java операторы + или += являются перегруженными ( ведь строки не числа). В данном случае оператор += не использует метод concat. Как я понимаю, данный код выполняется примерно вот так:
public class Main {
public static void main(String[] args) {
String s1 = new String("abc");
s1 = new StringBuilder().append(s1).append(new String("def")).toString();
System.out.println(s1); // вывод abcdef
s1 =new StringBuilder().append(s1).append(new String("ghi")).toString();
System.out.println(s1);// вывод abcdefghi
}
}
То есть используя + или += по отношениям к строкам по сути используется StringBuilder или StringBuffer.
Если я ошибаюсь - поправьте меня.
s1 += "def"; //стринг позволяет слаживать стринги между собой. У тебя есть s1 со значением . И ты говоришь: s1 = s1(abc) + . Получается abcdef. Теперь s1 это . Далее ты таким же образом слаживаешь + ghi. Что здесь может быть неясного?
@@ТарасМылов-з8б "слаживать" - это от слова "лажа" ? )))
На самом деле, когда ты делаешь > , то ты берёшь два объекта STRING со значениями "abc" и "def", и получаешь новый объект "abcdef", и ссылку на него (новый объект) ты ложишь в переменную s1. Таким образом, до этого переменная s1 указывала на строку "abc", а после - на строку "abcdef". А объекты (строки) "abc" и "def" будут уничтожены сборщиком мусора, так как на них никто не ссылается. Кстати, переменная s1 - это указатель. В Java все переменные делятся на две группы: примитивы и указатели. Укзатели бывают только на экземпляры объектов (или на null), других указателей в Java не бывает. То есть, фактически в Java "сложение" строк порождает новый объект, а существующие объекты типа String не меняются никогда, до самого конца своего существования. Если не понятно, тогда изучи что такое указатели (можно взять Си или Паскаль, а лучше Ассемблер), а потом попробуй снова понять. Думаю, вопросов не останется.
Не знаю, что касается памяти, но по времени результат получился такой
// Вывод:
//
//Проверка >> Длинна а = 1000
//Метод a.concat >> время выполнения 1 398 751 наносекунд
//
//Проверка >> Длинна а = 1000
//Метод a = a + b >> время выполнения 48 299 503 наносекунд
//
//Проверка >> Длинна а = 1000
//Метод StringBuilder >> время выполнения 2 069 626 наносекунд
//
//Проверка >> Длинна а = 1000
//Метод StringBuffer >> время выполнения 3 559 796 наносекунд
public class Main {
public static void main(String[] args) {
System.out.println("Метод a.concat >> время выполнения " + String.format("%,12d", test("a.concat")) + " наносекунд");
System.out.println("Метод a = a + b >> время выполнения " + String.format("%,12d", test("a = a + b")) + " наносекунд");
System.out.println("Метод StringBuilder >> время выполнения " + String.format("%,12d", test("StringBuilder")) + " наносекунд");
System.out.println("Метод StringBuffer >> время выполнения " + String.format("%,12d", test("StringBuffer")) + " наносекунд");
}
public static long test(String method) {
long start, stop;
start = System.nanoTime();
String a = "";
String b = "1";
switch (method) {
case "a.concat":
for (int i = 0; i < 1000; i++) {
a = a.concat(b);
}
break;
case "a = a + b":
for (int i = 0; i < 1000; i++) {
a = a + b;
}
break;
case "StringBuilder":
for (int i = 0; i < 1000; i++) {
StringBuilder a1 = new StringBuilder(a);
a1.append(b);
a = a1.toString();
}
break;
case "StringBuffer":
for (int i = 0; i < 1000; i++) {
StringBuffer a2 = new StringBuffer(a);
a2.append(b);
a = a2.toString();
}
break;
}
stop = System.nanoTime();
System.out.println("
Проверка >> Длинна а = " + a.length());
return stop - start;
}
}
Очень мелкий шрифт. Для обучающих видосов - так не годится. В разрешении менее 1080p вообще всё плывёт, а на 1080p всё-равно сложно, так как мелко. Глаза устают всматриваться.
Очень плохо объясняет ,много слов паразитов ,не советую его смотреть автор посмотрим Виндертона может научишьчя чему нибудь