> For the complete documentation index, see [llms.txt](https://educacion.gitbook.io/programacion/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://educacion.gitbook.io/programacion/ud3-introducion-a-programacion-orientada-a-obxectos/clases-da-api-de-java/string.md).

# String

En Java, a clase `String`<i class="fa-copy">:copy:</i> é unha das clases máis utilizadas e forma parte do paquete `java.lang`<i class="fa-copy">:copy:</i>. **Representa cadeas de texto** e, aínda que `String`<i class="fa-copy">:copy:</i> se comporta como un tipo de datos primitivo, realmente é unha clase que proporciona moitas funcionalidades para traballar con texto.

{% hint style="warning" %}
**Documentación oficial:** <https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/String.html>
{% endhint %}

Aquí tes algunhas características:

* **Almacenamento no String Pool**: Java utiliza un *pool* de cadeas (*String Pool*) para gardar instancias de `String`<i class="fa-copy">:copy:</i>. Cando se crea unha cadea literal, Java comproba se xa existe unha cadea igual no *pool* e, se é así, reutilízaa. Isto axuda a aforrar memoria, especialmente cando se reutilizan cadeas idénticas.

  ```java
  String s1 = "Hola";
  String s2 = "Hola";
  System.out.println(s1 == s2); //true por que son el mismo objeto
  System.out.println(s1.equals(s2)); //true mismo valor
  String s3 = new String("Hola");
  System.out.println(s1 == s3); // false son objetos diferentes
  System.out.println(s1.equals(s3)); //true por que tienen el mismo valor
  //Identificador Hash de objetos
  System.out.println("ID s1: " + System.identityHashCode(s1));
  System.out.println("ID s2: " + System.identityHashCode(s2));
  System.out.println("ID s3: " + System.identityHashCode(s3));

  ```
* **Inmutabilidade**: Unha vez que unha instancia de `String`<i class="fa-copy">:copy:</i> é creada, non pode ser modificada. Calquera operación que aparentemente modifique unha cadea (como concatenación) crea unha nova instancia de `String`<i class="fa-copy">:copy:</i>, e a antiga permanece inalterada. Por exemplo:

```java
String texto = "Hola";
System.out.println("ID texto: " + System.identityHashCode(texto));
texto = texto + "mundo";
System.out.println("ID texto: " + System.identityHashCode(texto));
```

O contido orixinal “Ola” non é alterado; a variable `texto` agora referencia unha nova cadea “Ola Mundo”.

## Métodos máis utilizados <a href="#id-1021-metodos-mais-utilizados" id="id-1021-metodos-mais-utilizados"></a>

A clase `String`<i class="fa-copy">:copy:</i> proporciona moitos métodos útiles para manipular cadeas de texto. Aquí tes algúns dos máis comúns:

* **Crear unha instancia de `String`**<i class="fa-copy">:copy:</i>

  ```java
  String sb = new String(); // Cadea baleira
  String sbCoTexto = new String("Ola Mundo"); // Cadea inicial
  ```
* **Obter un carácter nunha posición concreta**: `char charAt(int index)`<i class="fa-copy">:copy:</i>

  ```java
  char caracter = texto.charAt(4); // Obtense o caracter da posición 4
  ```
* **Concatenar cadeas**: `concat(String str)`<i class="fa-copy">:copy:</i>

  ```java
  String parte1 = "Ola";
  String parte2 = " Mundo";
  String resultado = parte1.concat(parte2); // Retorna "Ola Mundo"
  ```
* **Comprobar se unha cadea de texto contén unha determinada subcadea**: `boolean contains(CharSequence subcadea)`<i class="fa-copy">:copy:</i>

  ```java
  String texto = "Ola, benvido a Java!";
  System.out.println(texto.contains("benvido")); // true
  System.out.println(texto.contains("Python"));  // false
  ```
* **Comprobar se unha cadea de texto remata cunha determinada subcadea** : `boolean endsWith(String sufixo)`<i class="fa-copy">:copy:</i>

  ```java
  String ficheiro = "documento.pdf";
  System.out.println(ficheiro.endsWith(".pdf"));  // true
  System.out.println(ficheiro.endsWith(".txt"));  // false
  ```
* **Comparar cadeas**: `boolean equals(String str)`<i class="fa-copy">:copy:</i> e `boolean equalsIgnoreCase(String str)`<i class="fa-copy">:copy:</i>

  ```java
  String a = "Ola";
  String b = "ola";
  boolean igual = a.equals(b); // Retorna false
  boolean igualIgnorandoMaiusculas = a.equalsIgnoreCase(b); // Retorna true
  ```
* **Buscar caracteres ou subcadeas**: `int indexOf(int caracter)`<i class="fa-copy">:copy:</i>, `int indexOf(int caracter, int dendeIndice)`<i class="fa-copy">:copy:</i>, `int indexOf(int caracter, int dendeIndice, int ataIndice)`<i class="fa-copy">:copy:</i>, `int indexOf(String cadea)`<i class="fa-copy">:copy:</i>, `int indexOf(String cadea, int dendeIndice)`<i class="fa-copy">:copy:</i>, `int indexOf(String cadea, int dendeIndice, int ataIndice)`<i class="fa-copy">:copy:</i>

  ```java
  String texto = "Benvido ao curso de Java";
  int indice = texto.indexOf("curso"); // Retorna 11
  ```
* **Obter o longo da cadea**: `int length()`<i class="fa-copy">:copy:</i>

  ```java
  String texto = "Exemplo";
  int longo = texto.length(); // Retorna 7
  ```
* **Reemplazar Caracteres ou Subcadeas**: `String replace(char caracter, char caracterNovo)`<i class="fa-copy">:copy:</i> e `String replace(String subcdea, char subcadeaNova)`<i class="fa-copy">:copy:</i>

  ```java
  String texto = "Java é divertido";
  String resultado = texto.replace("divertido", "incrible"); // Retorna "Java é incrible"
  ```
* **Dividir Cadeas**: `String[] split(String regex)`<i class="fa-copy">:copy:</i>

  ```java
  String texto = "Ola, Mundo";
  String[] partes = texto.split(", "); // Retorna un array ["Ola", "Mundo"]
  ```
* **Comprobar se unha cadea de texto comeza cunha determinada subcadea** : `boolean startsWith(String prefixo)`<i class="fa-copy">:copy:</i>

  ```java
  String ficheiro = "documento.pdf";
  System.out.println(ficheiro.startsWith("doc"));  // true
  System.out.println(ficheiro.startsWith("txt"));  // false
  ```
* **Subcadeas**: `String substring(int indiceComezo)`<i class="fa-copy">:copy:</i> e `String substring(int indiceComezo, int indiceFinalsinIncluir)`<i class="fa-copy">:copy:</i>

  ```java
  String texto = "Benvido";
  String subcadea = texto.substring(3); // Retorna "vido"
  ```
* **Conversións a maiúsculas ou minúsculas**: `String toUpperCase()`<i class="fa-copy">:copy:</i> e `String toLowerCase()`<i class="fa-copy">:copy:</i>

  ```java
  String texto = "Ola Mundo";
  String maiusculas = texto.toUpperCase(); // Retorna "OLA MUNDO"
  ```
* **Eliminar espazos en branco ao principio e final**: `String trim()`<i class="fa-copy">:copy:</i>

  ```java
  String texto = "   Ola   ";
  String senEspazos = texto.trim(); // Retorna "Ola"
  ```

## Conversión a String <a href="#id-1022-conversion-a-string" id="id-1022-conversion-a-string"></a>

O método `valueOf()`<i class="fa-copy">:copy:</i> da clase `String`<i class="fa-copy">:copy:</i> en Java é un método estático que converte diferentes tipos de datos en **cadeas de texto (`String`**<i class="fa-copy">:copy:</i>**)**.

```java
public static String valueOf(tipo valor)
```

A clase `String`<i class="fa-copy">:copy:</i> sobrecarga `valueOf()`<i class="fa-copy">:copy:</i> para admitir diferentes tipos de datos:

| Método                                                     | Conversión                                      | Exemplo                                                             |
| ---------------------------------------------------------- | ----------------------------------------------- | ------------------------------------------------------------------- |
| `String.valueOf(int i)`<i class="fa-copy">:copy:</i>       | `int → String`<i class="fa-copy">:copy:</i>     | `String.valueOf(42)`<i class="fa-copy">:copy:</i>                   |
| `String.valueOf(double d)`<i class="fa-copy">:copy:</i>    | `double → String`<i class="fa-copy">:copy:</i>  | `String.valueOf(3.14)`<i class="fa-copy">:copy:</i>                 |
| `String.valueOf(boolean b)`<i class="fa-copy">:copy:</i>   | `boolean → String`<i class="fa-copy">:copy:</i> | `String.valueOf(true)`<i class="fa-copy">:copy:</i>                 |
| `String.valueOf(char c)`<i class="fa-copy">:copy:</i>      | `char → String`<i class="fa-copy">:copy:</i>    | `String.valueOf('A')`<i class="fa-copy">:copy:</i>                  |
| `String.valueOf(char[] data)`<i class="fa-copy">:copy:</i> | `char[] → String`<i class="fa-copy">:copy:</i>  | `String.valueOf(new char[]{'H', 'o'})`<i class="fa-copy">:copy:</i> |

## Conversión dende String <a href="#id-1023-conversion-dende-string" id="id-1023-conversion-dende-string"></a>

Para converter un `String`<i class="fa-copy">:copy:</i> a outros tipos de datos en Java, utilizamos os métodos de conversión proporcionados polas clases envolventes (`wrapper classes`<i class="fa-copy">:copy:</i>) dos tipos primitivos.

| Conversión                                                                     | Método                                                                                                          |
| ------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------- |
| `String`<i class="fa-copy">:copy:</i> → `int`                                  | `Integer.parseInt(str)`<i class="fa-copy">:copy:</i> ou `Integer.valueOf(str)`<i class="fa-copy">:copy:</i>     |
| `String`<i class="fa-copy">:copy:</i> → `double`<i class="fa-copy">:copy:</i>  | `Double.parseDouble(str)`<i class="fa-copy">:copy:</i> ou `Double.valueOf(str)`<i class="fa-copy">:copy:</i>    |
| `String`<i class="fa-copy">:copy:</i> → `boolean`<i class="fa-copy">:copy:</i> | `Boolean.parseBoolean(str)`<i class="fa-copy">:copy:</i> ou `Boolean.valueOf(str)`<i class="fa-copy">:copy:</i> |
| `String`<i class="fa-copy">:copy:</i> → `char[]`<i class="fa-copy">:copy:</i>  | `str.toCharArray()`<i class="fa-copy">:copy:</i>                                                                |

A diferenza de `parseX()`<i class="fa-copy">:copy:</i>, `valueOf()`<i class="fa-copy">:copy:</i> devolve obxectos envolventes como `Integer`<i class="fa-copy">:copy:</i>, `Double`<i class="fa-copy">:copy:</i>, `Boolean`<i class="fa-copy">:copy:</i>, etc., mentres que `parseX()`<i class="fa-copy">:copy:</i> devolve tipos primitivos como `int`, `double`<i class="fa-copy">:copy:</i>, etc.

**Importante:** Todas as conversións numéricas lanzan unha **`NumberFormatException`**<i class="fa-copy">:copy:</i> se o `String`<i class="fa-copy">:copy:</i> non contén un valor válido.

### Conversion de caracteres a enteiros

Se utilizamos o método `Integer.valueOf(char)`<i class="fa-copy">:copy:</i> por exemplo co caracter `'9'`, este método non devolverá o enteiro `9`, senón que devolverá o seu código ASCII correspondente 57.

```java
int numero = Integer.valueOf('9');
System.out.println(numero); // Imprime 57
```

A solución é, ou pasalo carácter a un `String`<i class="fa-copy">:copy:</i>:

```java
String numeroS = String.valueOf('9');
int numero = Integer.valueOf(numeroS);
System.out.println(numero); // Imprime 9
```

## Comparacións de cadeas <a href="#id-1024-comparacions-de-cadeas" id="id-1024-comparacions-de-cadeas"></a>

En Java, comparar cadeas de texto (`String`<i class="fa-copy">:copy:</i>) pode facerse de varias formas, dependendo de que queres comprobar exactamente (se as cadeas son iguais, se unha é lexicograficamente maior que a outra, etc.). Aquí te explico as principais formas de comparar `String`<i class="fa-copy">:copy:</i> en Java:

* O método **`boolean equals(Object outro)`**<i class="fa-copy">:copy:</i> compara o **valor** das cadeas, é dicir, o contido das cadeas.

  ```java
  String a = "Java";
  String b = "Java";
  String c = "java";

  System.out.println(a.equals(b)); // true
  System.out.println(a.equals(c)); // false
  ```
* `boolean equalsIgnoreCase(String outro)`<i class="fa-copy">:copy:</i> este método compara as cadeas sen ter en conta se son maiúsculas ou minúsculas.

  ```java
  String a = "Java";
  String b = "java";

  System.out.println(a.equalsIgnoreCase(b)); // true
  ```
* Se necesitas comparar cadeas para ver se son **maiores**, **menores** ou **iguales** en orde lexicográfica, usa **`int compareTo(String outro)`**<i class="fa-copy">:copy:</i>. Retorna un número negativo, cero ou positivo dependendo de se a cadea actual é lexicograficamente menor, igual ou maior que a cadea de comparación.

  ```java
  String a = "Java";
  String b = "Python";
  String c = "Java";

  System.out.println(a.compareTo(b)); // Valor negativo (porque "Java" é lexicograficamente menor que "Python")
  System.out.println(a.compareTo(c)); // 0 (porque son iguais)
  System.out.println(b.compareTo(a)); // Valor positivo (porque "Python" é lexicograficamente maior que "Java")
  ```
* Para non distinguir entre maiúsculas e minúsculas, usa **`int compareToIgnoreCase(String outro)`**<i class="fa-copy">:copy:</i>.

  ```java
  String a = "java";
  String b = "Java";

  System.out.println(a.compareToIgnoreCase(b)); // 0 (porque non importa a maiúscula/minúscula)
  ```

Comparación ==

O operador **`==`** compara as referencias dos obxectos, non os seus valores. Isto significa que **compara se as cadeas son o mesmo obxecto na memoria**, non se teñen o mesmo contido.

#### Exemplo: <a href="#exemplo" id="exemplo"></a>

```java
String a = "Java";
String b = "Java";
String c = new String("Java");

System.out.println(a == b); // true (porque "Java" está na área de memoria do "String pool")
System.out.println(a == c); // false (porque "c" é un novo obxecto na memoria)
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://educacion.gitbook.io/programacion/ud3-introducion-a-programacion-orientada-a-obxectos/clases-da-api-de-java/string.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
