Nano Hash - криптовалюты, майнинг, программирование

Когда в Java лучше использовать String вместо StringBuilder, наоборот?

Я знаю, что StringBuilder должен быть предпочтительнее String, потому что String будет храниться в постоянном пуле строк, и присвоение ему нового значения не отменяет предыдущие значения. Однако StringBuilder - это объект, который переопределяет свое предыдущее значение.

  • В каких случаях лучше использовать String вместо StringBuilder и наоборот.
  • Также, если у меня есть переменные типа String в поддерживающих классах Hibernate, следует ли мне использовать StringBuilder? Как?

    ...
    Result result = (Result) criteria.list().get(0);
    
    
    class Result{
       String name;
       String fname;
       ...
    }
    

  • Только несколько строк (буквальные строки, константные выражения со строковыми значениями и строки, которые вы вызываете intern()) будут храниться в пуле. Почему ты хочешь сказать, что это плохо? Что вы имеете в виду, отменяя предыдущее значение? Присвоение переменной String делает то же самое, что присвоение переменной StringBuilder. Вы говорите о изменчивости или неизменности? Вы уверены, когда лучше выбрать StringBuilder? 25.06.2015
  • @xehpuk, как я знаю, когда вы назначаете новое значение String, он удаляет ссылку на свое предыдущее значение и добавляет ссылку на новое, поэтому предыдущее значение остается в памяти, ожидая GC. В то время как StringBuilder заменяет новое значение предыдущим. Я не уверен, и поэтому в первый пункт я включил (Vice vesa) 26.06.2015

Ответы:


1

Вам следует использовать String, потому что String объекты кэшируются в пуле объектов и могут обеспечивают лучшую производительность, если вы их не меняете.

StringBuilder полезно только тогда, когда вы продолжаете объединять String токенов, чего не должно быть в хорошо нормализованной таблице базы данных.

JVM выполняет всевозможные оптимизации, и есть вероятность, что даже если вы используете конкатенацию, JVM может переписать эту процедуру до версии StringBuilder.

30.06.2015
  • Также обратите внимание, что во многих случаях объединения можно и нужно избегать, не прибегая к посредничеству StringBuilder. Случай 1 - jdbc - использование связываемых переменных вместо конкатенации строк; случай 2 - System.out - несколько вызовов print или println или цепочка System.out, как в System.out.append("Hello ").append(name); 01.07.2015

  • 2

    Простое практическое правило (String - это тип, представляющий символьные строки. StringBuilder - поток изменяемых символов)

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

      String str1 = "Test";
      String str2 = "Test";
    

    Здесь str1 == str2 (та же ссылка)

    Кроме того, оператор + перегружен в String для создания String из разных типов. Это можно использовать при построении небольших строк (внутренне это делается с использованием StringBuilder, поэтому не беспокойтесь), но не во время цикла.

    Используйте StringBuilder (или старый аналог StringBuffer) только тогда, когда вы создаете целевую строку с использованием небольших фрагментов разных типов - и особенно внутри цикла - это поможет вам избежать размещения ненужных фрагментов строки в пуле строк. .

       StringBuilder s1 = new StringBuilder("test");
       StringBuilder s2 = new StringBuilder("test");
    

    Здесь s1! = S2

    Кроме того, я не думаю, что есть какой-то способ манипулировать кодировкой StringBuilder / Buffer - Между тем String позволяет это.

    Изменить: представление сущностей Hibernate: всегда используйте String для представления текстового типа в вашем классе. По причинам, указанным выше. Это должно прийти к вам, как мышечная память. Например, int, float, char и т. Д. Для примитивных типов и String для текстового типа. Используйте построитель только для построения строк, а не для представления типа, если это не является каким-то странным требованием.

    24.06.2015
  • См. Сообщения типа stackoverflow.com/questions/88838/ 25.06.2015

  • 3

    Я бы использовал String для фиксированных текстовых значений.

    Используйте StringBuilder, когда вы создаете текстовую строку большего размера, например:

    final StringBuilder sb = new StringBuilder();
    for(;;){
        sb.append("more text\n");//add text, StringBuilder's size will increase incrementally
        if(this.stop()){
             break;//stop loop
        }
    }
    final String result = sb.toString();// Create the final result to work with
    System.out.println(result);//print result
    

    Используйте StringBuffer вместо StringBuilder для синхронизированных значений, см. https://stackoverflow.com/a/355092/928952, чтобы узнать разницу между StringBuilder и StringBuffer.

    JavaDoc: StringBuffer (http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuffer.html):

    Поточно-ориентированная изменяемая последовательность символов. Строковый буфер похож на String, но может быть изменен. В любой момент времени он содержит определенную последовательность символов, но длину и содержание последовательности можно изменить с помощью определенных вызовов методов.

    JavaDoc: StringBuilder (http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html):

    Изменяемая последовательность символов. Этот класс предоставляет API, совместимый с StringBuffer, но без гарантии синхронизации. Этот класс разработан для использования в качестве замены StringBuffer в тех местах, где строковый буфер использовался одним потоком (как это обычно бывает). По возможности рекомендуется использовать этот класс вместо StringBuffer, поскольку он будет быстрее в большинстве реализаций.

    JavaDoc: String (http://docs.oracle.com/javase/7/docs/api/java/lang/String.html):

    Класс String представляет символьные строки. Все строковые литералы в программах Java, такие как «abc», реализованы как экземпляры этого класса. Строки постоянны; их значения не могут быть изменены после создания. Строковые буферы поддерживают изменяемые строки. Поскольку объекты String неизменяемы, они могут использоваться совместно

    В основном вы будете использовать String для констант (неизменяемых) текста.

    24.06.2015
  • В таком случае означает ли это, что мой код гибернации верен? 24.06.2015
  • Я не вижу ошибки ... Но это не значит, что ошибка не где-то еще. 24.06.2015
  • Я не голосовал против, но я бы избегал использования StringBuilder. Чтобы сделать вещи поточно-ориентированными, необходимо тщательно продумать реализацию, а не слепо отказываться от поточно-ориентированных реализаций для всех ваших API. Во многих случаях, даже в многопоточном контексте, не всегда нужно защищать все части вашего кода. Поточно-ориентированные реализации, такие как StringBuilder, и некоторые реализации Collection добавляют много накладных расходов на синхронизацию. 01.07.2015
  • Я бы не стал использовать построение строк для разных потоков, это слишком чревато ошибками. Также я не могу придумать причину, по которой это было бы необходимо - но, возможно, другие 01.07.2015

  • 4

    Классы java.lang.StringBuilder следует использовать, когда вам нужно внести много изменений в строки символов. Как мы знаем, объекты String неизменяемы, поэтому, если вы решите выполнять много манипуляций с объектами String, вы в конечном итоге получите с большим количеством заброшенных объектов String в пуле String. (Даже в наши дни гигабайт ОЗУ не рекомендуется тратить драгоценную память на отброшенные объекты пула строк.) С другой стороны, объекты типа StringBuilder можно изменять снова и снова, не оставляя после себя большого количества отброшенных объектов. Строковые объекты.

    String x = "abc";
    x.concat("def");
    System.out.println("x = " + x); // output is "x = abc"
    
    
    StringBuffer sb = new StringBuffer("abc");
    sb.append("def");
    System.out.println("sb = " + sb); // output is "sb = abcdef"
    
    24.06.2015
  • При манипулировании строками объекты не остаются в пуле строк. Существует пул уникальных строк, но строки попадают туда только в том случае, если вы их intern() или если они получены из строкового литерала в вашем исходном коде. И печать StringBuffer first преобразует его в String, так что это не помогает. 25.06.2015

  • 5

    Строка - это неизменяемый объект, однажды созданный не может быть изменен. Объект, созданный как строка, хранится в пуле константных строк. Каждый неизменяемый объект в Java является потокобезопасным, что означает, что String также является потокобезопасным. Строка не может использоваться двумя потоками одновременно. Однажды назначенная строка не может быть изменена.

    String  demo = "Test1" ;
    

    Вышеупомянутый объект хранится в пуле константных строк, и его значение не может быть изменено.

    demo="Test2" ;
    

    новая строка "Test2" создается в пуле констант, на которую ссылается демонстрационная переменная

    Объекты StringBuilder изменяемы, мы можем вносить изменения в значение, хранящееся в объекте. Фактически это означает, что строковые операции, такие как добавление, будут более эффективными, если они будут выполняться с использованием объектов StringBuilder, чем объектов String.

    StringBuilder demo2= new StringBuilder("Test1");
    

    Вышеупомянутый объект тоже хранится в куче, и его значение можно изменить.

    demo2=new StringBuilder("Test1"); 
    

    Вышеупомянутый оператор прав, поскольку он изменяет значение, разрешенное в StringBuilder.

    Таким образом, вы должны использовать stringBuilder там, где вам нужно часто обновлять / изменять строку.

    24.06.2015
  • Объекты, созданные в виде строки, по умолчанию не сохраняются в пуле константных строк. Строки попадают туда только в том случае, если вы intern() их или если они взяты из строкового литерала в вашем исходном коде. new StringBuilder("Test1") также сохранил строку "Test1" в пуле константных строк, потому что "Test1" является строкой, поэтому в этом отношении использование StringBuilder / Buffer не приносит пользы. 25.06.2015
  • да, если строка инициализирована с помощью new, тогда на картинке появляется стажер, а затем он переместится в пул 25.06.2015
  • Нет, Абхиджит, строка, построенная с использованием new, не перемещается в пул. Только вызов intern() или наличие строкового литерала в вашем классе сделает это. 25.06.2015
  • извините за короткий ответ. И да, я согласен с вашим утверждением. Это то, что я пытался здесь упомянуть, это когда строка инициализируется с помощью new, а затем, если вы вызываете intern, она перемещается в пул. Intern - это метод, который добавит строку в пул, если они там не присутствуют ... 25.06.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..