Видеть, что это объяснение хорошо, поэтому я переверну его
В Java есть 3 класса, которые отвечают за операции персонажа.
1. символ - это одна операция символа.
2. Стрирование работает на строке символов, неизменного класса.
3.StringBuffer также является операцией на строке символов и является изменчивым классом.
Нить:
Это объект, а не примитивный тип.
Это неизменное объект, и как только он создается, его значение не может быть изменено.
Модификация существующих строковых объектов заключается в воссоздании нового объекта и сохранении нового значения в нем.
Строка - это последний класс, то есть ее нельзя унаследовать.
StringBuffer:
Это измененный объект.
Он может быть создан только конструкторами,
StringBuffer sb = new StringBuffer ();
Примечание. Он не может быть оплачен символами назначения.
SB = "Добро пожаловать здесь!"; // Ошибка
После создания объекта пространство памяти будет выделено в памяти, а NULL будет изначально сохранено.
SB.Append ("Hello");
Эффективность StringBuffer выше, чем у строки в конкатенации строки:
String str = new String ("Добро пожаловать в");
str += "здесь";
Шаг обработки на самом деле - создание StringBuffer, затем вызов Append () и, наконец,
Затем добавьте stringbuffer tosting ();
Таким образом, операция подключения строкового соединения будет иметь некоторые дополнительные операции, чем StringBuffer, и, конечно, эффективность будет снижена.
А поскольку объект String является неизменным объектом, каждая операция STING будет воссоздать новый объект для сохранения нового значения.
Таким образом, оригинальный объект будет бесполезным и будет собранным мусором.
Посмотрите на следующий код:
Повторите 26 английских букв 5000 раз.
Кода -копия выглядит следующим образом:
String tempstr = "abcdefghijklmnopqrstuvwxyz";
int times = 5000;
long lStart1 = System.currentTimeMiLlis ();
String str = "";
для (int i = 0; i <times; i ++) {
str += tempstr;
}
Long Lend1 = System.CurrentTimeMiLlis ();
давно = (Lend1 - LSTART1);
System.out.println (время);
К сожалению, мой компьютер не является суперкомпьютером, и результаты, которые я получаю, не обязательно одинаковы каждый раз, обычно около 46687.
Это 46 секунд.
Давайте посмотрим на следующий код
Кода -копия выглядит следующим образом:
String tempstr = "abcdefghijklmnopqrstuvwxyz";
int times = 5000;
long lStart2 = System.CurrentTimeMiLlis ();
StringBuffer sb = new StringBuffer ();
для (int i = 0; i <times; i ++) {
SB.Append (Tempstr);
}
Long Lend2 = System.currentTimeMillis ();
долгое время2 = (lend2 - lStart2);
System.out.println (Time2);
Результат 16, а иногда 0
Таким образом, вывод очевиден, скорость StringBuffer почти десятки тысяч раз больше, чем в строке. Конечно, эти данные не очень точны. Поскольку количество циклов составляет 100 000 раз, разница еще больше. Если вы мне не верите, попробуйте
Если вы все еще не можете понять:
1) Разница между методом строки соединения и методом приложения StringBuff:
Когда оператор String + выполняет операцию строки, он сначала преодолевает текущий объект строки в тип StringBuff, вызывает метод приложения и, наконец, преобразует генерируемый объект StringBuff в строку типа строки с помощью метода ToString, поэтому он неэффективен.
Однако с точки зрения читаемости оператор строки подключения все еще высока.
2) stringbuff-это безопасность.
Строка небезопасна для потоков
3) Строка - это строковый объект, который не может быть изменен, в то время как StringBuff изменяется.
Кода -копия выглядит следующим образом:
Public Static Boolean Filecopy (String Srcstr, String deststr) {
File srcfile = null;
File destfile = null;
Reader Reader = null;
Писатель -писатель = null;
логический флаг = false;
пытаться {
srcfile = new File (srcstr);
if (! srcfile.exists ()) {
System.out.println («Исходной файл не существует»);
System.Exit (0);
} еще {
reader = new FileReader (srcfile);
}
destfile = новый файл (deststr);
writer = new FileWriter (destfile);
char [] buff = new char [1024];
int len;
String str = "";
StringBuffer sbuff = new StringBuffer ();
while ((len = reader.read (buff))! = -1) {
// str += new String (Buff, 0, Len);
sbuff.append (новая строка (Buff, 0, len));
}
// writer.write (str.tochararray ());
writer.write (sbuff.toString (). toCharraray ());
flag = true;
writer.flush ();
reader.close ();
writer.close ();
} catch (ioException e) {
System.out.println ("Файл копировать исключение: =" + e.getmessage ());
}
вернуть флаг;
}