2011-01-04 26 views
10

Duplicar posible:
storing primitive values in a java collection?Colecciones de Java. ¿Por qué no hay tipos primitivos?

Mi libro de texto dice Java elementos de una colección, por ejemplo ArrayList, no pueden ser tipos primitivos. ¿Hay alguna razón para esto? Quiero decir, ¿alguien en Sun decidió sobre esto o hay alguna barrera en contra de hacerlo? Entiendo que mi ejemplo responde a medias mi pregunta, ya que ArrayList requiere un objeto y las primitivas no son objetos. Pero luego pienso por qué no pueden tener tipos primitivos también?

Respuesta

2

Existen objetos llamados "envoltorios" que representan todos los tipos primitivos. Por ejemplo, hay una clase llamada Integer que admite int. Puede usar envoltorios primitivos para contener valores en una Colección.

El problema con los tipos primitivos (al menos hasta Java 5) es que no se extendían desde la clase base Object. Todas las colecciones deben especificar una clase para todos los métodos que están usando, y especifican Object, ya que Object es la base de todas las clases.

A partir de Java 5, encontrará que Java cambiará implícitamente entre una primitiva y su correspondiente clase contenedora cuando la necesite. Esto significa que puede agregar un int, o un double, etc. a una Colección. La VM automáticamente envolverá la primitiva en una clase contenedora y colocará la envoltura en la Colección.

+6

"El problema con los tipos primitivos (al menos hasta Java 5)" ... y versiones posteriores también. Aunque ahora existe el auto-boxing, todavía no existe una clase base común para los tipos primitivos. –

5

Almacenamiento articulo primitivas complicaría considerablemente el código de colecciones. Mientras que con las envolturas (Integer para int, etc.), el código es bastante directo. Desde hace varios años, Java admite "auto-boxing", lo que significa que si proporciona int donde se espera Integer, el int se entrega en una instancia Integer (y viceversa).

1

Lea este artículo en la wikipedia. Podría ayudar: http://en.wikipedia.org/wiki/Object_type_(object-oriented_programming)#Autoboxing

En informática, un tipo de objeto (objeto alias envolver) es un tipo de datos que se utiliza en la programación orientada a objetos para envolver un tipo no-objeto a hacer que parezca un objeto dinámico.

Algunas de programación lenguajes orientados a objetos hacer una distinción entre tipos de referencia y de valor, a menudo referido como objetos y no objetos en plataformas donde no existen tipos de valores complejos , por razones tales como tiempo de ejecución Eficiencia y sintaxis o cuestiones semánticas. Por ejemplo, Java dispone de clases primitivas envoltura correspondientes a cada tipo primitivo: Entero y int, el carácter y Char, flotador y el flotador, etc. Lenguajes como C++ tienen poca o ninguna noción de tipo de referencia; por lo tanto, el uso del tipo de objeto es de poco interés.

boxeo es el proceso de colocar un tipo primitivo dentro de un objeto de modo que la primitiva se puede utilizar como un objeto referencia. Por ejemplo, las listas pueden tener ciertos métodos que las matrices pueden no tener, pero la lista también podría requerir que todos sus miembros sean objetos dinámicos . En este caso, la funcionalidad agregada de la lista podría no estar disponible para un simple conjunto de números . Para un ejemplo más concreto, en Java, LinkedList puede cambiar su tamaño , pero una matriz debe tener un tamaño fijo de . Uno podría desear tener un LinkedList de entradas, pero la clase LinkedList solo enumera las referencias a los objetos dinámicos - no puede enumerar los tipos primitivos , que son tipos de valores.

Para evitar esto, enteros puede en caja en enteros, que son dinámicos objetos, y después se añadió a una LinkedList de números enteros. (Usando genéricos tipos parametrizados introducidas en J2SE 5.0, este tipo se representa como LinkedList.) Por otro mano, C# no tiene envoltura primitiva clases, pero permite el boxeo de cualquier tipo valor, devolviendo un genérico Referencia a objeto .

El objeto en la caja es siempre una copia de el objeto de valor, y suele ser inmutable. Al desempaquetar el objeto también se devuelve una copia del valor almacenado. de forma reiterada, el boxeo y unboxing de objetos puede tener un grave impacto rendimiento, ya que dinámicamente asigna nuevos objetos y luego los hace elegibles para basura colección.

7

¿hay algún tipo de barrera contra de hacer que ?

Puede escribir versiones casi idénticas de ArrayList que fueron hechas a medida para almacenar uno de los tipos que no son de clase, p. IntegerArrayList y así sucesivamente. La barrera contra esto es que habría una explosión de tales clases, ya que multiplicaría el número de tipos primitivos por el número de tipos de colección. Para mantener el marco de recopilación estándar manejable, esto se descartó.

Para resolver esto de forma más clara en el lenguaje, necesitaría genéricos para permitir que los tipos primitivos sirvan como parámetros de tipo, y mejorar la interacción entre arrays y genéricos.

0

El problema de rendimiento es uno de los problemas ya que necesitamos el auto-boxeo para lograrlo. También algunas de las estructuras pueden beneficiarse de tener valores nulos también.

1

Actualmente, la única manera de almacenar primitivos directamente en una colección, es tener una colección para cada tipo primitivo, p. TIntArrayList.

Es probable que descubra que a pesar de que ArrayList es más lento que el uso de primitivas, es lo suficientemente rápido para el 90% de casos de uso.

Cuestiones relacionadas