Array Deklaration

  • Themenstarter Themenstarter Ante
  • Beginndatum Beginndatum
A

Ante

Gast
Nabend,

ich habe eine Frage zu den verschiedenen Array Deklarationen.
Java:
public class ArraySachen{

	public static void main(String[] args){
	
	int[] ListeA = {1,2,3,4,5};
	
	int[] ListeB = new int[5];

	ListeB[0] = 1;
	ListeB[1] = 2;
	ListeB[2] = 3;
	ListeB[3] = 4;
	ListeB[4] = 5;

	}
}

ich habe mir nun etwa Folgendes zusammengegoogelt.
ListeA:
Das gesamte Array wird auf dem Java-Stack abgelegt.

ListeB:
Das Array ist ein "normales" Objekt, und wird auf dem Java-Heap abgelegt.

Ist dies so richtig? Gibt es noch andere Unterschiede zwischen diesen beiden Arten der Array-Erstellung?

Vielen Dank für alle Antworten schon jetzt.
Ante
 
Hhm, beides ist ein "normales" Objekt und müsste dentsprechend gleich gespeichert werden.

Grüßle

PS: Variablennamen beginnen laut Konvention mit einem Kleinbuchstaben.
 
Für dich als Programmierer gibt es absolut überhaupt keinen Unterschied, der Byte-Code ist tatsächlich verschieden
Java:
0  iconst_5
     1  newarray int [10]
     3  astore_1 [listeA]
     4  aload_1 [listeA]
     5  iconst_0
     6  iconst_1
     7  iastore
     8  aload_1 [listeA]
     9  iconst_1
    10  iconst_2
    11  iastore
    12  aload_1 [listeA]
    13  iconst_2
    14  iconst_3
    15  iastore
    16  aload_1 [listeA]
    17  iconst_3
    18  iconst_4
    19  iastore
    20  aload_1 [listeA]
    21  iconst_4
    22  iconst_5
    23  iastore
und
Java:
    0  iconst_5
     1  newarray int [10]
     3  dup
     4  iconst_0
     5  iconst_1
     6  iastore
     7  dup
     8  iconst_1
     9  iconst_2
    10  iastore
    11  dup
    12  iconst_2
    13  iconst_3
    14  iastore
    15  dup
    16  iconst_3
    17  iconst_4
    18  iastore
    19  dup
    20  iconst_4
    21  iconst_5
    22  iastore
    23  astore_1 [listeA]
 
Und generell ist es nicht schlau, Dingen Namen zu geben, die falsche Annahmen zu ihrem Inhalt suggerieren. Du hast da zwei Arrays, nicht zwei Listen. Ist für das Beispiel völlig egal, aber generell finde ich sowas schon wichtig, wobei es da eher darauf ankommt, zu beschreiben, was "darin" ist und weniger, in welcher Form. Aber eine falsche Form sollte man nicht benennen.
 
Und falls es noch interessant ist: Für die Frage, ob Daten auf dem Stack oder dem Heap abgelegt werden, ist der Datentyp unerheblich. Vielmehr spielt es eine Rolle, wo die entsprechende Variable deklariert wurde. Grob gesagt sieht das so aus: Alle methodenlokalen Variablen (also die Parameter einer Methode plus ggf. innerhalb der Methode deklarierte Variablen) landen auf dem Stack. Alles andere auf dem Heap.

Ergo, beide Arrays aus Deinem Beispielcode landen auf dem Stack, weil sie innerhalb einer Methode (main) deklariert wurden.
 
Zuletzt bearbeitet von einem Moderator:
Ergo, beide Arrays aus Deinem Beispielcode landen auf dem Stack, weil sie innerhalb einer Methode (main) deklariert wurden.

Das stimmt so nicht ganz. Lokale Variablen in Methoden liegen immer auf den Stack. In diesem Fall wären das dann die Referenzen auf die erzeugten int[]-Objekte. Ob ein Objekt auf dem Stack oder Heap abgelegt wird entscheidet erst der JIT-Compiler zur Laufzeit. (Sitchwort EscapeAnalysis)
Ob ein Objekt auf dem Stack oder Heap erzeugt wird hat in Java btw so gut wie garkeinen Performanceunterschied, da der Heap normalerweise in Bezug auf die Objekterzeugung wie ein Stack verwaltet wird. Einen Vorteil der Stackallocation gibt es nur im GC da dort ein paar Objekte weniger geprüft werden müßen.
 
Lumaraf hat gesagt.:
nillehammer hat gesagt.:
Ergo, beide Arrays aus Deinem Beispielcode landen auf dem Stack, weil sie innerhalb einer Methode (main) deklariert wurden.
Das stimmt so nicht ganz. Lokale Variablen in Methoden liegen immer auf den Stack. In diesem Fall wären das dann die Referenzen auf die erzeugten int[]-Objekte.
Genau das, was ich auch geschrieben hab. Nur mit anderen Worten. Stimmt's also doch ganz?
Lumaraf hat gesagt.:
Ob ein Objekt auf dem Stack oder Heap abgelegt wird entscheidet erst der JIT-Compiler zur Laufzeit. (Sitchwort EscapeAnalysis)
Nach meinem Verständnis geht es bei Escape Analysis um Ablaufpfade und die Frage, ob Kopien von Objekten erstellt werden müssen oder nicht. Ob eine Variable auf dem Stack oder Heap landet, wird davon nicht tangiert. Java HotSpot Virtual Machine Performance Enhancements (leider sehr oberflächlich). Kann mich aber auch irren. Ergänzende Infos wären nett.
Lumaraf hat gesagt.:
Ob ein Objekt auf dem Stack oder Heap erzeugt wird hat in Java btw so gut wie garkeinen Performanceunterschied,
Bei dem Halbsatz stimme ich Dir zu. Ist eher eine akademische Diskussion. Aber kann deswegen trotzdem interessant sein.
 

Neue Themen


Zurück
Oben