primitive Datentypen, String, Klassen

Status
Nicht offen für weitere Antworten.

Fellkneul

Mitglied
hallo,

ich habe folgende Frage:

Wenn ich eine Variable eines primitiven Datentypes definiere, dann wird dort direkt eine Information gespeichert.

BSP:

int a = 5;

dann steht in der Variable einfach nur "5"


Wenn ich eine Variable vom Typ Object o.ä. habe, dann wird dort drin der Verweis auf die Instanz einer Klasse gespeichert.

BSP:

Object x = new Object();

dann steht in x ein Verweis auf das soeben erstellt Object...



aber: wie ist das bei Strings? der String ist ja eigentlich eine Klasse, und kein primitiver Datentyp. "String" hat eigene Eigenschaften und Funktionen. Das bedeutet, dass wenn ich schreibe:

String a = "MuhMuh";

dann steht in a eigentlich auch nur ein Verweis auf die Instanz eines Strings und nicht "MuhMuh". Wenn ich jetzt schreibe:

String b = a;

und dann irgendwie die Instanz, die in a gespeichert ist verändere (also nicht a einen neuen String zuweise, sondern genau den String, auf den a zeigt, verändere), dann müsste sich doch auch b verändern, richtig??



vielen Dank für die Mühe,

gruß,
Fellkneul
 

ARadauer

Top Contributor
String a = "MuhMuh";
ist eignetlich eine Kurzform für

String a = new String("MuhMuh");

und dann irgendwie die Instanz, die in a gespeichert ist verändere (also nicht a einen neuen String zuweise, sondern genau den String, auf den a zeigt, verändere), dann müsste sich doch auch b verändern, richtig??
grundsätzlich ja, aber einen string kannst du nicht verändern. der ist immutable, er bietet dir keine möglichkeit in zu ändern...
 
S

Spacerat

Gast
Ich fürchte, musiKk hat vollkommen recht. Ein Anfängerforum ist kaum der richtige Platz für solche witzeleien. Zumal die Tragweite des ganzen leicht unübersehbar werden kann.[highlight=java]StringBuffer tmp = new StringBuffer();
for(int n = 0; n < 10000; n++) tmp.append("a");
String ramkiller = tmp.toString().subString(44, 2);[/highlight]Wer hier annimmt, dass dass interne Char-Array von "ramkiller" blos 2 Elemente hat, irrt gewaltig. Wenn man daraus dann öffters noch[highlight=java]String ramkiller_x = new String(ramkiller);[/highlight]macht, ist der Speicher schneller futsch als man denkt.
 
Zuletzt bearbeitet von einem Moderator:

SchonWiederFred

Bekanntes Mitglied
Wenn man daraus dann öffters noch[highlight=java]String ramkiller_x = new String(ramkiller);[/highlight]macht, ist der Speicher schneller futsch als man denkt.
Wieso das denn? Es gibt zwei Möglichkeiten:

1. Der neue String teilt sich das Array mit dem alten String -- das große Array existiert also weiterhin nur einmal
2. Der neue String macht sich sein eigenes, kleineres Array -- dann gibt es ein großes und ein kleines Array

In meiner Implementation handelt es sich um Möglichkeit 2:
Java:
if (originalValue.length > size)
{
    // The array representing the String is bigger than the new
    // String itself.  Perhaps this constructor is being called
    // in order to trim the baggage, so make a copy of the array.
    int off = original.offset;
    v = Arrays.copyOfRange(originalValue, off, off+size);
}
else
{
    // The array representing the String is the same
    // size as the String, so no point in making a copy.
    v = originalValue;
}
 

Noctarius

Top Contributor
String a = "MuhMuh";
ist eignetlich eine Kurzform für

String a = new String("MuhMuh");

Eigentlich ist das die Stringinstanz für den Test "MuhMuh" aus dem StringConstantPool :D

Das erklärt wieso eine zweite String-Referenz z.B. String b = "MuhMuh" die selbe Instanz liefern würde. Konstante Strings hält Java im internen ConstantPool vor.
 
S

Spacerat

Gast
@SchonWiederFred: Wieso? Recht einfach: "ramkiller_x" erhält mit jeder Instanz definitiv ein eigenes Char-Array (copy). Bei zwei Zeichen scheint das kaum was auszumachen. Strings sind in Java aber nicht blos Char-Arrays, sondern enthalten zusätzlich noch Länge und Offset. Und jede neue Instanz eines jeden Java-Objekts hat einen Overhead der nicht zu unterschätzen ist. Ein String mit 2 Zeichen belegt hier jedenfalls weit mehr als 8 (2x char) Bytes.
@Noctarius: Natürlich. Bei gleichen Strings ist's egal.
 
Zuletzt bearbeitet von einem Moderator:
M

maki

Gast
Auf jedenfall ist new String(..) bääh und keine kurzform für irgendetwas anderes! :D

FindBugs findet solche Patzer übrigens ohne weiteres.
 

SchonWiederFred

Bekanntes Mitglied
@SchonWiederFred: Wieso? Recht einfach: "ramkiller_x" erhält mit jeder Instanz definitiv ein eigenes Char-Array (copy). Bei zwei Zeichen scheint das kaum was auszumachen.
Ja, weil Du auf Teufel komm raus ein furchtbares Programm geschrieben hast. Wenn Du das toString() beim StringBuffer weglässt, sieht es wahrscheinlich schon viel besser aus.

Aber zeige mir bitte ein Programm, dass einige Tausend mal gleiche, neue Strings erzeugt. Ist mir noch nie untergekommen. Immer diese Panikmache :)

Wenn Dich der Objekt-Overhead generell stört, nimm C++.
 
M

maki

Gast
Denke dass wir uns alle darauf einigen können dass Copy-Konstruktoren und deren Aufruf bei immutables keine gute Sache ist, dass diese überhaupt existieren sind Altlasten.
Wie schlecht das dann wirklich ist imho sekundär.

Dass gilt für String genauso wie für Integer und natürlich alle anderen immutables.
 
S

Spacerat

Gast
@SchonWiederFred: Auf Teufel komm raus...! Klar... Irgendwie muss man die Problematik doch schliesslich in ein KSKB bringen. Mit einem Programm, welches n-mal den selben kurzen String aus einem Langen zieht, kann ich auch nicht dienen. Aber 1000 verschiedene Kurze aus einem Langen, ist ein gern genommener Anfängerfehler (z.T. sind auch noch Fortgeschrittenere davon betroffen). Wir wissen glücklicherweise, das so etwas mit StringBuffer oder StringBuilder viel effizienter geht.
Deswegen:
@maki: Ich denke, du hast recht ^^.
 

Wildcard

Top Contributor
new String("some string") sollte eigentlich ebenso wie "some string".intern() Konstanteninlining verhindern und hätte damit schon einen praktischen Nutzen. In wie weit das seit enums noch gebraucht wird ist allerdings wieder eine andere Frage.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Antegra Tekkrebell Primitive Datentypen Literal 8072 Java Basics - Anfänger-Themen 21
H null und primitive Datentypen Java Basics - Anfänger-Themen 6
S Nicht Primitive Datentypen Java Basics - Anfänger-Themen 5
G primitive Datentypen als Referenz an eine Methode übergeben Java Basics - Anfänger-Themen 2
A Literale für primitive Daten Typen Java Basics - Anfänger-Themen 4
J Fehlermeldung : cannot invoke char(at) int on the primitive type int --- Anfänger Java Basics - Anfänger-Themen 5
A Referenztypen in primitive Konvertieren Java Basics - Anfänger-Themen 6
D primitive übergeben aus anderer klasse und alsLabel ausgeben Java Basics - Anfänger-Themen 4
R Datentypen Das Verhalten von Strings als Datentypen Java Basics - Anfänger-Themen 7
T Unterschiedliche Datentypen - worin abspeichern? Java Basics - Anfänger-Themen 18
N Verschiedene Konstruktoren mit gleichen Datentypen Java Basics - Anfänger-Themen 8
J Einige Anfängerfragen (Datentypen, Wertebereich) Java Basics - Anfänger-Themen 11
thor_norsk Datentypen unter Java Java Basics - Anfänger-Themen 3
T Datentypen Eigene Datentypen Java Basics - Anfänger-Themen 15
T for-each-Schleife, verschiedene Datentypen Java Basics - Anfänger-Themen 1
G Methoden Methoden mit versch. Datentypen Java Basics - Anfänger-Themen 1
Nicolex3 Größere Datentypen Java Basics - Anfänger-Themen 35
FelixN Array mit verschiedene Datentypen als Rückgabewert? (Long und Double) Java Basics - Anfänger-Themen 3
mihe7 Von Datentypen und (mehrdimensionalen) Arrays Java Basics - Anfänger-Themen 4
P Datentypen, Klassen, Operatoren, Wrapperklassen Java Basics - Anfänger-Themen 2
W Vergleiche bei generischen Datentypen Java Basics - Anfänger-Themen 7
D Eingabe einscannen, ohne vorher einen Datentypen anzugeben? Java Basics - Anfänger-Themen 1
M Datentypen Generische Datentypen - Syntax Java Basics - Anfänger-Themen 25
L Binären Bäume für beliebige Datentypen Java Basics - Anfänger-Themen 15
L Datentypen Ausgabe von eigenem Datentypen Java Basics - Anfänger-Themen 2
T Datentypen Kann Java 2 verschiedene Datentypen vergleichen? Java Basics - Anfänger-Themen 2
A Datentypen Unterschiedliche Datentypen in einer Eingabe einlesen Java Basics - Anfänger-Themen 2
Queiser Datentypen 2 generische Datentypen für eine Schnittstelle Java Basics - Anfänger-Themen 1
SHasteCode Datentypen Überlauf primitiver Datentypen Java Basics - Anfänger-Themen 4
S Datentypen Java Basics - Anfänger-Themen 14
N Array gleiche Datentypen zusammenrechnen Java Basics - Anfänger-Themen 28
S Datentypen Java Basics - Anfänger-Themen 4
S generische methode mit verschiedenen datentypen Java Basics - Anfänger-Themen 3
H wählen des kleinstmöglichen Datentypen für Gleitkommazahlen. Java Basics - Anfänger-Themen 2
S Datentypen Java Basics - Anfänger-Themen 2
S Datentypen Abstrakte Datentypen Java Basics - Anfänger-Themen 0
J Zusammenhang Numbers und nummerische Datentypen Java Basics - Anfänger-Themen 2
F Variablen unterschiedlicher Datentypen Java Basics - Anfänger-Themen 6
A Abstrakte Datentypen - Methode delete Java Basics - Anfänger-Themen 6
J Generics Datentypen vergleichen Java Basics - Anfänger-Themen 16
D Spezifikation abstrakter Datentypen Java Basics - Anfänger-Themen 3
W Datentypen Datentypen vergleichen Java Basics - Anfänger-Themen 4
B JAVA Datentypen/Überlauf Java Basics - Anfänger-Themen 4
I Erste Schritte HILFE bei Datentypen Java Basics - Anfänger-Themen 2
J Wertebereiche und Datentypen Java Basics - Anfänger-Themen 12
N Methode mit 2 Datentypen. Fehler? Java Basics - Anfänger-Themen 1
N Probleme mit Datentypen Java Basics - Anfänger-Themen 6
S Datentypen Unterschied elementare und zusammengesetzte/strukturierte Datentypen Java Basics - Anfänger-Themen 5
L Beliebigen Datentypen aus String parsen Java Basics - Anfänger-Themen 6
M Wann eine Wrapper Klasse verwenden und wann einen primitiven Datentypen? Java Basics - Anfänger-Themen 8
K new / Datentypen Java Basics - Anfänger-Themen 3
S Datentypen und ihre Größe Java Basics - Anfänger-Themen 21
T Variablen Varargs und beliebige Datentypen Java Basics - Anfänger-Themen 7
S Datentypen Sonderbehandlung primitiver Datentypen, fixe Konstanteninterpretation Java Basics - Anfänger-Themen 10
G Wertebereiche bei Datentypen Java Basics - Anfänger-Themen 10
G Erste Schritte Über verschiedene Datentypen iterieren. Gibt es sowas? Java Basics - Anfänger-Themen 19
SheldoN Gibt es größere Datentypen als long? Java Basics - Anfänger-Themen 2
S Abfrage Objekt-Array nach Datentypen Java Basics - Anfänger-Themen 6
B Variablen Wie macht man eine call by reference mit primitiven Datentypen in Java? Java Basics - Anfänger-Themen 2
H Mehrer Datentypen aus einer Methode ausgeben. Java Basics - Anfänger-Themen 25
O Array mit unterschiedlichen Datentypen ausgeben... Java Basics - Anfänger-Themen 16
A Generische Datentypen Java Basics - Anfänger-Themen 8
R Input/Output verschiedene Datentypen als Bytes in Datei speichern Java Basics - Anfänger-Themen 15
T ArrayList mit verschiedenen Datentypen verhindern Java Basics - Anfänger-Themen 8
N Bedingung für Datentypen Java Basics - Anfänger-Themen 3
R Array aus verschiedenen Datentypen Java Basics - Anfänger-Themen 29
J Datentypen Datentypen Java Basics - Anfänger-Themen 7
S Datentypen Array fill Methode - unterschiedliche Datentypen Java Basics - Anfänger-Themen 6
N ArrayList mit eigenem Datentypen Java Basics - Anfänger-Themen 3
B Wie kann ich unterschiedliche Datentypen in einem Feld abbilden? Java Basics - Anfänger-Themen 5
S Datentypen Die verschiedene Java Datentypen [Anfänger] Java Basics - Anfänger-Themen 8
M Frage zu Datentypen Java Basics - Anfänger-Themen 4
B Welcher Feld Typ für verschiedene Datentypen? Java Basics - Anfänger-Themen 4
O Rückgabewert mit unterschiedlichen Datentypen Java Basics - Anfänger-Themen 10
C Verwendung von primitiven Datentypen Java Basics - Anfänger-Themen 8
Spin Eigenen Abstrakten Datentypen Java Basics - Anfänger-Themen 28
J Datentypen Rechnen mit unterschiedlichen Datentypen Java Basics - Anfänger-Themen 3
B Wieviele bits belegen die Datentypen? Java Basics - Anfänger-Themen 2
S Alle Datentypen in byte Array und zurückwandeln Java Basics - Anfänger-Themen 2
C Explizite und implizite Datentypen Java Basics - Anfänger-Themen 12
Povlsen84 HashSet mit eigenen Datentypen Java Basics - Anfänger-Themen 6
J Verschieden Datentypen in ein "Array" Java Basics - Anfänger-Themen 13
M HashMap mit primitiven Datentypen Java Basics - Anfänger-Themen 10
SebSnake Operatoren für eigene Datentypen Java Basics - Anfänger-Themen 3
G Frage zum Ungang mit Generische Datentypen Java Basics - Anfänger-Themen 4
G Überladen von Konstruktoren mit unterschiedlichen Datentypen Java Basics - Anfänger-Themen 4
R datentypen konvertierung u modulorechnung Java Basics - Anfänger-Themen 15
G Wertebereiche und Datentypen Java Basics - Anfänger-Themen 3
W Datentypen in JAva Java Basics - Anfänger-Themen 2
G verschiedene datentypen in arraylist Java Basics - Anfänger-Themen 14
N Problem mit Tastatureingaben für verschiedene Datentypen Java Basics - Anfänger-Themen 3
I Array für verschiedene Datentypen? Java Basics - Anfänger-Themen 5
E Eigenen datentypen erstellen Java Basics - Anfänger-Themen 14
Y Neuen Datentypen erstellen Java Basics - Anfänger-Themen 12
M int toString Datentypen Umwandeln, AnfängerProblem Java Basics - Anfänger-Themen 3
M Datentypen zu erzeugen? Java Basics - Anfänger-Themen 2
S Switch für komplexe Datentypen? Java Basics - Anfänger-Themen 7
7 Datentypen Java Basics - Anfänger-Themen 8
S Array mit mehreren Datentypen Java Basics - Anfänger-Themen 5
D String in einen primitiven datentypen parsen Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben