2016-05-25 3 views
7

У меня есть строка, и мне нужно пройти ее как массив символов. Конечно обычный метод заключается в использовании toCharArray()Как преобразовать строку в char [] без копирования объекта?

String str = "Hello"; 
char[] charArr = str.toCharArray(); 

Теперь исходный код для toCharArray() выглядит следующим образом.

public char[] toCharArray() { 
    // Cannot use Arrays.copyOf because of class initialization order issues 
    char result[] = new char[value.length]; 
    System.arraycopy(value, 0, result, 0, value.length); 
    return result; 
} 

Таким образом, Java создает новый объект в памяти типа char [] и копирует строковый объект в новый объект.

Мой вопрос в том, можно ли использовать строку как char [] без копирования массива. Мое намерение состоит в том, чтобы сэкономить на памяти. Если это невозможно, есть ли причина?

Заранее благодарен!

+4

Передача прямой ссылки на изменяемый массив 'char []' объекта, который должен быть неизменным, был бы очень плохой идеей, особенно если этот неизменяемый объект, если тип 'String', который имеет для выполнения соответствующих функций безопасности. – Holger

+2

Если вы хотите сохранить память, не запрашивайте массив 'char []'. Вы не объяснили, почему вы думаете, что вам это нужно. – Holger

+0

Мне нужен массив, чтобы я мог перебирать его по индексу. Однако то, что я не понял и что заметил Николя Филотто, состоит в том, что строки - это просто класс, который хранит строку в массиве 'char []'. Да! Ошибка начинающих :) –

ответ

11

Нет, это не так. Не без размышлений, чего вам следует избегать. Мессинг с базовым char[] в строке через отражение - это рецепт для тонких ошибок. Вы можете получить доступ к отдельным символам в строке, используя charAt, но если вам действительно нужен char[], вы должны просто позвонить toCharArray.

Если это невозможно, есть ли причина?

Первая причина: инкапсуляция. Массив - частная реализация.

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

+1

И, кроме того, другие ссылки на ту же строку в пуле строк также будут иметь ту же самую мутированную строку, что приведет к большей путанице. – Pokechu22

+1

@ Pokechu22: еще хуже, политики безопасности (разрешения, источники кода, имена пользователей) хранятся в виде строк, поэтому их изменение может подорвать всю модель безопасности. – Holger

3

Вот как вы можете пересекать String каким-то образом, как char массив без использования toCharArray():

for (int i = 0; i < str.length(); i++) { 
    char c = str.charAt(i); 
} 
+1

Ну, не «это», о которых спрашивал ОП ... если у ОП есть только метод, принимающий 'char []', который они не могут изменить, например, это не будет помощь вообще. –

+0

И где вы храните эти сгенерированные символы? –

+1

«У меня есть строка, и мне нужно пересечь ее как массив символов», это основной запрос OP, я предлагаю помощь в перемещении строки, если это не то, что OP ожидает, что ему нужно изменить вопрос –

3

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

Это самый чистый путь. Даже при том, что вы создаете свою собственную функцию и делаете какой-то трюк, вы в конечном итоге создадите новый массив.

Пойдите со своими текущими кодами.

Смежные вопросы