Funcionamento interno das strings e o método substring - 1

"Olá, amigo!"

"Oi, Ellie."

"Vou falar sobre substrings. Uma substring é uma parte de uma string. E a operação mais comum realizada em strings (depois de combinar várias strings juntas) é obter uma substring."

7) Como faço para obter parte de uma String?

"O método substring retorna parte de uma String. Este método tem duas versões."

"A primeira versão retorna a substring especificada pelos índices inicial e final. Mas o caractere no índice final não está incluído! Se você passar os números 1 e 3, a substring conterá apenas o segundo e o terceiro caracteres (lembre-se que os índices começam com 0)."

"A segunda versão retorna a substring a partir do índice passado até o final da String."

Métodos) Exemplos)
String substring(int beginIndex, int endIndex)
String s = "Good news, everyone!";
s = s.substring(1,6);
Resultado:

s == "ood n";
String substring(int beginIndex)
String s = "Good news, everyone!";
s = s.substring(1);

"Isso é bastante simples. Obrigado, Ellie."

"Também vou explicar o funcionamento interno dos objetos String para você."

"Como você provavelmente já sabe, String é uma classe imutável. E que vantagens isso nos dá? Acontece que uma das principais vantagens é a capacidade de obter uma substring. Mas o mais importante primeiro."

"Internamente, um objeto String contém um array de caracteres, o que não é tão difícil de adivinhar. Mas ele também armazena mais duas variáveis: o índice do primeiro caractere do array e a contagem de caracteres. são usados."

"Quando criamos uma substring usando o método substring , um novo objeto String é criado."

"Mas, em vez de armazenar uma referência a uma nova matriz de caracteres, o objeto armazena uma referência à matriz antiga, bem como duas variáveis ​​que ele usa para determinar a parte da matriz de caracteres original que está associada a ela."

"Eu não entendi nada disso."

"Quando uma substring é criada, a matriz de caracteres não é copiada para o novo objeto String. Em vez disso, ambos os objetos armazenam uma referência à matriz de caracteres original. Mas! O segundo objeto também armazena duas variáveis: seu índice inicial na matriz e o número de caracteres que pertencem à substring."

"Confira:"

Obtendo uma substring O que está armazenado dentro da substring
String s = "mama";
O que está armazenado em s:

char[] value = {'m','a','m','a'};
offset = 0;
count = 4;
String s2 = s.substring(1);
O que está armazenado em s2:

char[] value = {'m','a','m','a'};
offset = 1;
count = 3;
String s3 = s.substring(1, 3);
O que é armazenado em s3:

char[] value = {'m','a','m','a'};
offset = 1;
count = 2;

"Todas as três Strings armazenam uma referência ao mesmo array de caracteres, mas também armazenam o índice do primeiro e do último caracteres que pertencem a elas. Ou, mais precisamente, o índice do primeiro caractere e a contagem de caracteres."

"Isso faz sentido agora."

"Portanto, se você pegar uma String com 10.000 caracteres e criar 10.000 substrings de qualquer tamanho, essas substrings usarão muito pouca memória, porque a matriz de caracteres não é duplicada. Essas Strings, que você esperaria usar muito de espaço, levará literalmente apenas alguns bytes."

"Legal!"

"Mas você poderia fazer isso se pudesse modificar Strings?"

"Não, alguém poderia mudar a primeira String, e então todas as suas substrings também mudariam. Agora faz sentido porque eles fizeram isso. Essa é uma solução muito legal."

"Estou feliz que você gostou."