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.