Урок по Java 44: StringBuilder

Поділитися
Вставка
  • Опубліковано 18 гру 2024

КОМЕНТАРІ • 19

  • @superlife5151
    @superlife5151 6 років тому +4

    Спасибо. Отлично объяснил. В книге читая не разобрался с StringBulder.

  • @yarik83men51
    @yarik83men51 3 роки тому +2

    Спс

  • @Sasha192_
    @Sasha192_ 5 років тому +3

    Ставим на 1.5 или 1.75 скорость. Замечательно)

  • @AlexGnuskin
    @AlexGnuskin 3 роки тому +2

    красава!

  • @skt5659
    @skt5659 5 років тому

    А зачем тогда вообще нужны String строки? Или у них есть преимущества по сравнению с StringBuilder строками?

    • @КсенияУшакова-м5р
      @КсенияУшакова-м5р 4 роки тому +3

      Есть плюсы. Раз String неизменен, то хэшкод экземпляра класса String кэшируется, его не нужно каждый раз вычислять заново, поэтому в качестве ключа в HashMap использование String дает хорошую производительность. Еще для string перегружен оператор + , отсюда простая конкатенация.

  • @igorivanov5115
    @igorivanov5115 6 років тому

    кто - нибудь может сказать почему первоначальная строка изменяется, хотя не должна???
    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
    }
    }

    • @SR-rs1gl
      @SR-rs1gl 6 років тому +3

      В 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.
      Если я ошибаюсь - поправьте меня.

    • @ТарасМылов-з8б
      @ТарасМылов-з8б 6 років тому +1

      s1 += "def"; //стринг позволяет слаживать стринги между собой. У тебя есть s1 со значением . И ты говоришь: s1 = s1(abc) + . Получается abcdef. Теперь s1 это . Далее ты таким же образом слаживаешь + ghi. Что здесь может быть неясного?

    • @486OverDrive
      @486OverDrive 9 місяців тому

      @@ТарасМылов-з8б "слаживать" - это от слова "лажа" ? )))

    • @486OverDrive
      @486OverDrive 9 місяців тому

      На самом деле, когда ты делаешь > , то ты берёшь два объекта STRING со значениями "abc" и "def", и получаешь новый объект "abcdef", и ссылку на него (новый объект) ты ложишь в переменную s1. Таким образом, до этого переменная s1 указывала на строку "abc", а после - на строку "abcdef". А объекты (строки) "abc" и "def" будут уничтожены сборщиком мусора, так как на них никто не ссылается. Кстати, переменная s1 - это указатель. В Java все переменные делятся на две группы: примитивы и указатели. Укзатели бывают только на экземпляры объектов (или на null), других указателей в Java не бывает. То есть, фактически в Java "сложение" строк порождает новый объект, а существующие объекты типа String не меняются никогда, до самого конца своего существования. Если не понятно, тогда изучи что такое указатели (можно взять Си или Паскаль, а лучше Ассемблер), а потом попробуй снова понять. Думаю, вопросов не останется.

  • @romankryvolapov
    @romankryvolapov 6 років тому +2

    Не знаю, что касается памяти, но по времени результат получился такой
    // Вывод:
    //
    //Проверка >> Длинна а = 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;
    }
    }

  • @486OverDrive
    @486OverDrive 9 місяців тому

    Очень мелкий шрифт. Для обучающих видосов - так не годится. В разрешении менее 1080p вообще всё плывёт, а на 1080p всё-равно сложно, так как мелко. Глаза устают всматриваться.

  • @djonmamasaliev5175
    @djonmamasaliev5175 6 років тому +1

    Очень плохо объясняет ,много слов паразитов ,не советую его смотреть автор посмотрим Виндертона может научишьчя чему нибудь