2011-01-04 29 views
10

Powiel możliwe:
storing primitive values in a java collection?Kolekcje Java. Dlaczego nie ma typów pierwotnych?

podręcznik My Java mówi elementy kolekcji, na przykład ArrayList, nie może być prymitywne typy. Czy istnieje ku temu powód? Chodzi mi o to, czy ktoś z Sun o tym zadecydował, czy jest jakaś przeszkoda przeciwko temu? Rozumiem, że mój przykład w połowie odpowiada na moje pytanie, ponieważ ArrayList wymaga obiektu, a prymitywy nie są obiektami. Ale potem myślę, dlaczego oni też nie mają prymitywnych typów?

Odpowiedz

2

Istnieją obiekty zwane "owijkami", które reprezentują wszystkie typy pierwotne. Na przykład istnieje klasa o nazwie Integer, która obsługuje int. Możesz wykorzystać prymitywne opakowania do przechowywania wartości w kolekcji.

Problem z typami pierwotnymi (przynajmniej do wersji Java 5) polega na tym, że nie rozciągały się one od klasy podstawowej Object. Wszystkie kolekcje muszą określać klasę dla wszystkich metod, których używają - i określają one Object, ponieważ Object jest podstawą wszystkich klas.

Od wersji 5 program Java domyślnie przełącza się między prymitywną i odpowiadającą jej klasą opakowania, gdy jej potrzebujesz. Oznacza to, że możesz dodać kolekcję int lub double itd. Maszyna wirtualna automatycznie opakuje prymityw w klasę opakowania i umieści opakowanie w kolekcji.

+6

"Problem z typami pierwotnymi (przynajmniej do wersji Java 5)" ... i nowsze wersje również. Chociaż istnieje teraz auto-boxing, wciąż nie ma wspólnej klasy bazowej dla typów pierwotnych. –

5

przechowywania nieopakowanej prymitywów byłoby znacznie skomplikować kod kolekcji. Natomiast w opakowaniach (Integer dla int itp.) Kod jest dość prosty. Od kilku lat Java obsługuje "auto-boxing", co oznacza, że ​​jeśli podasz , gdzie oczekiwany jest Integer,jest zawinięty w instancję Integer dla Ciebie (i na odwrót).

1

Przeczytaj ten artykuł na wikipedii. To może pomóc: http://en.wikipedia.org/wiki/Object_type_(object-oriented_programming)#Autoboxing

W informatyce typ obiektu (object aka owijania) jest typem danych który jest wykorzystywany w programowaniu obiektowym zawinąć typu non-object aby wyglądać jak obiekt dynamiczny.

Niektóre obiektowych języków programowania dokonać rozróżnienia między odniesienia i wartości typów, często dalej obiektów i innych obiektów na platformach gdzie nie istnieją złożone typy wartości , z powodów takich jak starcie wydajność i składnia lub problemy semantyczne. Na przykład, Java ma prymitywne klasy otoki odpowiadające każdego rodzaju prymitywnego: całkowitą i int, charakter i char pływaka i pływak itp językach takich jak C++ mają niewielkie lub żadne pojęcie typu odniesienia; w związku z tym użycie obiektu typu jest mało interesujące.

Boks jest proces umieszczania pierwotnych w obiekcie tak że pierwotna może być używany jako przedmiot odniesienia. Na przykład listy mogą mieć pewne metody, które mogą być niedostępne dla tablic , ale lista może również wymagać, aby wszystkie jej elementy były obiektami dynamicznymi. W takim przypadku dodana funkcja listy może być niedostępna dla prostej tablicy . Aby uzyskać bardziej konkretny przykład, w języku Java, LinkedList może zmienić jego rozmiar , ale tablica musi mieć ustalony rozmiar . Ktoś mógłby chcieć mieć LinkedList typu int, ale klasa LinkedList wyświetla listę odwołań tylko do obiektów dynamicznych - nie może zawierać list pierwotnych typów , które są typami wartości.

W tym celu ominięcia typu int mogą być zapakowane do liczby całkowite, które mają charakter dynamiczny przedmioty, a następnie dodaje się do LinkedList liczb całkowitych. (Korzystanie z generycznych parametryzowane typy wprowadzonych w J2SE 5.0, ten typ jest reprezentowany jako LinkedList.) Z drugiej strony, C# nie ma prymitywne opakowanie klas, ale pozwala boks dowolnego typu wartości, wracając obiektu ogólnego odniesienia.

Obiekt w pudełku jest zawsze kopią obiektu o wartości i jest zwykle niezmienny w postaci . Po rozpakowaniu obiektu również zwraca kopię zapisanej wartości. Należy pamiętać, że wielokrotne boksowanie i rozpakowywanie obiektów może mieć poważny wpływ na wydajność, ponieważ dynamicznie przydziela nowe obiekty i , a następnie kwalifikuje je do kolekcji Garbage .

7

jest jakiś bariera przeciwko robi to?

Można napisać niemal identyczne wersje ArrayList, które zostały dostosowane do przechowywania jednego z typów nieklasowanych, np. IntegerArrayList i tak dalej. Barierą tego jest to, że nastąpiłaby eksplozja takich klas, ponieważ liczba typów pierwotnych pomnożyłaby się przez liczbę typów kolekcji. Aby zachować standardowy system zbierania, było to wykluczone.

Aby rozwiązać ten problem dokładniej w języku, trzeba generycznych, aby umożliwić typom pierwotnym służyć jako parametry typu i poprawić interakcję między tablicami i rodzajami.

0

Problem z wydajnością jest jednym z problemów, ponieważ potrzebujemy auto-boxingu, aby to osiągnąć. Niektóre struktury mogą również korzystać z wartości zerowych.

1

Obecnie jedynym sposobem przechowywania primtives bezpośrednio w kolekcji jest posiadanie kolekcji dla każdego typu pierwotnego, np. TIntArrayList.

Prawdopodobnie odkryjesz, że pomimo, że ArrayList jest wolniejszy niż użycie prymitywów, jest wystarczająco szybki dla 90 +% przypadków użycia.

Powiązane problemy