Objekte, bspw. konkret Arraylists,manuell aus Speicher löschen?

Gutes Buch, gibt es auch online zu lesen.
Es steht außer Frage, dass das Buch gut ist! Und das es online verfügbar ist, ist super von @Ullenboom (Ja, er ist hier auch von Zeit zu Zeit aktiv, so es seine Zeit erlaubt!) Und wir nutzen das hier im Forum ja auch oft genug um einfach Links zu den entsprechenden Teilen seines Buchs zu bringen statt eben selbst etwas zu erläutern.

Aber ganz blutige Anfänger könnten ggf. ein anderes Buch bevorzugen. So findet sich im Vorwort der Java Insel z.B. auch:

Was dieses Buch nicht ist​

Dieses Buch darf nicht als Programmierbuch für Anfänger verstanden werden. Wer noch nie programmiert hat und mit dem Wort »Übersetzen« in erster Linie »Dolmetschen« verbindet, der sollte besser ein anderes Tutorial bevorzugen oder parallel lesen. Viele Bereiche aus dem Leben eines Industrieprogrammierers behandelt die »Insel« bis zu einer allgemein verständlichen Tiefe, doch sie ersetzt nicht die Java Language Specification (JLS: http://tutego.de/go/jls).
Bücher, die ich kompletten Anfängern empfehlen würde, wären:
- Java von Kopf bis Fuss ("Head first Java" ist der original Titel)
- Schrödinger lernt Java
Da wird man sehr anschaulich durch den Stoff geführt, aber hat halt nichts, in dem man schnell Teile nachlesen kann. Da ist die Insel in meinen Augen super: Schnell in das entsprechende Kapitel gehen und man bekommt eine gute Erläuterung des Stoffes.

Die sind von der Aufmachung her garantiert nicht schlecht. Und wer ein Nachschlagewerk parat haben will: Da ist Java ist auch eine Insel aus meiner Sicht sehr gut, das man sich auch kaufen kann um es offline lesen zu können .... (Ich selbst bevorzuge das "Java: The Complete Reference" von Herbert Schild, aber das ist auf einem anderen Niveau und auf Englisch. Das ist also eher was für Leute, die auch die JLS lesen und so 🙂 )

Und zu guter Letzt ein Hinweis, der für Anfänger interessant sein könnte: Von Christian kommt bald ein Buch raus, das Java-Aufgaben mit Lösungen beinhaltet. Das wird bestimmt auch eine super Sache.
 
In diesem konkreten Fall ist zB einfach eine Klasse mit 6 byte-Feldern am platzsparendsten.
Wenn man eine Klasse benutzt benötigt man Instanzen.
Jede Instanz muss mit mindestens einer 32-Bit Referenz adressiert werden.
Dazu kommt der konstante Teil jedes Objektes, Typbeschreibung, Lock-Bits.
Innerhalb einer Instanz werden alle Felder aligned, benötigen also immer mindestens 32 Bit.
 
Also Optimierungen sehe ich immer relativ kritisch und ich denke, dass dies hier ein sehr gutes Beispiel ist.

Es gibt ein Problem, weil da in einem Algorithmus nun irgendwie Arrays mit einer Größe von > 100GB im Speicher gehalten werden. Und heya - da reduzieren wir den Speicherbedarf doch mal, in dem wir dann die Daten anders speichern. Um was für einen Faktor wird da der Speicherbedarf gesenkt? Selbst wenn da ein Faktor von 4 ist, dann braucht das immer noch >25GB ... und das ist nur einmal das Array.... Da ist noch nichts damit gemacht worden ....

Das sehe ich sehr kritisch. Da wäre doch erst einmal eine Analyse angebracht. Was genau braucht man denn? Und erste Aussagen dazu gab es ja auch schon, z.B. von @temi in #50.

Und auch die Frage, ob man wirklich alle Kombinationen so aufbereitet haben muss oder ob es nicht ein Algorithmus tut, der einen Fall nach dem anderen erstellt so dass der dann bewertet werden kann ...

==> Optimierungen ohne Analyse sind einfach etwas, das man niemals machen sollte. Es wird etwas erst einmal ohne Grund verkompliziert.
(Mit Analyse kannst Du einen klaren Grund haben, aber ohne Analyse gibt es für mich keinen Grund!)

Und nur um das deutlich zu machen: Es gibt noch ganz viele weitere Möglichkeiten. Statt da die Daten so geschlossen vorzuhalten kann man dies unterteilen und dann nur die Teile im Speicher halten, die man gerade braucht. Da gibt es sogar massig Software, die dies so macht (Datenbanken). Da kann man also einmal die Daten generieren, von mir aus in handlichen Blöcken ... Zusätzlich kann man Indices erzeugen, die einen schnellen Zugriff auf den richtigen Block erlauben. Wenn man es braucht, dann incl. einem Caching ... Man kann auch Zugriffe optimieren ... Sprich: Einfach mal schauen, was Datenbanken heute so erlauben 🙂

Aber um zu wissen, was man braucht, muss man analysieren, was man braucht. Es muss klar sein, was wie benötigt wird ...

Am Ende kann dann sogar eine Lösung heraus kommen, die sowohl die Library nutzt als auch die Klasse von @mrBrown. Dann wird halt auf ein Element x zugegriffen, welches hoch optimiert über die Library im Speicher gehalten wird aber das gelesene Element wird dann als Instanz einer Klasse mit 6 Byte Feldern zurück gegeben....

Also in Kurz:
Das Ergebnis ist komplett offen. Durch eine Analyse kann man Notwendigkeiten erkennen und dafür dann Lösungen finden. Ohne Analyse ist jede Optimierung erst einmal zu vermeiden.
 
Wenn man eine Klasse benutzt benötigt man Instanzen.
Jede Instanz muss mit mindestens einer 32-Bit Referenz adressiert werden.
Dazu kommt der konstante Teil jedes Objektes, Typbeschreibung, Lock-Bits.
Innerhalb einer Instanz werden alle Felder aligned, benötigen also immer mindestens 32 Bit.
Ich sag einfach mal "Jein" der erstere Teil stimmt noch (was du aber vergisst: mit deine Klassen hast du immer zwei Instanzen, mit einer Klasse mit Feldern nur eine Instanz), der letzte Satz aber nicht mehr.

Das ganze Objekt muss immer ein vielfaches von 8 Byte groß sein, und wird am Ende entsprechend aufgefüllt, das ist dabei das relevanteste. Das Alignment für Felder spielt dabei quasi keine Rolle, die 6 Byte in diesem Beispiel brauchen auch nur zusammen genau 6 Byte, ohne "leeren Platz" dazwischen.



Um's mal für diesen Fall vorzurechnen (unter 64bit mit compressed oops):

Einfach eine Klasse mit 6 byte-Feldern (um die 6 Werte von 1-49 darzustellen): 12 Byte Header + 6 Byte Daten = 18 Byte, mit Padding 24 Byte.


Mit BitPackedLongArray:
Für BitPackedLongArray: 12 byte Header + 4 Byte für den Pointer auf das Array + 4 Byte für das bitPackedArraySize-Feld = 20Byte, mit Padding 24 Byte
Für die Daten: 16 byte Header für das Array + 8 Byte für den einen long im Array = 24, mit Padding 24
Insgesamt: 48 Byte




Das bedeutet im Umkehrschluss nicht, dass zB BitPackedLongArray generell Unsinn ist. Bei variablen, entsprechend großen Datenmengen und "unpassender" Bitzahl für die Daten gewinnt man dadurch schon was – eben dann, wenn der Overhead kleiner ist, als man durch das Packing einspart.
 
Finde ich ja nett von dir, dass du mich beleidigen wolltest. 😥 Muss mal in mich gehen. Bin ich jetzt beleidigt? Hm. Nee, tut mir leid. Hat nicht geklappt.

Der Tipp war vollkommen ernst gemeint, darum steht das auch da.

Die Fragen, die du in den Beiträgen vorher gestellt hast, zeigen, dass dir noch einige Grundlagen fehlen. Wie du daraus drauf kommst, dass ich dich für dumm halte, ist mir etwas schleierhaft. Ich kann dir aber versichern, dass ich dir das auch geschrieben hätte, wenn ich das Gefühl gehabt hätte, dass Programmieren nichts für dich ist.

Zu deiner Annahme mit List<> und Long. Ein Blick in die Dokumentation zu List<> zeigt, z.B. bei get(), dass hier für den Index nur ein Integer vorgesehen ist. Auch Arrays werden in Java über einen Integer-Index angesprochen:


Insofern musst du dir auf jeden Fall etwas anderes einfallen lassen und da hilft es eben ungemein, dass man weiß, dass es in Java auch mehr als eine Klasse geben kann 😉


Ich arbeite am liebsten mit Büchern und habe mir für Java als erstes "Java ist auch eine Insel" gekauft. Allerdings ist das Buch, meiner Meinung nach, eher eine Art Kompendium als ein Kurs und damit nicht unbedingt für blutige Anfänger geeignet. Das für mich hilfreichste Buch war "Entwurfsmuster von Kopf bis Fuß". Falls "Java von Kopf bis Fuß" ähnlich gut ist (ich kenne es nicht), dann wäre es mein Tipp und danach direkt das Buch zu den Entwurfsmustern.
Wenn du das so schreibst, fühle ich mich ganz schlecht :-/

Beleidigen klingt so böse, mir kam es eher so vor als würde man mir vorhalten ich hätte von nix ne Ahnung.
Was mir misfiel und was wohl auch in meiner etwas sarkastischen Art spürbar war.

Ich meine, ich weiß schon dass man mit A objektname=new A();
bspw. ein neues Objekt eienr irgendwo definierten Kalsse A erzeuigt, dass hierbei ein Standardkonstruktor der Klasse (oder eben ein konstruktor der selbst geschrieben ist) aufgerufen wird, womöglich gegebene Attribute der Klasse initialisiert werden, etc.

Bin also nicht unbedingt der "Wie schriebe ich ein Hallo Welt ProgrammNoob-Level, sowas lasse ich mir dann doch nciht unterstellen! 😛

Habe mich nur noch nie so richtig mit befasst wie das mit mehreren klassen in einer Datei läuft.

Weil mein programmierkram bisher so simpel war dass ich das ülicherweise in eienr einzigen Klasse und mit ein paar dutzend methoden abfertigen konnte.
Ich brauchte da eigentlich nie mehrere Klassen oder gar mehrere java Programme 🙂



Ja, ich weiß nicht ob ich mich nur unklar ausdrücke aber genau das meinte ich bzgl. der int vs long Sache.

Ist mir auch klar dass ein long array und dementsprechend auch ein long arraylist ELEMENTE vom Typ long hat. schon klar.

mir gings ja, wie angemerkt, aber um den index.

der muss ja, wie du sagst, vom typ int sein. egal aus welchen elementen jetzt das array oder die liste besteht.

entsprechend kann ich auch die indexstelle Maxinteger+10 nicht aufrufen weil diese uzahl eben kein integer ist.

bspw. praktisch gaäbs wohl einen überlauf , java würde das zu Minitneger+9 umrechnen und dieses element versuchen aufzurufen (was einene error gäbe weil negativer index gibts nicht).

so oder so würde aber in jedem fall eine ganz andere indexstelle versucht werden aufzuufen als ich beabsichtigt hatte.

das war der punkt warum ich ursprünglich dachte, gehen wir über zu long arrays. dann, so meine vemrutung lediglich, wäre auch der index wohl vom typ long und daher würden salopp gesagt mehr elemente maximal in ein array passen. da lag ich dann wohl falsch und es löst das grundproböem nicht im geringsten.


klar hast du recht mit den lottozahlen, die reale anzahl ist 1/(6!) stel von der anzahl, die man bei beachtung der reihenfolge erhält.


die lottozahlen immer wieder zu erzeugen wäre natürlich auch eine variante.
wobei ich halt dachte, speicher, performance und co mässig wäre es sinnvoller die einmal erzeugen zu lassen und dann immer wieder zu verwenden bei allem möglichen.

ver,utlich muss ich generell mein konzept einfahc mal komplett überdenken, ob man das irgendwie anders lösen könnte oder so.
 
Habe mich nur noch nie so richtig mit befasst wie das mit mehreren klassen in einer Datei läuft.
Nicht in einer Datei! Jede Klasse eine eigene Datei. Beschaff dir eine IDE, dann geht das ganz einfach, weil die sich um das Übersetzen und Starten kümmert.
Ich meine, ich weiß schon dass man mit A objektname=new A();
bspw. ein neues Objekt eienr irgendwo definierten Kalsse A erzeuigt
Klassen und Objekte sind halt nicht das einzige. Wie schon geschrieben "Entwurfsmuster von Kopf bis Fuß" zeigt auf eingängliche Art und Weise, wie das alles zusammenspielt.

kann ich auch die indexstelle Maxinteger+10 nicht aufrufen weil diese uzahl eben kein integer ist.
Ist schon immer noch ein Integer. Aufgrund der internen Darstellung wird der Wert allerdings negativ. Stichwort Zweierkomplement.

EDIT: Hast du ja auch ausgeführt.
 
Zuletzt bearbeitet:
Nicht in einer Datei! Jede Klasse eine eigene Datei. Beschaff dir eine IDE, dann geht das ganz einfach, weil die sich um das Übersetzen und Starten kümmert.

Klassen und Objekte sind halt nicht das einzige. Wie schon geschrieben "Entwurfsmuster von Kopf bis Fuß" zeigt auf eingängliche Art und Weise, wie das alles zusammenspielt.


Ist schon immer noch ein Integer. Aufgrund der internen Darstellung wird der Wert allerdings negativ. Stichwort Zweierkomplement.
yo, gehen tuts zwar, ruft mir aber statt dem index 132131424 stattdessen die stelle mit index -12468364 auf (zahlen frei erfunden).
am thema vorbei, 6, setzen. würde es da in der schule heißen.

kompiliert zwar, kommt aber nicht beabsichtigter unsinn ruas beim ausprobieren.
 
die lottozahlen immer wieder zu erzeugen wäre natürlich auch eine variante.
wobei ich halt dachte, speicher, performance und co mässig wäre es sinnvoller die einmal erzeugen zu lassen und dann immer wieder zu verwenden bei allem möglichen.
Die beste Lösung wäre weder noch. In deinem anderen Thema wurde doch eine Formel aufgestellt, die die untere Grenze von notwendigen Tipps ermittelt. Wäre es nicht schlau, zu berechnen, ob es eine beste Aufteilung der beiden Blocks gibt? Im dort erläuterten System war es 22/27, aber ist das die Beste?
 
Es steht außer Frage, dass das Buch gut ist! Und das es online verfügbar ist, ist super von @Ullenboom (Ja, er ist hier auch von Zeit zu Zeit aktiv, so es seine Zeit erlaubt!) Und wir nutzen das hier im Forum ja auch oft genug um einfach Links zu den entsprechenden Teilen seines Buchs zu bringen statt eben selbst etwas zu erläutern.
Wo kann ich das Buch online finden?

habe beim Stalken seines Profils bisher nur den link zu seinem 110 Euro Udemy Kurs gefunden
 
Habe mich nur noch nie so richtig mit befasst wie das mit mehreren klassen in einer Datei läuft.
Es darf nur eine toplevel public class geben, wobei der Name der Klasse+".java" dem Dateinamen entsprechen muss.

Du kannst auf toplevel (nicht in einer anderen Klasse (in deren öffnenden und schliessenden geschwungenen Klammern) enthalten) dann belieibig viele Klassen mit private oder protected Modifier oder ohne Modifier (nennen manche auch package protected) in der Datei hinschreiben.

Innerhalb einer Klasse kannst Du auch belieibig viele Klassen hinschreiben, die dürfen auch public sein, weil sie im Namensraum der umschliessenden Klasse liegen.

Wichtig ist dabei der Modifier static, weil die Klassen sonst eine unsichtbare Referenz auf die äussere Klasse haben.

Mit Modifier static nennt man sie geschachtelte (nested) Klassen.
Ohne Modifier static nennt man sie innere Klassen.
 
Ausserdem sind noch lokale und anonyme Klassen verwendbar.

Lokale Klassen werden im Code einer Methode, Konstruktor oder Initializer-Block hingeschrieben.
Eigentlich benötigt man die kaum.

Anonyme Klassen werden massig in Code nach dem Observer-Pattern (Listener in Swing oder AWT) verwendet.
Ich glaube, die wurden für AWT in Java eingebaut.
 
die ursprüngliche frage zu den klassen war -> warum wird die main von anderen programmen nicht ausgeführt <- jetzt da komplett auszuholen ist vllt nbissl zu viel
 
Ich frag mal so:
Gibts da bestimmte Kapitel im "java ist eine Insel" buch, die zu den Themen besonders zu empfehlen sind?

Weil da gibts wohl doch so mancher Begriffe, die mir rein gar nix sagen, bspw. das mit dem Observer-Pattern
 
Du kannst auf toplevel (nicht in einer anderen Klasse (in deren öffnenden und schliessenden geschwungenen Klammern) enthalten) dann belieibig viele Klassen mit private oder protected Modifier oder ohne Modifier (nennen manche auch package protected) in der Datei hinschreiben.

Innerhalb einer Klasse kannst Du auch belieibig viele Klassen hinschreiben, die dürfen auch public sein, weil sie im Namensraum der umschliessenden Klasse liegen.

Wichtig ist dabei der Modifier static, weil die Klassen sonst eine unsichtbare Referenz auf die äussere Klasse haben.

Mit Modifier static nennt man sie geschachtelte (nested) Klassen.
Ohne Modifier static nennt man sie innere Klassen.
Der dringende Hinweis geht allerdings dahin, das nicht zu tun, sondern eine Datei pro Klasse zu haben. Das vermeidet, allein durch die bessere Übersichtlichkeit, Fehler.
 
Zuletzt bearbeitet:
Also doch eine Datei und nur eine Klasse. check.
Konkret ist die Regel: Nur eine Toplevel-Klasse oder Schnittstelle pro Datei. Die Datei heißt so, wie die Klasse/Schnittstelle.

Natürlich kann es auch geschachtelte oder anonyme Klassen in dieser Datei geben, aber nur, wenn es für den zu erreichenden Zweck sinnvoll ist. Möglichst alles in eine Datei packen zu wollen ist nicht sinnvoll.
 

Zurück
Oben