Mapy w JAVA

0

Witam, jak zdefiniować mapę w "Jawie"? Zauważyłem coś dziwnego, mianowicie trzeba zawsze na początku dać new, nie można utworzyć zmiennej typu mapowego jak w C++. Na dodatek w mapie trzeba też pisać Integer a już int nie wchodzi. Jak to z tym jest? Chcę w klasie stworzyć zmienną mapową

map <char, TObj> costam; //bez = new HashMap...

Pozdrawiam

0

Primo, Java to nie C++.

Secundo, w Javie jest wymazywanie typów, tzn Map[A, B] istnieje tylko na etapie kompilacji, po kompilacji zostaje gołe Map (czyli mapa obiektów w obiekty ogólnie) + wstawione przez kompilator w odpowiednie miejsca rzutowania. int, char i inne prymitywy nie dziedziczą po java.lang.Object i dlatego nie da się nimi sparanetryzować niczego w Javie. Tablice czegokolwiek natomiast dziedziczą po Object i da się nimi sparametryzować.

0

Zrozumiałem tylko tyle że nie ma map. Trochę to dziwne bo teraz muszę zastąpić je np. listą i przy dostępie do konkretnego elementu muszę jechać po całej liście i mamy już słabą optymalizację...

0

@MateuszS praktycznie wszystko w javie jest przechowywane na stercie, więc wszystko musisz tworzyć za pomocą operatora new. Parametryzować możesz tylko klasami, int czy char klasami nie są.
OMG jak to "nie ma map"? Ty sobie robisz jaja czy jak? Są mapy i jest ich znacznie więcej niż w C++. Ale musiałbyś najpierw zerknąć do dokumentacji żeby zobaczyć JAK się ich używa, a nie kopiować kod z C++ i się dziwić że nie działa...

Może łaskawie zaczniesz się uczyć języka skoro chcesz w nim pisać? W javie nie można tworzyć pól klasy (oprócz prymitywów) w taki sposób jak w C++, musisz gdzieś mieć ręcznie przydzieloną pamięć na dany obiekt i już. Nie wiem zresztą w czym ci to przeszkadza, skoro i tak jest GC i nie musisz się martwić usuwaniem tych obiektów.

0

Ale jak to nie ma map? java.util.Map[A, B] to w Javie interfejs, a nie da się stworzyć instancji interfejsu bez podania implementacji.

map z C++ można mniej więcej porównać do TreeMap z Javy, a unordered_map z C++ można porównać do HashMap z Javy. Z tym, że w Javie jest ładne dziedziczenie, a w C++ raczej nie.

0

Właśnie się uczę języka. W praktyce. No dobra, nawet jak są mapy to jak mam je użyć tak żeby osiągnąć efekt z C++?

0

Zmienne w Javie są albo prymitywem albo referencją. Mapa nie jest prymitywem, więc zmienna typu map jest referencją i trzeba ją zainicjować.

Ogólnie taka konstrukcja z Javy:

typ nazwa;

gdzie typ instanceof Object może być przetłumaczona na C++ w mniej więcej ten sposób:

typ &nazwa;

z tym, że te referencje w Javie nie są stałe domyślnie (tzn bez final można je zmieniać).

0

@MateuszS aż mi słabo jak widzę twoją "naukę".

class A{
  Map<Integer,String> mapa = new HashMap<Integer,String>();

}

To jest mniej więcej to samo co w C++:

class A{
  map<int,string> mapa;
};

Przynajmniej powinno mniej więcej działać tak samo.

0

Tak, to wyczytałem z dokumentacji i to działa, tylko byłem ciekaw dlaczego - w C++ by to nie przeszło a przecież wygodniej jest zrobić jak w C++. Wiem że na pewno był ku temu jakiś powód a Java to nie C++ ale mi tłumaczono że Java jest wygodniejsza i przyjemniejsza stąd moje wątpliwości. No tylko jest jeden problem bo nie działa to dla charów.

0

Mapa mapuje referencję obiektu na referencję obiektu. char jest typem prymitywnym i jak powyżej widzisz istnieje jego klasowa reprezentacja. Kolejne ważne z tym pojęcie to autoboxing, odpowiadające na pytania które zaraz będziesz (powinieneś) mieć: http://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html

1
Shalom napisał(a):

"Boże widzisz, a nie grzmisz"...

Stary wyluzuj trochę...
Dzięki za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1