# Strings

No mundo da programação Java, strings são como os blocos de construção de uma linguagem. Elas nos permitem trabalhar com texto, seja um simples "Olá, Mundo!" ou um documento complexo. Strings estão por toda parte em nosso código, e entender como usá-las de forma eficaz é fundamental para qualquer desenvolvedor Java.

## O tipo String

`String` é um `tipo de referência` composto por caracteres. É um dos tipos mais utilizados em Java. Aqui está um exemplo: "Hello, Java". Esta `string` é uma sequência de caracteres, incluindo um espaço.

Este tipo tem algumas características:

- imutável: é impossível alterar um caractere em uma `string`;
- possui métodos para obter caracteres individuais e extrair sub strings;
- caracteres individuais podem ser acessados ​​por índices, o primeiro caractere tem o índice 0, o último sendo comprimento da `string` – 1 ;
- tipo não primitivo(de referência).

Uma string literal, portanto, é cercada por um par de aspas duplas.

Uma `string` pode ter um, mais de um ou zero caracteres.

Uma `string` pode até mesmo ser `null`. Isso significa que nenhum valor foi atribuído.

Outra maneira de criá-la é usando a palavra-chave `new`:

`String str = new String("my-string"); // it creates an object and assigns it to the variable`

Qualquer string tem dois métodos úteis:
- `length()` - retorna o número de caracteres na string;
- `charAt(int index)` retorna um caractere pelo seu índice;

## Métodos úteis de strings

A biblioteca padrão do Java fornece muitos métodos úteis para processar strings:

- `isEmpty()` retorna true se a `string`estiver vazia, caso contrário – false;

- `toUpperCase()` retorna uma nova string em maiúsculas;

- `toLowerCase()` retorna uma nova string em letras minúsculas;

- `startsWith(prefix)` retorna true se a `string` começa com o prefixo de `string` fornecido, caso contrário, false;

- `endsWith(suffix)` retorna true se a `string` termina com o sufixo de `string` fornecido, caso contrário, false.

- `contains(...)` retorna true se a `string` contém a `string` ou caractere fornecido;

- `substring(beginIndex, endIndex)` retorna uma sub `string` da `string` no intervalo: beginIndex, endIndex - 1;

- `replace(old, new)` retorna uma nova string obtida pela substituição de todas as ocorrências de oldpor new que podem ser caracteres ou strings.

- `replaceAll(old, new)` retorna uma nova string obtida pela substituição de todas as ocorrências de old por new, onde old não é uma `string` ou `char`, mas uma expressão regular.

- `trim()` retorna uma cópia da `string` obtida pela omissão dos espaços em branco iniciais e finais. Observe que os espaços em branco incluem não apenas o caractere de espaço, mas principalmente tudo o que parece vazio: tabulação, retorno de carro, caractere de nova linha, etc.

## Exceções ao processar strings

1. NullPointerException. Se uma string for nulle você chamar um método da string, ele lançará um NullPointerException.
2. StringIndexOutOfBoundsException. Se você tentar acessar um caractere inexistente por um índice, essa exceção ocorrerá.

## Concatenando strings e anexando valores a uma string

Duas strings podem ser concatenadas usando o operador "+" ou o método `concat`. Ambas as abordagens levam aos mesmos resultados.

Quando concatenamos duas strings, uma nova string é criada (porque strings são imutáveis ).

## Como comparar strings corretamente?

Como `String` é um tipo de referência, você não deve comparar strings usando os operadores == ou !=. Nesse caso, apenas endereços serão comparados, mas não valores reais.

`String` possui dois métodos convenientes para comparar a equivalência do conteúdo real de uma string com o conteúdo de outra string: 
- `equals(other)`
- `equalsIgnoreCase(other)`

## Resumo

`Strings` em Java são imutáveis, o que significa que seu conteúdo não pode ser alterado após a criação. Qualquer manipulação de `String` resulta na criação de uma nova `String`. Strings podem ser criadas usando a palavra-chave `new`. A biblioteca padrão do Java oferece vários métodos para manipulação de strings. Ao comparar strings, evite usar os operadores, pois strings são referências, não valores. Em vez disso, use os métodos adequados para comparar o conteúdo de strings.



