2011-06-24 11 views
7

Mi opinión fue, hasta hoy, que un literal como "c" crea un objeto String. Hoy escuché que Java no está creando un objeto para cadenas de caracteres individuales. ¿Es esto correcto? ¿Almacena ese literal como char?Cadena de un solo carácter

+3

¿Has oído hablar? ¿Has oído dónde? – bmargulies

+0

Este sería un concepto interesante de auto-boxing/unboxing de un solo carácter Cadena a un 'char' ... – Nick

+0

Dile a la persona que te dijo que lea la parte sobre los literales en la Especificación del lenguaje Java. Literales de personajes y literales de cadenas: http://java.sun.com/docs/books/jls/second_edition/html/lexical.doc.html#100960 –

Respuesta

5

es String literal. Representa un String al igual que "foo" representa un String.

No existe un tratamiento especial de literales de un solo carácter String (ni siquiera del 0-letter String literal "").

Quienquiera que le haya dicho que se trata de manera diferente, fue a) equivocado o b.) Hablando de algo diferente (una biblioteca que tiene un tratamiento especial, por ejemplo).

8

"c" creará una cadena. 'c' creará un char

13

No, está mal. Incluso "", crea un objeto String. Sin embargo, si escribe 'c', tiene un objeto char y no String.

6

Java crea una instancia de una cadena incluso para una cadena de caracteres única. Las siguientes impresiones: java.lang.String

public class Test{ 
    public static void main(final String[] args){ 
     System.out.println("c".getClass().getName()); 
    } 
} 
+0

Sí, obviamente, devuelve cadena porque '" "' (comillas dobles) es para cadenas y '''' (comillas simples) es para caracteres – Woot4Moo

1

"c" sí crea un objeto. Sin embargo, si asigna el literal nuevamente en algún lugar del código fuente, no creará un nuevo objeto, sino que hará referencia al primer objeto de cadena creado.

Por ejemplo:

String s1 = "abc"; //creates the String object 
String s2 = "abc"; //references the same object as s1 

Tanto S1 y S2 están asignados al mismo objeto, y == funcionaría.

Puede leer más aquí: http://javatechniques.com/blog/string-equality-and-interning/

+0

Incorrecto. == solo funcionaría si usaras String.intern – Woot4Moo

+0

@ Woot4Moo no, eso es cierto. Las cadenas literales son internalizadas por defecto. – sfussenegger

+0

@ Woot4Moo see https://gist.github.com/1044768 – sfussenegger

1

Tal vez lo que quería decir era que se crean el debajo de la capucha flyweights (¡no sé cómo funciona esto con Java, pero suponen que este concepto se employeed en algún nivel para cuerdas)

+0

que es cierto para algunas operaciones, a saber, subcadena (..), subSecuencia (..) y recorte(), donde la Cadena resultante usará el mismo carácter [] debajo del capó. Sin embargo, no veo cómo esto podría afectar los literales de cadenas. – sfussenegger

0

String almacena los caracteres como un char[], lo que muy probablemente "c" se representarán como new char[] { 'c' } dentro del objeto String.

Dado que la clase String es final, significa que no hay una subclase que almacene cadenas de un solo carácter en un campo char c.

Además, no existe el concepto de auto-boxing/unboxing para un solo carácter String a char - por lo que se documenta, por lo que es seguro asumir Cuerdas de un solo carácter se almacenan similar a cualquier otro tipo de de String.

0

Como con la mayoría de las cosas en la programación, busque en la fuente -> java.lang.String.

Todas las cadenas son instancias de java.lang.String no hay ningún caso especial. Cada java.lang.String incluye un char [] y algunos enteros para contener los índices de inicio y fin.Tenga en cuenta que el carácter char [] se comparte entre las instancias de Strign, como cuando se hace String.substring(), el carácter original [] no se clona o se copia, sino que se actualizan los índices de inicio/finalización.

Cuestiones relacionadas