Wie wird in Java ein Char-Array terminiert ?

ernst

Top Contributor
Hallo allerseits,
in der Programmiersprache C wird ein Feld mit dem Dtentyp char immer mit \0 terminiert.
Wie verhält sich dies in Java.
Angenommen, man hat ein Feld:
char[] feldChar = new char[1000];
und will jetzt die 2 Zeichen a und b reinschreiben.
Wird das dann so gemacht?
feld[0] ='a';
feld[1] ='b';
feld[2] ='\0';
Wenn nein, wie dann ?

mfg
Ernst
 

mrBrown

Super-Moderator
Mitarbeiter
Das ist Java, wenn man Strings braucht, nutzt man Strings (die man nicht händisch terminieren muss) ;)

Edit: 0 Bzw \0 in nem char-Array bringen nichts, wenn man es in einen String umwandelt
 

ernst

Top Contributor
>
>Das ist Java, wenn man Strings braucht, nutzt man Strings (die man nicht händisch terminieren muss) ;)
>
Ok, ich will aber - zu Testgründen - mal mit Char-Arrays arbeiten.
>
>Edit: 0 Bzw \0 in nem char-Array bringen nichts, wenn man es in einen String umwandelt
>
Angenommen, man hat ein Feld:
char[] feldChar = new char[1000];
das komplett mit Zeichen gefüllt ist (z.B. mit Gedichten)
Ich will jetzt die ersten zwei Zeichen "ausgeben".
Ich mache Folgendes:
feld[2] ='\0';
Welche Java-Methoden nutzen dieses \0 ?
D.h. zum Beispiel:
- Ausgabe der Zeichen bis \0 auf dem Bildschirm ?
- Umwandeln der Zeichen bis \0 in einen String ?
usw.

mfg
Ernst
 

mrBrown

Super-Moderator
Mitarbeiter
>
Angenommen, man hat ein Feld:
char[] feldChar = new char[1000];
das komplett mit Zeichen gefüllt ist (z.B. mit Gedichten)
Ich will jetzt die ersten zwei Zeichen "ausgeben".
Ich mache Folgendes:
feld[2] ='\0';
Welche Java-Methoden nutzen dieses \0 ?
D.h. zum Beispiel:
- Ausgabe der Zeichen bis \0 auf dem Bildschirm ?
- Umwandeln der Zeichen bis \0 in einen String ?
usw.

Keine (zumindest keine mir bekannten aus java.lang).

Das wirst du händisch lösen müssen. (und ehrlich gesagt fällt mir kein Zweck dafür ein, außer den C-Weg in Java umsetzen zu wollen)
 

mrBrown

Super-Moderator
Mitarbeiter
Also wird \0 in Java _nicht_ zur Terminierung eines Char-Arrays benutzt.
Ist das richtig ?

mfg
Ernst
Es wird auch in C nicht zur Terminierung von char-Arrays benutzt, sondern zur Terminierung von char-Arrays, die Strings darstellen.

Und ja, in Java ist das nicht nötig, sowas händisch zu machen . Arrays (und damit auch Strings) haben eine feste Länge, man muss deren Ende nicht anzeigen, weil man ehh nicht drüber hinaus lesen und schreiben könnte.
 

Tobse

Top Contributor
Und ja, in Java ist das nicht nötig, sowas händisch zu machen . Arrays (und damit auch Strings) haben eine feste Länge, man muss deren Ende nicht anzeigen, weil man ehh nicht drüber hinaus lesen und schreiben könnte.

Ich denke es ist mal wichtig zu erwähnen, warum das so ist. In C ist ein String ja meistens ein char*. Die Syntax charArray[index] ist nur Sugar für *(charArray + index * sizeof(char)). In Java selbst gibt es aber keine Pointerarithmetik. In Java ist jedes Array ein struct aus der Länge des Arrays und einem Pointer zum ersten Eintrag. Die JVM macht die Pointer-Arithmetik und überprüft bei jedem Zugriff, dass der Index kleiner als die Größe des Arrays ist. Ist das nicht der Fall, fliegt eine ArrayIndexOutOfBoundsException.

Strings in Java sind vollwertige Objekte. Wenn dir das noch kein Begriff ist, kläre das zuerst. Strings liegen in Java immer auf dem Heap. Jeder String hat ein char[], welches die Buchstaben enthält, die den String darstellen. Ein String wird in Java also nicht terminiert; die Größe ist immer gespeichert und man kann auch nur innerhalb der Größe darauf zugreifen; ein Terminierendes Spezial-Byte ist nicht nötig.

Wenn du C++ kennst: Der Java String ist sehr ähnlich zum std::string in C++, welcher im Endeffekt ja auch ein std::vector<char> ist.

Als kleines Beispiel: In Java kann ein String problemlos \0 enthalten (anders als in C natürlich):

Java:
String s = "abc\u0000def";
assert s.length() == 7;

Wohingegen in C ja folgendes auftritt:
C:
char* s = "abc\u0000def"
println(strlen(s)); // gibt 3 aus
 

ernst

Top Contributor
Hallo Tobse,
Danke für die Infos.
Strings in Java sind vollwertige Objekte. Wenn dir das noch kein Begriff ist, kläre das zuerst. Strings liegen in Java immer auf dem Heap....
[/CODE]
Beispiel:
char[] feldChar = new char[1000];
So wie ich das verstehe befindet sich dann in der Variable feldChar eine Adresse, die auf dem Stack liegt.
Diese Adresse zeigt auf die Zeichenfolge (String), die auf dem Heap liegt.
Ist das so korekt ?

mfg
E
 

Tobse

Top Contributor
Nein, das stimmt so nicht.

Auf dem Heap liegt dann soetwas:

C:
struct CharArray {
   int size;
   char* first;
}

In der Variable feldChar (auf dem Stack) liegt dann ein Pointer auf dieses Datenstruktur (auf dem Heap). Ich kenne da die genauen Verhältnisse nicht; aber von der Semantik her ist es genau das.

EDIT:
Mit Strings verhält es sich nochmal anders:

Schreibst du in Java
Java:
String s = "foo";

Dann wird eine neue* Instanz hiervon auf den Heap gelegt:

Code:
struct String {
    CharArray* chars;
    // .. womöglich weitere Daten, weiss ich nicht ...
}

In der Stack-Variable s ist dann ein Pointer auf diese Datenstrukur im Heap.

---
* Die JVM versucht zu erreichen, dass jeder String nur einmal im Heap liegt. Das klappt nicht immer, aber in c.a. 80% der Fälle. Wenn du einen String anlegst schaut die JVM also erstmal in den Heap. Wenn da schon ein String liegt der identisch zu dem neuen ist, wird einfach der existierende referenziert.
Strings sind in Java immutable. Ein String kann nicht verändert werden, wenn er einmal angelegt wurde. Alle String-Manipulationen haben eine neue String Instanz zur folge (oder eine Referenz auf einen bestehenden, identischen).
 
Zuletzt bearbeitet:

ernst

Top Contributor
Hallo Tobse,
Nein, das stimmt so nicht.
Auf dem Heap liegt dann soetwas:
C:
struct CharArray {
   int size;
   char* first;
}
In der Variable feldChar (auf dem Stack) liegt dann ein Pointer auf dieses Datenstruktur (auf dem Heap).
und first zeigt dann auf die endgültige Zeichenfolge, die auf dem Heap liegt.
Ist das korrekt ?


EDIT:
Mit Strings verhält es sich nochmal anders:
Schreibst du in Java
Java:
String s = "foo";
Dann wird eine neue* Instanz hiervon auf den Heap gelegt:

Code:
struct String {
    CharArray* chars;
    // .. womöglich weitere Daten, weiss ich nicht ...
}
In der Stack-Variable s ist dann ein Pointer auf diese Datenstrukur im Heap.
und chars zeigt dann auf die endgültige Zeichenfolge, die auf dem Heap liegt.
Ist das korrekt ?

mfg
E
 

mrBrown

Super-Moderator
Mitarbeiter
und first zeigt dann auf die endgültige Zeichenfolge, die auf dem Heap liegt.
Ist das korrekt ?
Ja

und chars zeigt dann auf die endgültige Zeichenfolge, die auf dem Heap liegt.
Ist das korrekt ?
Nein, chars zeigt auf ein CharArray, in dem first auf die Zeichenkette zeigt.

Wobei, wenn ichs richtig im Kopf hab, String noch mal eigene Indizes für die Zeichenkette hat, sodass es sein kann, das der eigentliche String erst in der Mitte des Arrays beginnt und schon vor Ende des Arrays endet.
 
X

Xyz1

Gast
Deswegen hinkt der Vergleich von @Tobse auch gewaltig (und stinken tut er auch noch) - aber das habe ich schon in dem anderen Thema geschrieben.
Strings sind nichts als Klassen, mit ein paar Eigenschaften...
 

Meniskusschaden

Top Contributor
Deswegen hinkt der Vergleich von @Tobse auch gewaltig (und stinken tut er auch noch) - aber das habe ich schon in dem anderen Thema geschrieben.
So abwegig finde ich den Vergleich eigentlich nicht.
Strings sind nichts als Klassen, mit ein paar Eigenschaften...
Aber eine dieser Eigenschaften ist eben ein Char-Array:
Java:
public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];
...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Präzedenregeln in Java sagen, dass +expr und -expr vor + von Addition und - von Addition stehen, warum wird dann z. B. a+b als eine Addition ausgeführ Java Basics - Anfänger-Themen 7
M Java Spiel wie Wer wird Millionär Java Basics - Anfänger-Themen 1
T In C:\java\bin wird kein javac angezeigt. Java Basics - Anfänger-Themen 1
B Java ist / wird kostenpflichtig. Ein paar Fragen Java Basics - Anfänger-Themen 1
D JAVA JDK korrekt installieren javac wird nicht gefunden Java Basics - Anfänger-Themen 2
Zrebna Compiler-Fehler Java-Compiler wird nach 'javac' keyword-Eingabe nicht gestartet (Erste Übung) Java Basics - Anfänger-Themen 18
F Java int-Wert wird resetet Java Basics - Anfänger-Themen 21
D Java Applet wird nicht im Browser angezeigt Java Basics - Anfänger-Themen 6
A Erste Schritte Java Output wird nicht angezeigt Java Basics - Anfänger-Themen 7
T Java Methode wird unerwünscht doppelt aufgerufen?! Java Basics - Anfänger-Themen 4
D Wer wird Millionär ? BlueJ Java Java Basics - Anfänger-Themen 2
W Java wird nicht erkannt Java Basics - Anfänger-Themen 1
Fab1 alte Java Datei wird ausgeführt (trotz Änderung) Java Basics - Anfänger-Themen 4
K Wofür wird heute noch die Stack Klasse in Java genutzt Java Basics - Anfänger-Themen 4
P Problem- Java Applet wird nicht ausgeführt Java Basics - Anfänger-Themen 9
F java.util.scanner wird übersprungen Java Basics - Anfänger-Themen 9
I Java - Text in neuem Frame wird nicht angezeigt Java Basics - Anfänger-Themen 4
T Erste Schritte Java Applet wird nur geladen Java Basics - Anfänger-Themen 3
M Java-Programm wird beendet, wenn ich Spiel öffne... Java Basics - Anfänger-Themen 11
D Java wird nicht ausgeführt (eclipse) Java Basics - Anfänger-Themen 3
S wie wird die java plattformunabhängigkeit realisiert? Java Basics - Anfänger-Themen 2
D OOP Vererbungshierarchie: Wie wird sie in Java ausgezeichnet Java Basics - Anfänger-Themen 6
X Die Java-Community, in der einem garantiert geholfen wird. Java Basics - Anfänger-Themen 4
F Java wird nicht gestartet Java Basics - Anfänger-Themen 3
K Prob mit java.util.regex.matches-String wird nicht erkannt? Java Basics - Anfänger-Themen 9
L Java Applet/Script wird nicht angezeigt. Java Basics - Anfänger-Themen 3
N Java wird nicht ausgeführt obwohl nötige Pfade gesetzt sind Java Basics - Anfänger-Themen 5
L Eingabe von "java programm x", x wird im programm Java Basics - Anfänger-Themen 2
K Warum wird mir auf der Konsole des Servers nicht "xxxx" angezeigt (Server/Client) Java Basics - Anfänger-Themen 4
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
I Exception wird gefangen, aber trotzdem in Error Log? Java Basics - Anfänger-Themen 10
H JDK installieren jdk-21 wird nicht erkannt Java Basics - Anfänger-Themen 13
T if-else Bedingung wird ignoriert Java Basics - Anfänger-Themen 4
K Warum wird mir "Empfangen vom Client:" nicht sofort ausgegeben(Server/Client) Java Basics - Anfänger-Themen 3
P Webseite vom Smartmeter wird nur unleserlich angezeigt Java Basics - Anfänger-Themen 7
A Warum wird mein jdk nicht gefunden? Java Basics - Anfänger-Themen 3
J jar Befehl wird nicht erkannt Java Basics - Anfänger-Themen 7
M Anonyme Klassen - Warum wird in der Konsole nichts ausgegeben? Java Basics - Anfänger-Themen 1
T catch(InputMismatchException) wird nicht ausgefürt/erkannt Java Basics - Anfänger-Themen 12
berserkerdq2 Intelij, wie kann ich einstellen, dass die aktuelle Klasse ausgeführt wird, wenn ich aufs Startsymbol drücke, gibts da eine Tastenkombination? Java Basics - Anfänger-Themen 11
M Verständnisfrage: Warum wird die Datei ohne Inhalt übertragen Java Basics - Anfänger-Themen 3
Ostkreuz Wieso wird die Methode nochmal aufgerufen? Java Basics - Anfänger-Themen 5
Oneixee5 Maven Plugin wird 2 mal ausgeführt Java Basics - Anfänger-Themen 10
R Compiler-Fehler Variable wird nicht gefunden bzw. erkannt? Java Basics - Anfänger-Themen 2
D Interface Methode wird ungewollt in der Subklasse überschrieben Java Basics - Anfänger-Themen 5
C Was tun wenn .class erwartet wird ? Java Basics - Anfänger-Themen 6
T Meine Klasse wird nicht gefunden Java Basics - Anfänger-Themen 1
T Wie kann man es machen das ein Objekt nicht übermalt wird Java Basics - Anfänger-Themen 2
K Warum wird mir hier nach dem ersten Durchlauf zwei mal "welchen Datentyp wollen sie übergeben?" ausgegeben ? Java Basics - Anfänger-Themen 1
MiMa Ungültiges Datum wird nicht erkannt ?? Java Basics - Anfänger-Themen 6
schemil053 Multithread - Input verrutscht während etwas ausgegeben wird Java Basics - Anfänger-Themen 6
K REGEX - Rechnungsbetrag wird nicht richtig ausgelesen. Java Basics - Anfänger-Themen 3
_user_q Timer - ScheduledExecutorService wird schon vorher beendet Java Basics - Anfänger-Themen 5
X Erste Schritte Scanner eingabe wird übersprungen Java Basics - Anfänger-Themen 4
H Compiler-Fehler Klasse in einem Package wird nicht gefunden bzw. akzeptiert Java Basics - Anfänger-Themen 12
L Switch-Case Multiplikation wird nicht ausgegeben Java Basics - Anfänger-Themen 1
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 0
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 5
M Text wird in der Console nicht ausgegeben. Java Basics - Anfänger-Themen 11
I Methoden Wieso wird mein Array "a" verändert und meine Variable "a" nicht? Java Basics - Anfänger-Themen 4
S Datei anlegen Problem! Groß- und Kleinschreibung wird nicht unterschieden Java Basics - Anfänger-Themen 4
sserio Zweidimensionales Array [][] wird untereinander ausgegeben Java Basics - Anfänger-Themen 14
sserio Math. Befehl wird rot markiert Java Basics - Anfänger-Themen 5
M Rechteck wird nicht angezeigt Java Basics - Anfänger-Themen 3
B Bungeecord | ProxiedPlayer wird nicht in ArrayList hinzugefügt Java Basics - Anfänger-Themen 1
U Methode wird genutzt, ohne dass ich die aufrufe? Java Basics - Anfänger-Themen 4
S Methoden Return Rückgabewert wird nicht übergeben Java Basics - Anfänger-Themen 8
M Mein quellcode wird nicht in der Konsole ausgegeben Java Basics - Anfänger-Themen 3
I Code wird nicht ausgeführt Java Basics - Anfänger-Themen 2
M wird der Konstruktor nicht als 1. ausgeführt? Java Basics - Anfänger-Themen 13
G Main Methode wird beim ersten Aufruf nicht richtig ausgeführt Java Basics - Anfänger-Themen 1
M Was wird hier genau getestet? Java Basics - Anfänger-Themen 9
M Wie schreibe ich eine if-Verzweigung um, so dass ein Bedingungsoperator benutzt wird? Java Basics - Anfänger-Themen 9
I Programm erkennt nicht an das Array zurückgegeben wird trotz Initialisierung *einfach* Java Basics - Anfänger-Themen 9
K Jlabel mit itemlistevent Text gegeben, wird nicht angezeigt Java Basics - Anfänger-Themen 5
P Mein Programm wird zwar erfolgreich Compiliert, öffnet sich aber nicht Java Basics - Anfänger-Themen 6
M Referenzen zuweisen und wird gleichzeitig ausgeführt Java Basics - Anfänger-Themen 6
O System.out.println wird nicht ausgegeben? Java Basics - Anfänger-Themen 11
Zrebna Umgebungsvariable Wieso wird meine verwendete JDK-Version in der Prompt nicht erkannt? Java Basics - Anfänger-Themen 6
el_pato DialogFenster wird nicht in Schleife geöffnet? Java Basics - Anfänger-Themen 30
J if-Schleife innerhalb einer if-Schleife wird in der Konsole nicht gelesen Java Basics - Anfänger-Themen 4
P Apache Derby wird in Eclipse trotz Anbindung nicht gefunden Java Basics - Anfänger-Themen 6
H Array wird als Rückgabewert nicht akzeptiert? Java Basics - Anfänger-Themen 2
Poppigescorn scan.nextInt() wiederholen bis eine Zahl eingeben wird Java Basics - Anfänger-Themen 7
F Session wird mehrfach erzeugt Java Basics - Anfänger-Themen 11
F Initialisieren eines Web-Mp3 Players in Tabs durch "booleans" erst wenn Tab geöffnet wird ...? Java Basics - Anfänger-Themen 1
fuerteb Compiler-Fehler Methode wird nicht bzw. als Fehler erkannt Java Basics - Anfänger-Themen 4
L JScrollPane wird nicht angezeigt Java Basics - Anfänger-Themen 10
D Hilfe beim Erzeugen eines Arrays NullPointerException wird ausgelöst Java Basics - Anfänger-Themen 11
J JTable Titel wird nicht angezeigt Java Basics - Anfänger-Themen 6
krgewb Long wird gerundet Java Basics - Anfänger-Themen 2
Zwanglos Warum wird nur die erste Zeile im while Block ausgeführt? Java Basics - Anfänger-Themen 8
F Wieso wird immer die falsche Mausposition angegeben? Java Basics - Anfänger-Themen 1
H GridPane wird nicht angezeigt Java Basics - Anfänger-Themen 0
M Was habe ich hier falsch, dass wenn ich z.B.: 11 eingebe mir false zurück gegeben wird? Java Basics - Anfänger-Themen 2
H Endkapital wird nicht korrekt ausgegeben. Java Basics - Anfänger-Themen 5
C Methodenrückgabe wird in der main nicht berücksichtigt Java Basics - Anfänger-Themen 2
X compareTo Methode wird ignoriert Java Basics - Anfänger-Themen 7
kodela Hauptklasse wird nicht gefunden Java Basics - Anfänger-Themen 3
H Befehl wird nicht ausgeführt - System.out.println Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben