Wie kann ich in Java eine Klasse mit int Arrayattribut erstellen, sodass abhängig von den Konstruktorargumenten das Array eine individuelle Größe hat?
Geht das überhaupt? Dass das Array flexibel groß ist?
Mein Problem ist:
Wenn ich nicht von vorneherein
int arr = new int[10] geschrieben habe, also nicht von vorneherein die Größe mitgegeben habe, hatte ich immer das Problem, dass arr = null war und ich somit nicht mit dem Array arbeiten konnte, also z.B. es befüllen oder so mithilfe von Methoden.
Ich könnte jetzt von vorneherein eine Größe mitgeben, aber ich soll z.B. eine Methode getLength() implementieren. Die macht ja keinen Sinn, wenn die Größe von vorneherein feststeht...
Deshalb: Wie kann ich das programmieren, dass wenn der man im Konstruktor angibt, wie groß das Array sein soll, dass es dann diese Größe hat?
lg Kath
wozu ein array? in den allermeisten fällen sollte man eher nh liste benutzen
in der aufgabenstellung steht ich soll n Array machen und das quasi wie ne Liste implementieren...
2 Antworten
Arrays mit individueller bzw. dynamischer Größe gibt es nicht in Java.
Nutze stattdessen ArrayList. Diese Klasse übernimmt das "dynamische" Neuerstellen des Arrays im Hintergrund, je nachdem, wie viele Objekte du in diese Liste packst.
wos der unterschied zu javas list oder genauer gesagt arraylist
Kann ich dir nicht beantworten. Ich bin kein Java-Entwickler. Deshalb habe ich auch keine eigene Antwort verfasst, weil Java Eigenheiten hat, die C# nicht hat.
habe mit beidem gearbeitet und ich sehe oberflächlich jz keinen unterschied, deshalb hats mich nur gewundert dass du c# list hochgelobt hast während die antwort von javas arraylist redete, dachte du bevorzugst jz c#s list wegen irnwas coolem was java nicht hat
Nö, ich bin von der Antwort ausgegangen, es gäbe keine List, die so funktioniert. Sonst würde ich eine als Alternative vorschlagen.
Aber du kannst die Dimensionen trotzdem flexibel einstellen.
Beispiel:
int a[];
int size = 32;
a = new int[size];
Glaube das will die Fragestellerin. Dann kann man nämlich im Konstruktor angeben, wie groß das Array sein soll. Diese Größe ist dann aber natürlich fest.
class Bla {
int a[];
public Bla (int size)
a = new int[size];
}
Danke, dann wundert mich die Aufgabenstellung, ich packe sie glaube mal in meine Frage mit rein...
Meinst Du so was hier? Aber nicht getestet, sondern so runtergeschrieben.
class MyClass{
int[] myArray;
MyClass(int arr_size){
myArray = new int[arr_size];
}
void setNewLength(int arr_size){
int[] newArray= new int[arr_size];
int max=arr_size>myArray.length? _
myArray.length:arr_size;
for(int i=0;i<max;++i)
newArray[i]=myArray[i];
myArray=null; // für GC vorher auf null setzen
myArray=newArray;
}
}
man muss nicht vorher auf null setzen fürs gc, das sind angewohnheiten von alter c programmierung
Hast recht, auch ohne Nullsetzung wird der alte Inhalt von myArray nicht mehr erreicht und wird daher von GC eingesammelt.
Bei C und C++ macht man es immer noch so, also nix "alte" Programmierung, und mit C/C++ progt man heute noch. Ist zwar direkter, hat jedoch auch Vorteile, selbst zu deleten/ destructen.
garbage collector
kurzgesagt: objekte verbrauchen speicher und der gc schaltet den verbrauchten speicher automatisch wieder frei
Garbage Collector. Das ist ein internes Modul, welches Speicherplatz von Variablen freigibt, welche nicht mehr gebraucht werden. In meiner Methode SetNewLength wird ein neues Array geschaffen und die Variable myArray zeigt dann auf das neue Array. Das alte Array wird nicht mehr gebraucht, darauf zeigt dann weder myArray noch newArray, nichts zeigt mehr darauf, daher kann der Speicherplatz wieder freigegeben werden, das macht der GC.
ja genau so meine ich das und so ähnlich habe ich das auch programmiert, aber es wurde nicht angenommen...
von IntelliJ, habe es aber jetzt gelöst und keine Ahnung wie ich das implementiert hatte, dass die Fehlermeldung kam....
Dafür liebe ich ja C#'s List :D