Zeby jeszcze bardziej poszerzyc. Na stosie laduja typy proste (int, float, double). I kazda zmienna ma swoje miejsce na stosie. JEDNAK. Jezeli zadeklarujesz np. int liczba1 = 1 oraz int liczba2 = 1, to powstaje referencje do pierwotnego inta w celu oszczedzenia pamieci, czyli te dwa inty bede znajdowaly sie w tym samym miejscu w pamieci. Idac dalej, uzywajac porownania "==" nie porownujemy czy dana wartosc jednej zmiennej jest taka sama jak wartosc drugiej, tylko czy referencje sa takie same.
Teraz troche o stercie. Przechowuje ona typy zlozone (String, Array, Object itd). Przechowuje ona rowniez zmienne statyczne (ktore sa inicjalizowane przy starcie programu i od razu trafiaja do pamieci, zmienne dynamiczne natomiast trafia do pamieciu w momencie odpalenia klasy).
Waznym elementem sterty jest tez StringPool. Jest roznica pomiedzy String s = "kot" a String s1 = new String("kot"). Zmienne lancuchowe bez slowka new trafiaja wlasnie do StringPoola (tutaj ta sama zaleznosc jak z przykladem z intami, ze o tej samej wartosci trafia do tego samego miejsca w StringPool'u). Jezeli uzyjemy slowka new to przydzielimy nowe miejsce w pamieci (stercie).