Как преобразовать массив символов обратно в строку?


405

У меня есть массив символов:

char[] a = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};

Мое текущее решение состоит в том, чтобы сделать

String b = new String(a);

Но наверняка есть лучший способ сделать это?


151
Почему думаешь, что есть лучший способ? И не называй меня Ширли. :)
Судно на воздушной подушке с угрями

Потому что я всегда ассоциирую создание новых переменных, таких как приведенные выше, чтобы иметь небольшие накладные расходы во время выполнения. Например, если я поместил приведенную выше строку для преобразования массива char в строку, например, в цикл for, для меня это выглядит не совсем правильно. И да, я немного перфекционист. , ,
Чуцу

1
Если у вас много таких парней, скажем, массив или коллекция char [], то, возможно, вы бы добавили массивы char в StringBuffer, но для String здесь или там то, что вы опубликовали, - это то, что чаще всего используется.
Судно на воздушной подушке с угрями

Если вы ищете способ избежать копирования символа [], то его нет. В противном случае вы можете нарушить неизменность String.
Пол Кейджер

13
«создание новых переменных» влечет за собой ноль издержек. Переменная - это имя, используемое для ссылки на значение, а само имя не присутствует нигде в памяти во время выполнения (по крайней мере, не в таком языке, как Java, где отражение довольно ограничено). «Накладные расходы» возникают из-за создания нового значения , и в вашем случае не существует способа обойти это, учитывая, что ваша проблема заключается в «создании этого значения». Вы не можете заставить массив символов волшебным образом трансмогрифицировать в String. Вы можете организовать сборку исходного массива char после создания String.
Карл Кнехтель

Ответы:


212

Нет, это решение абсолютно правильное и очень минимальное.

Обратите внимание, что это очень необычная ситуация: потому Stringчто обрабатывается специально в Java, даже "foo"на самом деле String. Таким образом, charв обычном коде нет необходимости разбивать строку на отдельные элементы и объединять их обратно.

Сравните это с C / C ++, где у "foo"вас есть пакет chars, оканчивающийся нулевым байтом на одной стороне и stringна другой стороне, и многие преобразования между ними должны быть унаследованы.


146

String text = String.copyValueOf(data);

или

String text = String.valueOf(data);

возможно лучше (инкапсулирует new Stringвызов).


6
Оба метода вызывают String(char[])или вариант того. И часть копирования сделана внутри String(char[]). Это не оставляет никакой выгоды для прямого вызова, кроме симметрии с другими valueOfметодами.
AH

1
статика и многое другое ООП это противоречие терминов. Все, что объявлено статическим , не является частью объекта или его поведения и, следовательно, не является объектно-ориентированным. Кроме того, если существует вероятность того, что реализация Stringбудет изменена и / или улучшена несовместимым способом или во время выполнения можно будет выбрать несколько конкурирующих реализаций, тогда имеет смысл использовать статический метод фабрики. Этого не случится с такими низкоуровневыми вещами, как String. Поэтому моя предпосылка такова: используйте самый маленький подходящий молоток, а не самый большой из доступных.
AH

@ А, я не знаю об этом. String уступил StringBuffer, который уступил StringBuilder. Бьюсь об заклад, сторонники StringBuffer сказали то же самое тогда, и теперь придется рефакторинг кода для использования StringBuilder.
CorsiKa

1
@AH Тот факт, что им пришлось создать CharSequenceинтерфейс, показывает, насколько ошибочна ваша «не будет происходить с низкоуровневыми вещами, такими как строка» - они не меняют то, что происходит в строке, потому что они привязали себя к этому на раннем этапе, и теперь они хотят они бы не имели.
CorsiKa

1
@corsiKa Я не говорил, что String API - это все хорошо и хорошо. Только то, что он не изменится несовместимым образом и что сам класс и его конструкторы никуда не денутся. :-)
AH

37

Это преобразует массив символов обратно в строку:

char[] charArray = {'a', 'b', 'c'};
String str = String.valueOf(charArray);

14
String str = "wwwwww3333dfevvv";
char[] c = str.toCharArray();

Теперь преобразовать массив символов в строку можно двумя способами.

Arrays.toString(c);

Возвращает строку [w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v].

А также:

String.valueOf(c)

Возвращает строку wwwwww3333dfevvv.

В заключение : обратите внимание Arrays.toString(c), потому что вы получите "[w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v]"вместо "wwwwww3333dfevvv".


7

Строка в Java это просто объект вокруг массива символов. Отсюда

char[]

идентична распакованной строке с теми же символами. Создавая новую строку из вашего массива символов

new String(char[])

по сути, вы говорите компилятору автоматически блокировать объект String вокруг вашего массива символов.


3

Ты можешь использовать String.valueOf метод.

Например,

char[] a = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};
String b = String.valueOf(a);
System.out.println("Char Array back to String is: " + b);

Подробнее о массиве символов в строке вы можете ссылаться на ссылки ниже

https://docs.oracle.com/javase/7/docs/api/java/lang/String.html

https://www.flowerbrackets.com/convert-char-array-to-string-java/


2
package naresh.java;

public class TestDoubleString {

    public static void 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 charArray
            try{
                if(charArray[i]==charArray[i+1]){
                    charArray[i]='0';                   
                }}
                catch(Exception e){
                    System.out.println("Exception");
                }
        }//finally printing final character string
        for(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

String stringValue = 
Arrays.stream(new char[][]{a}).map(String::valueOf).collect(Collectors.joining());

1

Попробуйте использовать java.util.Arrays. Этот модуль имеет множество полезных методов, которые могут быть использованы, связанные с массивами.

Arrays.toString(your_array_here[]);


0

Просто используйте String.value, как показано ниже;

  private static void h() {

        String helloWorld = "helloWorld";
        System.out.println(helloWorld);

        char [] charArr = helloWorld.toCharArray();

        System.out.println(String.valueOf(charArr));
    }

-3

Попробуй это:

CharSequence[] charArray = {"a","b","c"};

for (int i = 0; i < charArray.length; i++){
    String str = charArray.toString().join("", charArray[i]);
    System.out.print(str);
}

-4

Вы также можете использовать класс StringBuilder

String b = new StringBuilder(a).toString();

Использование String или StringBuilder зависит от требований вашего метода.


Но почему? Что вы получаете от этого?
Кейси

-12

1 альтернативный способ сделать:

String b = a + "";

3
это неправильно, так как предполагает, что toStringработает правильно char[]. Это может работать на некоторых конкретных поставщиков и версий JVM.
fommil

3
Поскольку класс String является неизменяемым, это приведет к выполнению двух операций: вызову toString () aи созданию другого объекта String, который объединяется с a.toString()и""
Alpay
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.