INSFERPED-DAW


Strings

A clase String utilízase para almacenar cadeas de caracteres.

/* Catro xeitos de crear unha tipo String */

// Asignando directamente un literal.
String texto1 = "I'm often asked why I didn't try to patent the idea of a communications satellite. My answer is always, 'A patent is really a license to be sued.' Arthur C. Clarke";

// Creando a variable string baldeira, e asignado despois.
String texto2;
texto2 = "\"if you have time to think of a beautiful end, then live beautiful until the end.\" (Sakata Gintoki (Gintama))";

// Creando un obxeto String que inicializamos cunha cadea de caracteres.
String texto3 = new String("Klaatu barada nikto");

// Creamos un obxeto String baldeiro e, máis logo, asignámoslle unha
// cadea de caracteres.
String texto4 = new String();
texto3 = "\"I'm using Linux. A library that Emacs uses to communicate with Intel hardware.\" (-Erwin, #emacs, Freenode)";


// NOTA: Non é obrigatorio asignar directamente un literal. Pódese usar,
// en calquera dos catro xeitos, calquer función/método que devolva un
// String. Por exemplo:
String texto5 = new String(texto3.toUpperCase());
//                         ^^^^^^^^^^^^^^^^^^^^
//                         .. (A clase String ten un método 'toUpperCase()'
//                            que devolve a cadea de caracteres que conten
//                            convertida a maiúsculas.) 

Todos os métodos de String pódense ollar no API. Entre éstes temos:

  • O método 'equals' para comparar strings.
String s1 = "Foo";
String s2 = "Bar";

if (s1.equals(s2)) {
    System.out.println(s1+" é igual que "+s2+".");
    //                   ^.. O operador '+', cando é utilizado con
    //                       strings, concatenaos. Aquí, crea un
    //                       único string que é o que se lle pasa
    //                       a .println()
} else {
    System.out.println(s1+" e "+s2+" son diferentes ");
}

if (s1.equals("Foo")) {
    System.out.println("Ámbolos dous son iguais");
} else {
    System.out.println("Son diferentes");
}


// Tamén se usa cos literais.
if ("Bar".equals(s2)) {
    System.out.println("Ámbolos dous son iguais");
} else {
    System.out.println("Son diferentes");
}
  • O método 'length' que devolve o número caracteres que ten(o seu tamaño).
String s1 = "Memento mori";

System.out.println("O string ten "+s1.length()+ " caracteres.");
//                                ^           ^
//                  ...........................
//                  . Aquí o operador '+' concatena dous tipos diferentes,
//                    String con 'int'. O que fai o '+' é convertir a
//                    String o enteiro para poder concatenalo. En xeral,
//                    faino con todos os obxetos, xa que todo obxeto en
//                    Java ten o método '.toString()'.
// 
// https://docs.oracle.com/javase/9/docs/api/java/lang/Object.html#toString
  • O método 'isEmpty' devolve un tipo boolean; true se está baldeiro e false se ten un ou máis caracteres.
String s1;
String s2 = new String();
String s3 = "abc";

if (s2.isEmpty()) {
    System.out.println("Está baldeiro");
}

if (s3.isEmpty()) {
    System.out.println("Está baldeiro");
} else {
    System.out.println("O tamaño de "+s3+" é: "+s3.length());
}


// NOTA: Este caso producirá un erro cando se compile o programa.
//
//           "error: variable s1 might not have been initialized"
//
//
//       A diferencia de s2 ou s3, s1 non foi inicializado, é dicir,
//       non contén un obxeto string, é un recipinte para almacenar
//       un string pero sen contido. Na contra, s2 foi inicializado
//       con un obxeto string baldeiro, pero que xa 'existe' e ten
//       os seu atributos e métodos.

if (s1.isEmpty()) {
    System.out.println("Está baldeiro");
}
  • O método 'charAt' devolve o caracter, que será de tipo 'char', na posición que se lle especifica.
String s = "Do Re Mi Fa Sol La Si";

// Gráficamente, o string 's' pódese representar algo así:
//
//     Do Re Mi Fa Sol La Si
//     ---------------------
//     012345678901234567890
//               ^         ^
//               10        20

//
//  Podemos dicir que o caracter 'R' atópase na posición 3 e que o
//  'L' na posición 16.
//
//  NOTA: Hai que lembrarse que a primeira posición é a posición 0.
//        Neste exemplo, o tamaño do string 's' é de 21 caracteres,
//        e o seu derradeiro caracter está na posición 20. Esta
//        diferencia é debido á posición 0, que ó calcular o tamaño
//        do string suma 1.


System.out.println("O caracter na posición 16 de "+s+ " é '"+s.charAt(16)+"'.");
System.out.println("O caracter na posición 0 de "+s+ " é '"+s.charAt(0)+"'.");


// Se lle pasamos ó metodo 'charAt' unha posición que non existe, dará
// erro. No exemplo, a posición 21 non existe e lanzará un erro se a
// usamos; e a 22 100 666 -13 -1023 etc tamén.
//                     ^..Up the Irons!

Percorrer un String

String texto = new String();
texto = "\"I'm using Linux. A library that Emacs uses to communicate with Intel hardware.\" (-Erwin, #emacs, Freenode)";
//       ^^.. É importante lembrar que para poder incluir certos      ...................^^
//            'caracteres' nun String, hai que 'escapalos', e para iso
//            úsase a \ seguida dalgún caracter; un exemplo pode ser
//            o \n que inclúe un cambio de línea, ou \t que introduce
//            un tabulador.
//            Neste caso, debido a que o String está delimitado polas
//            comiñas dobres, para ter algunha no propio string debemos
//            escapala, \"


// Sustuir os espazos por guións baixos en 'texto' e gardar o novo
// String nunha variable.
String textoConGuions = new String();

for (int i = 0; i < texto.length(); i++) {
    //                   ^.. Aquí utilizamos .length() para saber o
    //                       tamaño do string e así 'i' toma valores
    //                       de 0 a texto.length()-1. 'i' serviranos
    //                       como índice para percorrer o string.

    if (texto.charAt(i) == ' ') {
        //   ^              ^.. Leva comiñas simples porque .charAt()
        //   .                  devolve un char, non un String.
        //   .
        //   .. Nesta condición, utilizamos o método .charAt() para
        //      obter o caracter do String 'texto' que está na
        //      posición 'i'. Como foi dito, charAt() devolve un
        //      tipo char.

        textoConGuions = textoConGuions + '_';
        //                              ^.. Utilizamos o operador '+'
        //                 para engadir o guión baixo.
        //                 Lembremos que os Strings son inmutables,
        //                 é dicir, non se pode modificar. Aquí o que
        //                 facemos é crear un novo String e asignarllo
        //                 a 'textoConGuions'.
    } else {
        textoConGuions += texto.charAt(i);
    }
}

System.out.println("O texto con guións é:\n"+textoConGuions);

NOTA: Utilizar o operador '+' para engadir a un String é moi ineficinte, e debémolo usar para casos onde non sexan moitas operacións. Java ten dúas clases para solucionar este problema. StringBuilder para cando as operacións sobre o obxeto son nun so fío, e StringBuffer para operacións sobre o obxeto en múltiples fíos.