Allgemeines Verständnis

Moderator: AI 2

Benutzeravatar
aDramaQueen
Mausschubser
Mausschubser
Beiträge: 84
Registriert: 10. Jan 2014 16:34

Allgemeines Verständnis

Beitrag von aDramaQueen »

Sooo...,

da es sowas wie einen Allgemeine Fragen - Bereich noch nicht gibt, mach ich das Ding hier mal auf.

1. Frage wenn ich in nem Array ne for-each-Schleife nutze darf ich kein Element entfernen. Darf ich aber Primitive Typen ändern? Ich hatte nämlich in der 0er Übung so ne Situation. Da sollten wir ja die Fibonacci-Reihe implementieren. Ich wollte die rekursiv setzen:

Code: Alles auswählen

int i=0;
for (int index: fibo) {
    try { index = fibo[i-1]+fibo[i-2]; }
    catch (IndexOutOfBoundsException) {fibo[i]=1;}
    finally {i++;}
}
Die Exception wird logischer weise in den ersten beiden Zyklen geworfen. Genau dann soll jeweils der Werte 1 gesetzt werden. Danach läuft alles wie gehabt.
Wenns den laufen würde. Als Ausgabe bekam ich stets ne 0-Reihe. Mit ner normalen for-Schleife war das dann kein Ding mehr. Dennoch versteh ich nicht warum das nicht funktioniert?!?
Bild
...Never go full retard...

Benutzeravatar
aDramaQueen
Mausschubser
Mausschubser
Beiträge: 84
Registriert: 10. Jan 2014 16:34

Re: Allgemeines Verständnis

Beitrag von aDramaQueen »

2. Frage

Im Drehbuch als auch im Video zu Generics & Collections wird bei der Einführung der for-each-Schleife der Satz fallengelassen, dass die Klasse String genau wie die Klasse Collection eine Sonderrolle in Java einnehmen, indem ihnen eine spezielle Syntax bereitgestellt wird.
Ich frage mich nun ob hier wirklich String und nicht doch eher Array gemeint ist?!?
Bild
...Never go full retard...

m_flaig
Moderator
Moderator
Beiträge: 272
Registriert: 27. Sep 2009 14:02

Re: Allgemeines Verständnis

Beitrag von m_flaig »

aDramaQueen hat geschrieben:

Code: Alles auswählen

int i=0;
for (int index: fibo) {
    try { index = fibo[i-1]+fibo[i-2]; }
    catch (IndexOutOfBoundsException) {fibo[i]=1;}
    finally {i++;}
}
Dennoch versteh ich nicht warum das nicht funktioniert?!?
Hallo,

bei der for-each -Schleife nimmt in diesem Fall index die Werte von fibo an. Index durchläuft nach und nach ein Element von fibo. Im ersten Durchlauf ist index also das erste Element von fibo, im zweiten Durchlauf das zweite etc... Sie bekommen mit index also nicht den Zugriff auf das Array, sondern eine Kopie des jeweiligen Elements! Deswegen macht es keinen Sinn, index innerhalb des Durchlaufs auf irgendwas zu setzen.

Viele Grüße,
M.Flaig

m_flaig
Moderator
Moderator
Beiträge: 272
Registriert: 27. Sep 2009 14:02

Re: Allgemeines Verständnis

Beitrag von m_flaig »

aDramaQueen hat geschrieben:2. Frage

Im Drehbuch als auch im Video zu Generics & Collections wird bei der Einführung der for-each-Schleife der Satz fallengelassen, dass die Klasse String genau wie die Klasse Collection eine Sonderrolle in Java einnehmen, indem ihnen eine spezielle Syntax bereitgestellt wird.
Ich frage mich nun ob hier wirklich String und nicht doch eher Array gemeint ist?!?
Hallo,

habe nun nicht im Drehbuch nachgeschaut, aber die String Klasse ist eine besondere Klasse, da String gleichzeitig als Objekt der String Klasse benutzt werden kann, ebenso ist es aber auch ein fest in Java eingebauter Datentyp!
Java ermöglicht die direkte Konstruktion von String-Objekten aus String-Literalen (Zeichenketten in doppelten Anführungszeichen). Des Weiteren ist Konkatenation (Aneinanderreihung von Strings mit +) von mehreren Strings erlaubt, aber Plus ist für keinen anderen Objekttyp erlaubt. Es lassen sich zum Beispiel nicht zwei GolfRecord-Objekte addieren. Mit dem Plus auf String-Objekten ist also ein besonderer Operator auf der Klasse String definiert, der nicht eigenständig auf anderen Klassen definiert werden kann.

Viele Grüße,
M.Flaig

Benutzeravatar
aDramaQueen
Mausschubser
Mausschubser
Beiträge: 84
Registriert: 10. Jan 2014 16:34

Re: Allgemeines Verständnis

Beitrag von aDramaQueen »

Dann ist ne for-each-Schleife also eine reine Ausgabe. D.h.: Sobald ich was an ner Collection ändern will scheidet die for-each-Schleife schon mal grundsätzlich aus...

Alles klar, nun nochmal ne andere Frage:

Warum sollte man nen Konstruktor denn jemals private setzen? Man kann doch eh nicht von Außen auf ihn zugreifen. Das höchste der Gefühle sind ja die Parameter mit denen man ihn füttern kann. Das läuft aber unabhängig davon ob er private oder public ist?!?
Bild
...Never go full retard...

Benutzeravatar
SophiaLi1
Moderator
Moderator
Beiträge: 542
Registriert: 5. Jan 2014 11:48

Re: Allgemeines Verständnis

Beitrag von SophiaLi1 »

Ich zitiere einfach mal:
Ein Konstruktor kann privat sein, was verhindert, dass von außen ein Exemplar dieser Klasse gebildet werden kann. Was auf den ersten Blick ziemlich beschränkt erscheint, erweist sich als ziemlich clever, wenn damit die Exemplarbildung bewusst verhindert werden soll. Sinnvoll ist das etwa bei den so genannten Utility-Klassen. Das sind Klassen, die nur statische Methoden besitzen, also Hilfsklassen sind. Beispiele für diese Hilfsklassen gibt es zur Genüge, zum Beispiel Math. Warum sollte es hier Exemplare geben? Für den Aufruf von max() ist das nicht nötig. Also wird die Bildung von Objekten erfolgreich mit einem privaten Konstruktor unterbunden.
Quelle: klick
aDramaQueen hat geschrieben: Warum sollte man nen Konstruktor denn jemals private setzen? Man kann doch eh nicht von Außen auf ihn zugreifen. Das höchste der Gefühle sind ja die Parameter mit denen man ihn füttern kann. Das läuft aber unabhängig davon ob er private oder public ist?!?
Wenn der Konstruktor public ist, dann kann man von Außen auf ihn zugreifen. Ein Zugriff ist das Aufrufen des Konstruktors.

m_flaig
Moderator
Moderator
Beiträge: 272
Registriert: 27. Sep 2009 14:02

Re: Allgemeines Verständnis

Beitrag von m_flaig »

aDramaQueen hat geschrieben:Dann ist ne for-each-Schleife also eine reine Ausgabe. D.h.: Sobald ich was an ner Collection ändern will scheidet die for-each-Schleife schon mal grundsätzlich aus...
ForEarch iteriert über alle Elemente und liefert den direkten Wert. Daher kann auch der Name abgeleitet werden: For Each element, do this and that.. Intern wird dennoch ein Iterator-Objekt gehalten in dem der State der Iteration festgehalten wird. Da man als Entwickler aber quasi nie am Index der Laufvariable interessiert ist, sondern eigentlich nur an den Werten, macht ForEach jede Menge Sinn =)
aDramaQueen hat geschrieben:Warum sollte man nen Konstruktor denn jemals private setzen? Man kann doch eh nicht von Außen auf ihn zugreifen. Das höchste der Gefühle sind ja die Parameter mit denen man ihn füttern kann. Das läuft aber unabhängig davon ob er private oder public ist?!?
Mit privaten Konstruktoren kann man verhindern, dass Objekte einer Klasse erzeugt werden. Klingt erstmal nicht sinnvoll, macht aber z.B. bei Klassen, die ausschließlich statische Methoden haben Sinn. Bestes Beispiel die Klasse Math aus Java.utils: Die Klasse hat private Konstruktoren, da man keine Objekte von ihr erzeugen kann und soll, warum auch? Die Methoden sind ja statisch und direkt verfügbar =)
Kurz: Private Konstruktoren geben Ihnen die Möglichkeit, dass Sie verbieten können, Objekte dieser Klasse erstellen zu lassen.

VG,
M.Flaig

Benutzeravatar
aDramaQueen
Mausschubser
Mausschubser
Beiträge: 84
Registriert: 10. Jan 2014 16:34

Re: Allgemeines Verständnis

Beitrag von aDramaQueen »

Alles klar. Nun noch ne Frage zu Klassenvariablen:

Wenn ich ne Static Variable in der Klasse habe und die im Konstruktor initialisiere, wird die dann jedes mal aufs neue überschrieben wenn ich neue Objekte instanziere? Ich rede jetzt explizit nur vom Konstruktor, keiner Methode!!!

Hintergrund ist Übung 3 in der wir ja unseren eigenen Hexa-Dezimal-Rechner bauen sollten:

Code: Alles auswählen

	private int number;
	private static HashMap<Integer,String> hex;
	
	public Converter() {
		number = 0;
		hex = new HashMap<Integer, String>();
		for (int i=0; i<10; i++) {hex.put(i, ""+i);}
		hex.put(10, "A");
		hex.put(11, "B");
		hex.put(12, "C");
		hex.put(13, "D");
		hex.put(14, "E");
		hex.put(15, "F");
	}
Wie zu sehen ist, erzeug ich hier ne HashMap, welche bei passender dezimalen int-Eingabe die entsprechenden hexwerte als String zurück liefert. Nun frag ich mich, ob diese Map eben bei jedem neuen Objekt aufs neue generiert wird und wenn ja, wie ich das alternativ hätte implementieren können?!?
Bild
...Never go full retard...

tacu
Mausschubser
Mausschubser
Beiträge: 64
Registriert: 13. Apr 2011 18:35

Re: Allgemeines Verständnis

Beitrag von tacu »

Der Konstruktor wird jedes mal aufgerufen wenn ein neues Converter Object erzeugt wird. Da du im Konstruktor sagst, das hex eine neue HashMap ist, wird sie auch neu erstellt.

Wenn man das so macht, muss hex eigentlich nicht static sein (hab die Aufgabe aber gerade nicht im Kopf, war es gefordert das es static ist?)

Benutzeravatar
aDramaQueen
Mausschubser
Mausschubser
Beiträge: 84
Registriert: 10. Jan 2014 16:34

Re: Allgemeines Verständnis

Beitrag von aDramaQueen »

Ne war nicht gefordert. Dennoch brauch ich die doch nicht jedes mal neu zu erzeugen. Muss ich die dann in ne extra statische Klasse auslagern und importieren?
Bild
...Never go full retard...

tacu
Mausschubser
Mausschubser
Beiträge: 64
Registriert: 13. Apr 2011 18:35

Re: Allgemeines Verständnis

Beitrag von tacu »

ah, ich glaube ich verstehe jetzt erst was du vor hast ^^

du kannst das mal probieren:

Code: Alles auswählen

private static HashMap<Integer,String> hex;
static{
      hex = new HashMap<Integer, String>();
      for (int i=0; i<10; i++) {hex.put(i, ""+i);}
      hex.put(10, "A");
      hex.put(11, "B");
      hex.put(12, "C");
      hex.put(13, "D");
      hex.put(14, "E");
      hex.put(15, "F");
}
ich hab das noch nie versucht, gib bitte mal eine rückmeldung ob das so geht :)

Benutzeravatar
aDramaQueen
Mausschubser
Mausschubser
Beiträge: 84
Registriert: 10. Jan 2014 16:34

Re: Allgemeines Verständnis

Beitrag von aDramaQueen »

Alles klar, läuft!!!
Bild
...Never go full retard...

Benutzeravatar
aDramaQueen
Mausschubser
Mausschubser
Beiträge: 84
Registriert: 10. Jan 2014 16:34

Re: Allgemeines Verständnis

Beitrag von aDramaQueen »

Neue Frage: Hat es großartige Auswirkungen auf die Performance wenn ich Standard-Bibliotheken importiere?
Simples Beispiel: Ich importiere sagen wir mal 100 Packages. Vielleicht nutze ich sie, vielleicht auch nicht...
Macht dass das Programm evtl. langsamer?
Bild
...Never go full retard...

m_flaig
Moderator
Moderator
Beiträge: 272
Registriert: 27. Sep 2009 14:02

Re: Allgemeines Verständnis

Beitrag von m_flaig »

SophiaLi1 hat geschrieben:Ja, hat es, denn das Importieren braucht Zeit. Würde es keimen Unterschied machen, wäre die gesamte Standardbibliothek standardmäßig enthalten.
Hallo,

das ist so nicht ganz richtig.
Java funktioniert so, dass der Code erst einmal vom Compiler auf Fehler etc. geprüft wird, danach wird plattformunabhängiger Bytecode erstellt. Nicht benutzte Imports u.a. sind hierbei allerdings nicht mehr enthalten, sodass der Bytecode, welcher dann von der JVM interpretiert wird, nur sinnvolle und benötige Anweisungen enthält.

Kurz: 1000 unnötige Imports haben Auswirkungen auf den Compiler, aber nicht auf das Programm /die Performance zur Laufzeit!

Viele Grüße,
M.Flaig

Osterlaus
BSc Spammer
BSc Spammer
Beiträge: 1263
Registriert: 23. Aug 2007 12:46
Wohnort: DA

Re: Allgemeines Verständnis

Beitrag von Osterlaus »

SophiaLi1 hat geschrieben:Ja, hat es, denn das Importieren braucht Zeit.
Das halte ich für ein Gerücht. Bei stackoverflow werden auch gute Gründe für den Import ganzer Pakete genannt, wohingegen sich der Performance-Unterschied nur beim Kompilieren bemerkbar mache und selbst da noch in Grenzen halte: in einer komplett leeren Klasse java.* zu importieren, ohne es zu nutzen, verlangsame das Kompilieren von 100ms auf 170ms, und das wird größtenteils am Dateisystem liegen. java.* hat aktuell angeblich rund 4.000 Klassen, und dafür sind 70ms ne gute Zeit.

Interessanter ist der Hinweis darauf, dass man sich über *-Importe unter Umständen Klassen ins Haus holt, die man gar nicht importieren wollte, zum Beispiel zwei gleichbenannte Klassen aus unterschiedlichen Paketen. Dann gibts natürlich Chaos, denn der Compiler kann ja nicht für dich entscheiden, welche der beiden Klassen du nun wirklich nutzen möchtest.

Antworten

Zurück zu „AI 2“