Java String es especial.docx

21
Java String es especial 1. Un breve resumen de la clase String Un Java Cadena contiene una secuencia inmutable de caracteres Unicode. A diferencia de C / C + +, donde la cadena es simplemente un conjunto de carbón , A Java Cadena Es un objeto de la clase java.lang . Java Cadena Sin embargo, es especial. A diferencia de una clase ordinaria: Cadena se asocia con la cadena literal en forma de textos entre comillas dobles, como "¡Hola, mundo!". Usted puede asignar una cadena literal directamente en un Cadena variable, en lugar de llamar al constructor para crear un Cadena ejemplo. La '+' operador está sobrecargado para concatenar dos Cadena operandos. '+' no funciona en ningún otro objeto tal como Punto y Círculo . Cadena es inmutable. Es decir, su contenido no puede ser modificado una vez que se crea. Por ejemplo, el método toUpperCase ()

Transcript of Java String es especial.docx

Page 1: Java String es especial.docx

Java String es especial1. Un breve resumen de la clase StringUn JavaCadenacontiene una secuencia inmutable de caracteres Unicode. A diferencia de C / C + +, donde la cadena es simplemente un conjuntodecarbón, A JavaCadenaEs un objeto de la clasejava.lang.JavaCadenaSin embargo, es especial. A diferencia de una clase ordinaria:Cadenase asocia con la cadena literal en forma de textos entre comillas dobles, como "¡Hola, mundo!". Usted puedeasignar una cadena literal directamente en unCadenavariable, en lugar de llamar al constructor para crear unCadenaejemplo.La'+'operador está sobrecargado para concatenar dosCadenaoperandos.'+'no funciona en ningún otro objetotal comoPuntoyCírculo.Cadenaes inmutable. Es decir, su contenido no puede ser modificado una vez que se crea. Por ejemplo, el métodotoUpperCase ()construye y devuelve un nuevoCadenaen lugar de modificar el contenido de su ya existente.El método comúnmente utilizado en laCadenaclase se resumen a continuación. Consulte la API de JDK parajava.lang.String

Page 2: Java String es especial.docx

unListado completo./ / Longitudint length ()/ / Devuelve la longitud de la cadenaestaVacia booleano () / / igual que thisString. longitud == 0/ / Comparaciónboolean equals (String otro) / / No se puede usar '==' o '! =' para comparar dos cadenas en Javabooleano equalsIgnoreCase (String otro)int compareTo (String otro) / / devuelve 0 si esta cadena es igual a otro;/ / <0 si lexicográfico menos que otro, o> 0int compareToIgnoreCase (String otro)booleano startsWith (String otro)booleano startsWith (String otro, int fromIndex) / search / comienza en fromIndexbooleano endsWith (String otro)/ / Búsqueda e indexaciónint indexOf (búsqueda String)int indexOf (búsqueda String, int fromIndex)int indexOf (int caracter)int indexOf (carácter int, int fromIndex)/ / Búsqueda hacia adelante a partir de fromIndexint lastIndexOf (búsqueda String)int lastIndexOf (búsqueda String, int fromIndex) / search / hacia atrás a partir de fromIndex

Page 2int lastIndexOf (carácter int)int lastIndexOf (carácter int, int fromIndex)/ / Extraer un char o parte de la cadena (substring)charlas charAt (int index)/ / Índice de 0 a longitud de cuerda - 1Cadena substring (int fromIndex)Subcadena String (fromIndex int, int endIndex) / / excluir endIndex/ / Crear un nuevo objeto String o char [] en el original (Las cadenas son inmutables!)Cadena toLowerCase ()Cadena toUpperCase ()Cadena trim ()/ / Crea una nueva cadena eliminando los espacios en blanco de la parte delantera y traseraReemplazar cadena (char oldChar, char newChar) / / crea una nueva cadena con oldChar reemplazado por newCharCadena concat (String otro)/ / Igual que otro thisString +char [] ToCharArray ()/ / Crear un char [] de esta cadenaGetChars void (int srcBegin, int srcEnd, char [] dst, int dstBegin) / / copia en dst char []/ / Los métodos estáticos para convertir a String primitivasCuerda estática valueOf (tipo arg) / / tipo puede ser primitivas o char []/ / Método estático como resultado una cadena con formato utilizando los especificadores de formato

Page 3: Java String es especial.docx

formato static String (String formattingString, objetos ... args) / / igual que printf ()/ / Regular Expression (JDK 1.4)partidos booleanos (String regexe)Cadena replaceAll (String regexe, la sustitución String)Cadena replaceAll (String regexe, la sustitución String)String [] split (cadena regexe)/ / Dividir la cadena utilizando regexe como delimitador,/ / Devuelve una matriz de StringString [SPLIT] (String regexe, int count) / / para el recuento de veces sóloString.Format método estático () (JDK 1.5)LaestáticométodoString.Format ()(Introducido en JDK 1,5) se puede utilizar para producir un formatoCadenael uso de C-comoprintf ()'S especificadores de formato. Laformat ()método tiene la misma forma como seprintf (). Por ejemplo,

Página 3String.Format ("% .1 f", 1.234); / / devuelve String "1.2"String.Format ()Es útil si usted necesita para producir un sencillo formatoCadenapara algunos propósitos (por ejemplo, usado enmétodotoString ()). Por cadena compleja, utiliceStringBuffer/StringBuildercon unFormateador. Si usted simplemente necesitaenviar una cadena con formato simple de la consola, useSystem.out.printf (), Por ejemplo,System.out.printf ("% .1 f", 1.234);2. La cadena es realmente especialCuerdas recibir un tratamiento especial en Java, ya que se utilizan frecuentemente en un programa. Por lo tanto, la eficacia (en términos de

Page 4: Java String es especial.docx

cálculo y almacenamiento) es crucial.Los diseñadores de Java decidió mantener los tipos primitivos en un lenguaje orientado a objetos, en lugar de hacer todo loun objeto, con el fin de mejorar el rendimiento de la lengua. Primitivas se almacenan en la pila de llamadas, que requieren menosespacios de almacenamiento y son más baratos de manipular. Por otra parte, los objetos se almacenan en el montón programa, querequieren una gestión de memoria compleja y más espacios de almacenamiento.Por motivos de rendimiento de JavaCadenaestá diseñado para estar en entre una primitiva y una clase. Las características especiales deCadenaincluyen:La'+'operador, que realiza la adición en primitivas (por ejemplo,intydoble), Se sobrecarga para operarenCadenaobjetos.'+'realizaconcatenaciónparadosCadenaoperandos.Java no soporta la sobrecarga de operadores para el examen de ingeniería de software. En un lenguaje quesoporta la sobrecarga de operadores como C + +, puede activar una'+'operador para realizar una resta, dio como resultadocódigos pobres. La'+'operador es el único operador que está sobrecargado internamente para apoyar cadenaconcatenación en Java. Tome en cuenta que'+'no funciona en cualquiera de los dos objetos arbitrarios, comoPuntos oCírculos.LaCadena

Page 5: Java String es especial.docx

puede ser construido por cualquiera de:1.asignar directamente un literal de cadena a unCadenareferencia - al igual que un primitivo, o2.a través de la "nuevo"Operador y constructor, similar a otras clases. Sin embargo, esto no es comúnmenteutilizado y no se recomienda.Por ejemplo,Cadena str1 = "Java es caliente";/ / Implícito construcción a través de cadena literalCadena str2 = new String ("estoy bien"); construcción / / Explicit través de nuevasEn la primera declaración,str1se declara como unaCadenareferencia y se inicializa con una cadena literal"Java esCaliente ". En la segunda declaración,str2se declara como unaCadenareferencia y se inicializa a través de lanuevooperador yconstructor para contener"Estoy bien".CadenaLos literales se almacenan en un fondo común. Esto facilita la puesta en común de almacenamiento de cadenas con el mismocontenido de conservar almacenamiento.Cadenaobjetos asignados a través denuevooperador se almacenan en la pila, y es allíhay intercambio de almacenamiento para el mismo contenido.Literal de cadena 2,1 vs Objeto String

Page 4Como se ha mencionado, hay dos formas de construir una cadena: la construcción implícita mediante la asignación de una cadena literal o explícitamentela creación de unCadena

Page 6: Java String es especial.docx

objeto a través de lanuevooperador y constructor. Por ejemplo,Cadena s1 = "Hola";/ / Cadena literalString s2 = "Hola";/ / Cadena literalCadena s3 = s1;/ / Misma referenciaCadena s4 = new String ("Hola"); / / Cadena objetoCadena s5 = new String ("Hola"); / / Cadena objetoJava ha proporcionado un mecanismo especial para mantener elCadena- Los literales de cadena en una agrupación llamada común. Si dosliterales de cadena tienen el mismo contenido, compartirán el mismo almacenamiento dentro de la piscina común. Este enfoque esadoptadas para conservar almacenamiento para las cadenas de uso frecuente. Por otra parte,Cadenaobjetos creados a través de lanuevooperador y constructor se mantienen en el montón. CadaCadenaobjeto en el montón tiene su propio almacenamiento como cualquier otroobjeto. No hay una puesta en común de almacenamiento en montón, incluso si dosCadenalos objetos tienen el mismo contenido.Puede utilizar el métodoequals ()de losCadenaclase para comparar el contenido de dosCadenas. Usted puede utilizar eloperador de igualdad relacional'=='para comparar las referencias (o punteros) de dos objetos. Estudie los siguientes códigos:s1 == s1;/ / True, el puntero del mismos1 s2 ==;Share / / true, s1 s1 y almacenamiento en piscina comúns1 s3 ==;/ / True, s3 se asigna mismo puntero como s1s1.equals (s3) / / true, los mismos contenidoss1 == s4;/ / False, punteros diferentess1.equals (s4) / / true, los mismos contenidoss4 s5 ==;

Page 7: Java String es especial.docx

/ / Punteros falsos, diferentes en montóns4.equals (s5); / / true, los mismos contenidosNotas importantes:En el ejemplo anterior, he utilizado el operador de igualdad relacional'=='para comparar las referencias de dosCadenaobjetos. Esto se hace para demostrar las diferencias entre el almacenamiento de intercambio de cadena de literales en el común

Page 5piscina yCadenaobjetos creados en el montón. Se trata de un error lógico utilizar(Cadena1 == cadena2)en su programa depara comparar el contenido de dosCadenas.CadenaSe pueden crear mediante la asignación directa de unCadenaliteral que se comparte en un fondo común. Espoco común y no se recomienda utilizar elnuevooperador construya unaCadenaobjeto en el montón.[TODO] Explicar el métodoString.intern ().2,2 String es inmutableDesde literales de cadena con la cuota de almacenamiento de contenido en el mismo fondo común, JavaCadenaestá diseñado para serinmutable. Es decir, una vezCadenase construye, su contenido no puede ser modificado. De lo contrario, el otroCadenareferencias que comparten la misma ubicación de almacenamiento se verá afectado por el cambio, que puede ser impredecible ypor lo tanto, no es deseable. Métodos tales comotoUpperCase ()podría aparecer para modificar el contenido de unCadenaobjeto. En

Page 8: Java String es especial.docx

hecho, un nuevo completamenteCadenaobjeto se crea y se devuelve a la persona que llama. El originalCadenaobjeto serácancela la asignación, una vez que no hay más referencias, y posteriormente basura recogida.PorqueCadenaes inmutable, no es eficaz usarCadenasi tiene que modificar la cadena de frecuencia (que seríacrear muchos nuevosCadenas ocupando nuevas áreas de almacenamiento). Por ejemplo,/ / Códigos ineficientesString str = "Hola";for (int i = 1; i <1000; i + +) {str str = + i;}Si el contenido de unCadenatienen que ser modificados con frecuencia, utilizar elStringBufferoStringBuilderclase en su lugar.3. StringBuffer y StringBuilderComo se explicó anteriormente,Cadenas son inmutables porqueCadenaliterales con el mismo contenido comparten el mismo almacenamiento en elcadena común de la piscina. Modificación del contenido de unCadenadirectamente puede causar efectos secundarios adversos a otroCadenascompartir el mismo almacenamiento.JDK proporciona dos clases para apoyar mutables cadenas:StringBufferyStringBuilder(En el paquete básicojava.lang).LaStringBuffer

Page 9: Java String es especial.docx

oStringBuilderobjeto es como cualquier objeto ordinario, que se almacenan en el montón y nocompartido, y por lo tanto, puede ser modificada sin causar efecto secundario adverso a otros objetos.StringBuilderclase fue introducida en JDK 1.5. Es el mismo queStringBufferclase, excepto que seStringBuilderesno sincronizado para operaciones multi-hilo. Sin embargo, para el programa de un solo hilo,StringBuilder, Sinsobrecarga de sincronización, es más eficiente.3,1 java.lang.StringBufferLea la especificación API del JDK parajava.lang.StringBuffer./ / ConstructoresStringBuffer ()/ / Un StringBuffer inicialmente vacíaStringBuffer (int size)/ / Con el tamaño inicial especificadoStringBuffer (String s)/ / Con el contenido inicial especificado/ / Longitud

Página 6int length ()/ / Métodos para incrementar el contenidoStringBuffer append (tipo arg) / / tipo podría ser primitivas, char [], String, StringBuffer, etcStringBuffer insert (int offset, arg)/ / Métodos para manipular el contenido deStringBuffer delete (int inicio, int fin)DeleteCharAt StringBuffer (int index)setLength vacío (int newSize)setCharAt vacío (int index, char newChar)StringBuffer replace (int inicio, int fin, String s)Inversa StringBuffer ()/ / Métodos para extraer todo / parte de los contenidoscharlas charAt (int index)Cadena substring (int inicio)Subcadena String (int inicio, int fin)String toString ()/ / Métodos para la búsquedaint indexOf (String SearchKey)int indexOf (String SearchKey, int fromIndex)

Page 10: Java String es especial.docx

int lastIndexOf (String SearchKey)int lastIndexOf (String SearchKey, int fromIndex)Tome en cuenta queStringBufferEs un objetivo común. Es necesario utilizar un constructor para crear unStringBuffer(En lugarde asignar a unCadenaliteral). Además,'+'operador no se aplica a los objetos, incluyendo elStringBuffer.Es necesario utilizar un método apropiado tal comoappend ()oinsert ()para la manipulación de unStringBuffer.Para crear una cadena de piezas, es más eficaz utilizarStringBuffer(Multi-hilo) oStringBuilder(Un solo hilo)en lugar de a través deCadenaconcatenación. Por ejemplo,/ / Se crea una cadena de AAAA-MM-DD HH: MM: SSint year = 2010, mes = 10, día = 10;int hora = 10, = 10 minutos, segundos = 10;Cadena datestr = new StringBuilder ()

Page 7.. Append (año) append ("-").. Append (mes) append ("-").. Append (día) append ("")..... Append (hora) y append (":") append (minutos) y append (":") append (segundo) toString ();.System.out.println (datestr);/ / StringBuilder es más eficiente que la concatenación de cadenasCadena anotherDataStr = año + "-" + mes + "-" + dia + "" + hora + ":" + minutos + ":" + segundo;System.out.println (anotherDataStr);JDK compilador, de hecho, utiliza tantoCadenayStringBufferpara manejar la concatenación de cadenas a través de la'+'

Page 11: Java String es especial.docx

operador. Paraejemplos,Cadena msg = "a" + "b" + "c";serán compilados en los siguientes códigos para una mejor eficiencia:... Cadena msg = new StringBuffer () append ("a") append ("b") append ("c") toString ().;Dos objetos se crean durante el proceso, un compuesto intermedioStringBuffery el objeto devueltoCadenaobjeto.Regla de oro:Cadenas son más eficientes si no se modifican (porque son compartidos en la cadenapiscina común). Sin embargo, si tiene que modificar el contenido de una cadena con frecuencia (como un mensaje de estado), usteddebe utilizar elStringBufferclase (o laStringBuilderse describe a continuación) en su lugar.3,2 java.lang.StringBuilder (JDK 1.5)JDK 1.5 introdujo un nuevoStringBuilderclase (en el paquetejava.lang), Que es casi idéntica a laStringBufferclase, excepto que no está sincronizado. En otras palabras, si varios subprocesos tienen acceso aStringBuilderejemplo enal mismo tiempo, su integridad no se puede garantizar. Sin embargo, para un programa de un solo hilo (el más común), haciendode distancia con la sobrecarga de sincronización hace que elStringBuildermás rápido.StringBuilderes API-compatible con elStringBufferclase, es decir, que tiene el mismo conjunto de constructores y métodos,pero sin ninguna garantía de sincronización. Puede ser un reemplazo drop-in paraStringBufferbajo un solo hiloambiente.3.3 Cadena de Benchmarking / StringBuffer / StringBuilderEl siguiente programa compara los tiempos tomados para revertir una cadena larga a través de unCadenay un objeto

Page 12: Java String es especial.docx

StringBuffer.1234567891011/ / Invertir una cadena larga a través de una cadena frente a un StringBufferpublic class {StringsBenchMarkpublic static void main (String [] args) {beginTime largo, elapsedTime;/ / Crea una cadena largaCadena str = "";int size = 16536;char ch = 'a';beginTime System.nanoTime = ();/ / Referencia de tiempo en nanosegundosfor (int cuenta = 0; contador <tamaño, recuento + +) {

Page 8121314151617181920212223242526272829303132

Page 13: Java String es especial.docx

33343536373839404142434445464748495051525354555657str + = ch;ch + +;if (ch> 'z') {ch = 'a';}}elapsedTime System.nanoTime = () - beginTime;System.out.println ("Tiempo transcurrido" + elapsedTime/1000 + "us (String Build)");/ / Invertir una cadena mediante la construcción de otra cadena carácter por carácter en el orden inversoCadena StrReverse = "";beginTime System.nanoTime = ();for (int pos = str.length () - 1; pos> = 0; pos -) {StrReverse + = str.charAt (pos);/ / Concatenar}elapsedTime System.nanoTime = () - beginTime;System.out.println ("Tiempo transcurrido" + elapsedTime/1000 + "us (Usando Stringrevertir) ");/ / Invertir una cadena a través de un StringBuffer vacío añadiendo caracteres en orden inversobeginTime System.nanoTime = ();StringBuffer sBufferReverse = new StringBuffer (tamaño);

Page 14: Java String es especial.docx

for (int pos = str.length () - 1; pos> = 0; pos -) {sBufferReverse.append (str.charAt (pos));/ / Anexar}elapsedTime System.nanoTime = () - beginTime;System.out.println ("Tiempo transcurrido" + elapsedTime/1000 + "us (Uso de StringBuffer pararevertir) ");/ / Invertir una cadena mediante la creación de un StringBuffer con la cadena dada e invocar sureverse ()beginTime System.nanoTime = ();StringBuffer sBufferReverseMethod = new StringBuffer (str);sBufferReverseMethod.reverse ();/ / Utilizar método reverse ()elapsedTime System.nanoTime = () - beginTime;System.out.println ("Tiempo transcurrido" + elapsedTime/1000 + "us (Uso de StringBufferreverse () method) ");/ / Invertir una cadena a través de un StringBuilder vacío añadiendo caracteres en orden inversobeginTime System.nanoTime = ();StringBuilder sBuilderReverse = new StringBuilder (tamaño);for (int pos = str.length () - 1; pos> = 0; pos -) {sBuilderReverse.append (str.charAt (pos));}elapsedTime System.nanoTime = () - beginTime;System.out.println ("Tiempo transcurrido" + elapsedTime/1000 + "us (Usando StringBuilder para

Página 95859606162revertir) ");/ / Invertir una cadena mediante la creación de un StringBuilder con la cadena dada e invocar sureverse ()beginTime System.nanoTime = ();StringBuffer sBuilderReverseMethod = new StringBuffer (str);sBuilderReverseMethod.reverse ();elapsedTime System.nanoTime = () - beginTime;System.out.println ("Tiempo transcurrido" + elapsedTime/1000 + "us (Uso de StringBuidlerreverse () method) ");}}El tiempo transcurrido es 332100 us (Build String)El tiempo transcurrido es 346639 us (Uso de cuerdas para invertir)El tiempo transcurrido es usec 2028(Uso de StringBuffer para invertir)El tiempo transcurrido es 847 useg

Page 15: Java String es especial.docx

(Utilizando el método de la inversa StringBuffer ())El tiempo transcurrido es 1092 usec(El uso StringBuilder para invertir)Tiempo transcurrido 836 useg (Utilizando el método de StringBuidler reverse ())ObservarStringBuilderes de 2 veces más rápido queStringBuffer, Y 300x más rápido queCadena. Lareverse ()método es elmás rápido, que toma aproximadamente al mismo tiempo paraStringBuilderyStringBuffer.4. java.util.StringTokenizerMuy a menudo, usted necesita para romper una línea de texto en tokens delimitados por espacios en blanco. Lajava.util.StringTokenizerclase admite esto.Por ejemplo, el siguiente programa invierte las palabras de una cadena./ / Invertir las palabras en una cadena utilizando StringTokenizerimportar java.util.StringTokenizer;público StringTokenizerTest clase {public static void main (String [] args) {String str = "Lunes Martes Miércoles Jueves Viernes Sábado Domingo";Cadena StrReverse;StringBuilder sb = new StringBuilder ();StringTokenizer st = new StringTokenizer (str);mientras que (st.hasMoreTokens ()) {sb.insert (0, st.nextToken ());si (st.hasMoreTokens ()) {

Page 10sb.insert (0, "");}}StrReverse sb.toString = ();System.out.println (StrReverse);}}/ / ConstructoresStringTokenizer (String s) / / Construye un StringTokenizer para la cadena dada,/ / Usar el delimitador predeterminado conjunto de "\ t \ n \ r \ f"

Page 16: Java String es especial.docx

/ / (Es decir, en la ficha en blanco, nueva línea, retorno de carro y avance de página-)./ / Los caracteres delimitadores mismos no serán tratados como fichas.StrintTokenizer (String s, String delimiterSet) / / Usar caracteres delimiterSet como delimitadores./ / MétodoshasNextToken booleano ()/ / Devuelve true si muestra disponible siguienteCadena nextToken ()/ / Devuelve el siguiente token/ / Código de ejemploStringTokenizer tokenizer = new StringTokenizer (aString);mientras que (tokenizer.hasNextToken ()) {Cadena token = tokenizer.nextToken ();.....}La documentación JDK afirmó que "StringTokenizeres una clase heredada que se mantiene por razones de compatibilidadaunque su uso no se recomienda en el nuevo código. Se recomienda que cualquier persona que quiera utilizar la funcionalidad de estesplit ()método deCadenao lajava.util.regexpaquete en su lugar. "Por ejemplo, el siguiente programa utiliza el método split () de la clase String para revertir las palabras de una cadena./ / Invertir las palabras en una cadena con split () método de la cadena s claspúblico StringSplitTest clase {public static void main (String [] args) {String str = "Lunes Martes Miércoles Jueves Viernes Sábado Domingo";String [] tokens = str.split ("\ \ s"), el espacio / / blanco '\ s' como delimitador

Page 11StringBuilder sb = new StringBuilder ();for (int i = 0; i <tokens.length, i + +) {sb.insert (0, fichas [i]);if (i <tokens.length - 1) {sb.insert (0, "");}}Cadena StrReverse = sb.toString ();System.out.println (StrReverse);}}