Почему думаешь, что есть лучший способ? И не называй меня Ширли. :)
Судно на воздушной подушке с угрями
Потому что я всегда ассоциирую создание новых переменных, таких как приведенные выше, чтобы иметь небольшие накладные расходы во время выполнения. Например, если я поместил приведенную выше строку для преобразования массива char в строку, например, в цикл for, для меня это выглядит не совсем правильно. И да, я немного перфекционист. , ,
Чуцу
1
Если у вас много таких парней, скажем, массив или коллекция char [], то, возможно, вы бы добавили массивы char в StringBuffer, но для String здесь или там то, что вы опубликовали, - это то, что чаще всего используется.
Судно на воздушной подушке с угрями
Если вы ищете способ избежать копирования символа [], то его нет. В противном случае вы можете нарушить неизменность String.
Пол Кейджер
13
«создание новых переменных» влечет за собой ноль издержек. Переменная - это имя, используемое для ссылки на значение, а само имя не присутствует нигде в памяти во время выполнения (по крайней мере, не в таком языке, как Java, где отражение довольно ограничено). «Накладные расходы» возникают из-за создания нового значения , и в вашем случае не существует способа обойти это, учитывая, что ваша проблема заключается в «создании этого значения». Вы не можете заставить массив символов волшебным образом трансмогрифицировать в String. Вы можете организовать сборку исходного массива char после создания String.
Карл Кнехтель
Ответы:
212
Нет, это решение абсолютно правильное и очень минимальное.
Обратите внимание, что это очень необычная ситуация: потому Stringчто обрабатывается специально в Java, даже "foo"на самом деле String. Таким образом, charв обычном коде нет необходимости разбивать строку на отдельные элементы и объединять их обратно.
Сравните это с C / C ++, где у "foo"вас есть пакет chars, оканчивающийся нулевым байтом на одной стороне и stringна другой стороне, и многие преобразования между ними должны быть унаследованы.
Оба метода вызывают String(char[])или вариант того. И часть копирования сделана внутри String(char[]). Это не оставляет никакой выгоды для прямого вызова, кроме симметрии с другими valueOfметодами.
AH
1
статика и многое другое ООП это противоречие терминов. Все, что объявлено статическим , не является частью объекта или его поведения и, следовательно, не является объектно-ориентированным. Кроме того, если существует вероятность того, что реализация Stringбудет изменена и / или улучшена несовместимым способом или во время выполнения можно будет выбрать несколько конкурирующих реализаций, тогда имеет смысл использовать статический метод фабрики. Этого не случится с такими низкоуровневыми вещами, как String. Поэтому моя предпосылка такова: используйте самый маленький подходящий молоток, а не самый большой из доступных.
AH
@ А, я не знаю об этом. String уступил StringBuffer, который уступил StringBuilder. Бьюсь об заклад, сторонники StringBuffer сказали то же самое тогда, и теперь придется рефакторинг кода для использования StringBuilder.
CorsiKa
1
@AH Тот факт, что им пришлось создать CharSequenceинтерфейс, показывает, насколько ошибочна ваша «не будет происходить с низкоуровневыми вещами, такими как строка» - они не меняют то, что происходит в строке, потому что они привязали себя к этому на раннем этапе, и теперь они хотят они бы не имели.
CorsiKa
1
@corsiKa Я не говорил, что String API - это все хорошо и хорошо. Только то, что он не изменится несовместимым образом и что сам класс и его конструкторы никуда не денутся. :-)
В заключение : обратите внимание Arrays.toString(c), потому что вы получите "[w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v]"вместо "wwwwww3333dfevvv".
package naresh.java;publicclassTestDoubleString{publicstaticvoid main(String args[]){String str="abbcccddef";char charArray[]=str.toCharArray();int len=charArray.length;for(int i=0;i<len;i++){//if i th one and i+1 th character are same then update the charArraytry{if(charArray[i]==charArray[i+1]){
charArray[i]='0';}}catch(Exception e){System.out.println("Exception");}}//finally printing final character stringfor(int k=0;k<charArray.length;k++){if(charArray[k]!='0'){System.out.println(charArray[k]);}}}}
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и / или как этот код отвечает на вопрос, повышает его долгосрочную ценность.
Байхо
1
//Given Character Array char[] a ={'h','e','l','l','o',' ','w','o','r','l','d'};//Converting Character Array to String using String funtion System.out.println(String.valueOf(a));//OUTPUT : hello world
Преобразование любого данного типа массива в строку с использованием функции потока Java 8
это неправильно, так как предполагает, что toStringработает правильно char[]. Это может работать на некоторых конкретных поставщиков и версий JVM.
fommil
3
Поскольку класс String является неизменяемым, это приведет к выполнению двух операций: вызову toString () aи созданию другого объекта String, который объединяется с a.toString()и""
Ответы:
Нет, это решение абсолютно правильное и очень минимальное.
Обратите внимание, что это очень необычная ситуация: потому
String
что обрабатывается специально в Java, даже"foo"
на самом делеString
. Таким образом,char
в обычном коде нет необходимости разбивать строку на отдельные элементы и объединять их обратно.Сравните это с C / C ++, где у
"foo"
вас есть пакетchar
s, оканчивающийся нулевым байтом на одной стороне иstring
на другой стороне, и многие преобразования между ними должны быть унаследованы.источник
String text = String.copyValueOf(data);
или
String text = String.valueOf(data);
возможно лучше (инкапсулирует
new String
вызов).источник
String(char[])
или вариант того. И часть копирования сделана внутриString(char[])
. Это не оставляет никакой выгоды для прямого вызова, кроме симметрии с другимиvalueOf
методами.String
будет изменена и / или улучшена несовместимым способом или во время выполнения можно будет выбрать несколько конкурирующих реализаций, тогда имеет смысл использовать статический метод фабрики. Этого не случится с такими низкоуровневыми вещами, какString
. Поэтому моя предпосылка такова: используйте самый маленький подходящий молоток, а не самый большой из доступных.CharSequence
интерфейс, показывает, насколько ошибочна ваша «не будет происходить с низкоуровневыми вещами, такими как строка» - они не меняют то, что происходит в строке, потому что они привязали себя к этому на раннем этапе, и теперь они хотят они бы не имели.Это преобразует массив символов обратно в строку:
источник
Теперь преобразовать массив символов в строку можно двумя способами.
Возвращает строку
[w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v]
.А также:
Возвращает строку
wwwwww3333dfevvv
.В заключение : обратите внимание
Arrays.toString(c)
, потому что вы получите"[w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v]"
вместо"wwwwww3333dfevvv"
.источник
Строка в Java это просто объект вокруг массива символов. Отсюда
идентична распакованной строке с теми же символами. Создавая новую строку из вашего массива символов
по сути, вы говорите компилятору автоматически блокировать объект String вокруг вашего массива символов.
источник
Ты можешь использовать
String.valueOf
метод.Например,
Подробнее о массиве символов в строке вы можете ссылаться на ссылки ниже
https://docs.oracle.com/javase/7/docs/api/java/lang/String.html
https://www.flowerbrackets.com/convert-char-array-to-string-java/
источник
источник
Преобразование любого данного типа массива в строку с использованием функции потока Java 8
источник
Попробуйте использовать
java.util.Arrays
. Этот модуль имеет множество полезных методов, которые могут быть использованы, связанные с массивами.источник
Попробуй это
источник
Просто используйте String.value, как показано ниже;
источник
Попробуй это:
источник
Вы также можете использовать класс StringBuilder
Использование String или StringBuilder зависит от требований вашего метода.
источник
1 альтернативный способ сделать:
источник
toString
работает правильноchar[]
. Это может работать на некоторых конкретных поставщиков и версий JVM.a
и созданию другого объекта String, который объединяется сa.toString()
и""