← Назад к вопросам

Как привести строку к массиву символов

1.6 Junior🔥 171 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Преобразование строки в массив символов в Java

В Java есть несколько способов преобразовать строку (String) в массив символов (char[]). Рассмотрю все основные подходы с примерами.

1. Метод toCharArray() — Рекомендуемый способ

Это самый прямой и эффективный способ.

public class StringToCharArray {
    public static void main(String[] args) {
        String text = "Hello";
        
        // Преобразуем в char[]
        char[] chars = text.toCharArray();
        
        // Выводим массив
        System.out.println("Массив: " + Arrays.toString(chars));
        // Вывод: Массив: [H, e, l, l, o]
        
        // Доступ к отдельным символам
        System.out.println("Первый символ: " + chars[0]); // H
        System.out.println("Длина: " + chars.length); // 5
    }
}

Особенности toCharArray()

// Копирует значения (safe)
String original = "Hello";
char[] chars = original.toCharArray();
chars[0] = 'X'; // Изменяем массив
System.out.println(original); // Hello (original не изменилась)

// Пустая строка
String empty = "";
char[] emptyArray = empty.toCharArray();
System.out.println(emptyArray.length); // 0

// null безопасно?
String nullStr = null;
// char[] nullArray = nullStr.toCharArray(); // NullPointerException!

2. Метод charAt() — Для конкретного символа

Если нужен один символ по индексу.

String text = "Hello";

// Получить конкретный символ
char first = text.charAt(0); // 'H'
char last = text.charAt(text.length() - 1); // 'o'

System.out.println("Первый: " + first);
System.out.println("Последний: " + last);

// charAt с индексом вне диапазона
try {
    char invalid = text.charAt(10); // StringIndexOutOfBoundsException
} catch (StringIndexOutOfBoundsException e) {
    System.out.println("Ошибка: индекс вне диапазона");
}

3. Цикл с charAt() — Для итерации

String text = "Hello";

// Способ 1: for через charAt
for (int i = 0; i < text.length(); i++) {
    char c = text.charAt(i);
    System.out.println("Позиция " + i + ": " + c);
}

// Способ 2: enhanced for с toCharArray
for (char c : text.toCharArray()) {
    System.out.println(c);
}

// Способ 3: stream API
text.chars()
    .forEach(c -> System.out.println((char) c));

4. split() для разбиения строки

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

String csv = "apple,banana,cherry";
String[] fruits = csv.split(",");
// Результат: ["apple", "banana", "cherry"]

// Но это String[], не char[]
System.out.println(Arrays.toString(fruits));

// Если нужен массив символов разделителя:
char delimiter = ',';
String[] parts = csv.split(String.valueOf(delimiter));

5. Stream API — Современный способ

String text = "Hello";

// В список Character
List<Character> charList = text.chars()
    .mapToObj(c -> (char) c)
    .collect(Collectors.toList());

System.out.println(charList); // [H, e, l, l, o]

// В массив Character[]
Character[] charArray = text.chars()
    .mapToObj(c -> (char) c)
    .toArray(Character[]::new);

System.out.println(Arrays.toString(charArray));

// Фильтрация
text.chars()
    .mapToObj(c -> (char) c)
    .filter(c -> c != 'l')
    .forEach(System.out::println); // H, e, o

6. getBytes() — Для байтов (не символов)

Это не массив char, а массив byte. Но часто путают.

String text = "Hello";

// getBytes() возвращает byte[], не char[]
byte[] bytes = text.getBytes();
System.out.println(Arrays.toString(bytes));
// Вывод: [72, 101, 108, 108, 111]
// 72 = 'H' в ASCII

// С кодировкой
byte[] utf8 = text.getBytes(StandardCharsets.UTF_8);
byte[] latin1 = text.getBytes(StandardCharsets.ISO_8859_1);

Сравнение методов

МетодВозвращаетИспользованиеПроизводительность
toCharArray()char[]Весь массивОтлично, O(n)
charAt(i)charОдин символХорошо, O(1)
split()String[]РазбиениеХорошо, O(n)
chars().map()StreamФункциональный стильМедленнее, O(n)
getBytes()byte[]Для кодированияO(n)

Практические примеры

Пример 1: Проверка палиндрома

public class PalindromeCheck {
    public static boolean isPalindrome(String text) {
        char[] chars = text.toCharArray();
        int left = 0, right = chars.length - 1;
        
        while (left < right) {
            if (chars[left] != chars[right]) {
                return false;
            }
            left++;
            right--;
        }
        return true;
    }
    
    public static void main(String[] args) {
        System.out.println(isPalindrome("racecar")); // true
        System.out.println(isPalindrome("hello")); // false
    }
}

Пример 2: Подсчёт частоты символов

public class CharFrequency {
    public static Map<Character, Integer> getFrequency(String text) {
        Map<Character, Integer> frequency = new HashMap<>();
        
        for (char c : text.toCharArray()) {
            frequency.put(c, frequency.getOrDefault(c, 0) + 1);
        }
        
        return frequency;
    }
    
    public static void main(String[] args) {
        String text = "hello";
        Map<Character, Integer> freq = getFrequency(text);
        // {h=1, e=1, l=2, o=1}
        freq.forEach((c, count) -> 
            System.out.println(c + ": " + count)
        );
    }
}

Пример 3: Сортировка символов

public class SortCharacters {
    public static void main(String[] args) {
        String text = "hello";
        
        // Способ 1: toCharArray
        char[] chars = text.toCharArray();
        Arrays.sort(chars);
        System.out.println(new String(chars)); // "ehllo"
        
        // Способ 2: Stream
        String sorted = text.chars()
            .sorted()
            .collect(StringBuilder::new,
                (sb, c) -> sb.append((char) c),
                StringBuilder::append)
            .toString();
        System.out.println(sorted); // "ehllo"
    }
}

Пример 4: Изменение символов

public class ModifyString {
    public static void main(String[] args) {
        String text = "hello";
        
        // Преобразуем в char[]
        char[] chars = text.toCharArray();
        
        // Изменяем символы
        for (int i = 0; i < chars.length; i++) {
            chars[i] = Character.toUpperCase(chars[i]);
        }
        
        // Преобразуем обратно
        String uppercase = new String(chars);
        System.out.println(uppercase); // "HELLO"
    }
}

Производительность

// Для больших строк
String largeString = "..."; // 1 млн символов

// Быстро
char[] array = largeString.toCharArray(); // ~1ms

// Медленнее (функциональный стиль)
Stream<Character> stream = largeString.chars()
    .mapToObj(c -> (char) c); // ~50ms

// Медленно (charAt в цикле)
for (int i = 0; i < largeString.length(); i++) {
    char c = largeString.charAt(i); // ~200ms
}

Null-safe обработка

public class SafeStringToCharArray {
    public static char[] toCharArray(String str) {
        if (str == null || str.isEmpty()) {
            return new char[0];
        }
        return str.toCharArray();
    }
    
    public static void main(String[] args) {
        System.out.println(Arrays.toString(toCharArray(null))); // []
        System.out.println(Arrays.toString(toCharArray(""))); // []
        System.out.println(Arrays.toString(toCharArray("Hi"))); // [H, i]
    }
}

Рекомендации

  1. toCharArray() — используй как основной метод, это быстро и просто
  2. charAt() — для доступа к конкретному символу
  3. Stream API — если нужна функциональная обработка
  4. split() — для разбиения строки, но возвращает String[], не char[]
  5. Проверяй null перед преобразованием
  6. Помни о производительности на больших строках

Вывод

toCharArray() — это стандартный и рекомендуемый способ преобразовать строку в массив символов в Java. Он прост, быстр и безопасен. Используй его как основной инструмент для работы с массивами символов.