Array Speicherplatz berechnen

jezzy

Aktives Mitglied
Hallo, ich habe ein programm geschrieben das mit einer Schleife das char-Array vollständig am bildschirm ausgibt, der Inhalt des arrays zeichen ist "Lerne Java". Jetzt muss ich die Frage beantworten ob ich in dem array zeichen "Java lernen" einspeichern kann. Geht das oder nicht? Und dann soll ich noch sagen wie viel Speicherplatz das array belegt. Und der Lehrer will jetzt das ich eine Rechnung angebe, wie berechne ich das?
 

mrBrown

Super-Moderator
Mitarbeiter
ich vermutte mal du meinst ArrayList?
Mit char-Array ist vermutlich eher ein [/icode]char[][/icode] gemeint, und keine ArrayList<Character>

Jetzt muss ich die Frage beantworten ob ich in dem array zeichen "Java lernen" einspeichern kann.
Wenn du bereits die Funktion, die das ausgibt, geschrieben hast, sollte das doch leicht zu beantworten sein? =)

Und dann soll ich noch sagen wie viel Speicherplatz das array belegt. Und der Lehrer will jetzt das ich eine Rechnung angebe, wie berechne ich das?
Kannst du die Aufgabe mal zeigen?

Speicherplatz im Sinne von "wie viel bytes im RAM" ist alles andere als einfach, deshalb wird das vermutlich nicht gemeint sein?
 

jezzy

Aktives Mitglied
Java:
package Uebung5;

public class aufgabe1a {

    public static void main(String[] args) {
        
        char [] zeichen={'L','e','r','n','e',' ','J','a','v','a' };
        
        for(int i=0; i<zeichen.length; i++){
            System.out.println(zeichen[i]);
        }
}
}


das ist das Programm, und dann kommt die Frage
(b) Wäre es auch möglich den Text „Java lernen“ in dem Array zeichen zu speichern?
und
(c) Wie viel Speicherplatz belegt dieses Array?

ich weiss nicht genau was er meint aber dann kommt Fügen sie eine Rechnung ein.
 

TM69

Bekanntes Mitglied
Du dir denn? :) Die zitierte Antwort ist nämlich weder genau noch korrekt..
Ich hatte dich nicht gemeint, sondern den TE. Deine Ausführung stand da noch nicht, als ich es geschrieben hatte, aber ich gebe dir vollkommen Recht, er meinte wohl eher char[]. Und dann heist es einfach nur Zeichen Zählen und mit 2 multiplizieren, da 1 char 2 bytes groß ist.

Dieses bedeutet allerdings auch nicht unbedingt, dass jede Darstellung eines Zeichen 2 Bytes lang ist.
Tatsächlich reservieren viele Codierungen nur 1 Byte für jedes Zeichen.

Wird der Konstruktor wie folgt aufgerufen
Code:
String(byte[])Konstruktor aufrufen
wird standmässig byte[] Codierung verwendet.

Da die Plattform-Standardcodierung normalerweise eine 1-Byte-Codierung wie ISO-8859-1 oder eine Codierung variabler Länge wie UTF-8 ist kann ein Zeichen für 1 Zeichen 1 Byte angenommen werden.

ALLERDINGS, Wenn du diesen Code auf einer Plattform ausführst, UTF-16 oder UTF-32 oder ... als Plattform-Standardcodierung verwendet, erhälst sind es mehr als 1 Bytze pro Zeichen.

Ich glaub darauf wollte @mrBrown mit "Und zusätzlich bedenken, wie groß ein char ist" hinaus.

@jezzy Du siehst es kommt auf die Kodierung an, und dazu hast du dich noch nicht ausgelassen.

Deshalb würde ich persönlich, bei der Lösung dabei schreiben: "Unter der Annahme die Codierung ISO-8859-1 oder UTF-8, betägt der Speicherverbrauch <Anzahl der Zeichen> Bytes"
 
Zuletzt bearbeitet:

TM69

Bekanntes Mitglied
Nicht mehr :) https://openjdk.java.net/jeps/254 - EDIT: ändert natürlich nichts daran, dass ein char trotzdem noch 2 Byte lang ist :)
Ok, ich hab es mir gerade durchgelesen, also das gilt ab Java 9, meiner persönlichen Erfahrung nach arbeiten allerdings noch viele mit Java 8.
Was ich nur nicht so ganz verstehe ist, wie soll ein Flag dabei helfen die Codierung zu verkleinern. Hast du damit schon Erfahrung? Und soweit ich den Text verstanden habe wird pro Zeichen

1 Byte + 1 Bit

gerechnet.
 

mihe7

Top Contributor
Was ich nur nicht so ganz verstehe ist, wie soll ein Flag dabei helfen die Codierung zu verkleinern.
Naja, bis Java 8 wurden Strings intern immer mit einem char-Array (UTF-16) kodiert -> 2 Bytes/Zeichen. Statt des char-Arrays wird jetzt ein Byte-Array verwendet und die Kodierung angegeben. Lässt sich ein String mit ISO-8859-1 kodieren, wird der intern ab Java 9 auch so abgelegt -> 1 Byte/Zeichen.
 

TM69

Bekanntes Mitglied
Ja das hab ich verstanden, was ich meinte war wie kann durch 1 Bit (das Codeflag) den Zeichenraum z.B. für UTF-16 abdecken? Da UTF-16 ein multilingualer Zeichenstring ist und die Zeichenkodierung von 0000 bis FFFF geht - man denke nur mal an die zig tauschend (für das westliche Auge, teilweise täuschend ähnlichen Zeichen, deshalb so geschrieben) Zeichen aus dem Chinesischen. Das habe ich nicht verstanden.
 

mihe7

Top Contributor
Ein Flag für den gesamten String, nicht für jedes Zeichen. Poplig:
Java:
class OldString {
    char[] data;
}

class PopelString {
    byte[] data;
    boolean isoEncoded;
}
Das Flag zeigt einfach an, ob die Bytes in data UTF-16 oder ISO-8559-1 kodiert sind.
 

TM69

Bekanntes Mitglied
Ein Flag für den gesamten String, nicht für jedes Zeichen. Poplig:
Java:
class OldString {
    char[] data;
}

class PopelString {
    byte[] data;
    boolean isoEncoded;
}
Das Flag zeigt einfach an, ob die Bytes in data UTF-16 oder ISO-8559-1 kodiert sind.
jep, hast recht, hatte ich dann auch gesehen. Meine Frage ist allerdings noch nicht beantwortet, falls du weist wie es geht: Wie schafft man es einen Zeichenvorraten #0000 - #ffff in 1 Byte abzulegen. (Gerad keine Lust / Zeit (arbeite gerad an meinem Projekt)) danach zu googlen :D:D:D
 

mrBrown

Super-Moderator
Mitarbeiter
Ich hatte dich nicht gemeint, sondern den TE. Deine Ausführung stand da noch nicht, als ich es geschrieben hatte, aber ich gebe dir vollkommen Recht, er meinte wohl eher char[]. Und dann heist es einfach nur Zeichen Zählen und mit 2 multiplizieren, da 1 char 2 bytes groß ist.
Ich bezog mich auch nur auf die von dir zitierten Antwort von Stackoverflow, die unabhängig von diesem Thread weder genau noch richtig ist :)

Dass es für diesen Thread vollkommen irrelevant ist, kommt nur noch zusätzlich dazu.

Wird der Konstruktor wie folgt aufgerufen
Code:
String(byte[])Konstruktor aufrufen
wird standmässig byte[] Codierung verwendet.

Da die Plattform-Standardcodierung normalerweise eine 1-Byte-Codierung wie ISO-8859-1 oder eine Codierung variabler Länge wie UTF-8 ist kann ein Zeichen für 1 Zeichen 1 Byte angenommen werden.

ALLERDINGS, Wenn du diesen Code auf einer Plattform ausführst, UTF-16 oder UTF-32 oder ... als Plattform-Standardcodierung verwendet, erhälst sind es mehr als 1 Bytze pro Zeichen.
Großes Nein.

Strings in Java sind bis Java 8 immer UTF-16, völlig egal, wie die Plattform-Standardcodierung ist.
Die Standardcodierung ist nur relevant, wenn man einen String aus einem byte-Array erzeugt, dabei wird das byte-Array in ein char-Array umgewandelt.

Geändert hat sich das, wie @mihe7 und @Meniskusschaden erklärt haben, mit Java 9. Das ist dann allerdings nicht als Ganzes eine variable Codierung, sondern entweder eine variable mit UTF-16 (mit 2 oder 4 byte) oder eine feste mit Latin-1 (1 byte, "abgeschnittenes UTF-16") - und auch das hat nichts mit der Plattform-Standardcodierung zu tun.

Und das gilt natürlich alles nur für Strings, nicht für char-Arrays - die bestehen immer aus chars.
 

jezzy

Aktives Mitglied
also ist das char[]zeichen={'L','e','r','n','e',' ','J','a','v','a' } 18 bit lang oder 9 bit. Wird das leerzeichen eig mitgezählt oder nicht?
 

TM69

Bekanntes Mitglied
Gar nicht. Wie kommst Du darauf?
Ach dann hatte ich dich falsch verstanden, dachte du hättest geschrieben, das ein multilingual character nur 1 Byte braucht, deshalb hatte mich das schon verwundert und wollte daher wissen, wie DU dieses schaffen willst.

Sry my fail! - war halt noch früh am Morgen, da war ich noch nicht so ganz wach :D:D:D
 
K

kneitzel

Gast
also ist das char[]zeichen={'L','e','r','n','e',' ','J','a','v','a' } 18 bit lang oder 9 bit. Wird das leerzeichen eig mitgezählt oder nicht?
Ja, das Leerzeichen ist auch ein Zeichen und wird daher mitgezählt. Daher sind das 10 Zeichen und nicht 9. Und 2 Byte pro Zeichen wären dann 20 Byte.
 

mihe7

Top Contributor
Ach dann hatte ich dich falsch verstanden, dachte du hättest geschrieben, das ein multilingual character nur 1 Byte braucht, deshalb hatte mich das schon verwundert und wollte daher wissen, wie DU dieses schaffen willst.

Sry my fail! - war halt noch früh am Morgen, da war ich noch nicht so ganz wach :D:D:D
NP, ich war auch noch im Halbschlaf und deswegen auch zuerst überlesen, dass es um char und nicht um String geht :)
 

Vega1

Mitglied
Eine Näherung könnte sein 172:
Java:
import com.sun.jna.Native;

public class MySize {
	public static int sizeInByte(String s) {
		return s.toCharArray().length * Native.getNativeSize(char.class) + 150;
	}

	public static void main(String[] args) {
		System.out.println(sizeInByte("Java lernen"));
	}
}
"Java lernen" beinhaltet 11 Zeichen, also immer 22 byte, und 100 bis 200 byte werden normalerweise als Array Overhead angenommen. Die euch gestellte Frage ist aber eigentlich recht witzlos, da sie nicht beantwortet werden kann...
 

Vega1

Mitglied
Klares Nö, man kann sich glaube ich immer i welche Sonderfälle herauspicken. Das stellt dann nicht den Normalfall dar. Jedenfalls würde ich 34 byte nicht als valide Antwort akzeptieren.
 

thecain

Top Contributor
Zum Glück bist auch nicht du gefragt. Ans Niveau der Fragestellung bzw des TEs angepasst, ist 20 byte bestimmt die erwartete Antwort.
 

mrBrown

Super-Moderator
Mitarbeiter
Zum Glück bist auch nicht du gefragt. Ans Niveau der Fragestellung bzw des TEs angepasst, ist 20 byte bestimmt die erwartete Antwort.
Ja, da dürften 20 vollkommen richtig sein :)


Klares Nö, man kann sich glaube ich immer i welche Sonderfälle herauspicken. Das stellt dann nicht den Normalfall dar. Jedenfalls würde ich 34 byte nicht als valide Antwort akzeptieren.
Man braucht sich gar keine Sonderfälle herauspicken, die Normalfälle kann man sich ziemlich leicht berechnen.

Minimal (32bit-VM, <=4-byte Datentyp):
8 Byte Header + 4 Byte für die Array-Länge = 12 Byte "Overhead"

Maximal (64bit-VM, keine compressed oops, 8-byte Datentyp):
16 Byte Header + 4 Byte für die Array-Länge + 4 Byte Padding = 24 Byte "Overhead"


Falls das zu kompliziert für dich sein sollte oder du trotzdem an "100 bis 200 byte [...] als Array Overhead" festhalten möchtest, darfst du gerne erklären, woher die 200 Byte kommen :)
 

Vega1

Mitglied

thecain

Top Contributor

mrBrown

Super-Moderator
Mitarbeiter
Lol, weil die minimal benötigten 11*2 byte ja auch 20 ergeben.

Lol, weil das Array auch 11 Zeichen enthält.

Garbage Collection Overhead vergessen.
Lol, und du hast in deiner Berechnung das Betriebsystem und die JVM vergessen, also wenn schon dann richtig: etwa 461Mb Array Overhead.

Kein Array ist um 100-200 Byte Größer, nur weil es GC gibt. Die genaue Größe des Array-Objects kann man berechnen, und da gehört irgendein GC-Overhead garantiert nicht mit rein.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Array verkleinern Java Basics - Anfänger-Themen 2
J Array aus Numberfield Eingaben Java Basics - Anfänger-Themen 7
D Array List mit Objekten sortieren Java Basics - Anfänger-Themen 2
onlyxlia Anzahl Random Zahlen mit Scanner abfragen und in Array speichern Java Basics - Anfänger-Themen 10
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
Ü Zweidimensionales Array in der ersten Zeile deklarieren Java Basics - Anfänger-Themen 13
Thomas Uppe 2D Array Reihenfolge vermischen Java Basics - Anfänger-Themen 4
T array auslesen Java Basics - Anfänger-Themen 2
Nitrogames Variablen Variable aus JOptionPane Abfrage in Array einfügen Java Basics - Anfänger-Themen 4
moini Auf Array aus Superklasse zugreifen? Java Basics - Anfänger-Themen 2
J ArrayList in 2D-Array konvertieren. Java Basics - Anfänger-Themen 48
M NullPointerException: Cannot read the array length because "this.Kinder" is null Java Basics - Anfänger-Themen 1
P Wieso kann ich als Index für einen Array einen Char angeben? Java Basics - Anfänger-Themen 3
Finn_lol Fehlermeldung bei Schleife mit Array Java Basics - Anfänger-Themen 4
Proxy Chars vor array übergabe toLowerUpcase Java Basics - Anfänger-Themen 14
iAmFaiinez Primzahlen Tester ohne Array Java Basics - Anfänger-Themen 4
S array 2 dimensional treppe Java Basics - Anfänger-Themen 3
S Array 2x2 Blöcke mit 0 und 1 Java Basics - Anfänger-Themen 10
C Array von Klassen Java Basics - Anfänger-Themen 2
julian0507 2Dim-Array Spaltensummen Java Basics - Anfänger-Themen 1
XWing Doppelte Zahlen im Array Java Basics - Anfänger-Themen 8
melisax Java 2D-Array Tabelle Java Basics - Anfänger-Themen 4
melisax Java Array Wert an bestimmtem Index angeben Java Basics - Anfänger-Themen 14
W Items löschen aus String Array vom Custom Base Adapter Java Basics - Anfänger-Themen 2
Proxy Stack erweitern mit neuem Array falls der alte voll ist!? Java Basics - Anfänger-Themen 5
E Array, nächste Zahl zur 5 ausgeben, wie? Java Basics - Anfänger-Themen 42
J Array.list vergleichen Java Basics - Anfänger-Themen 1
W Java-Code mit Array Java Basics - Anfänger-Themen 14
D Reflections & Generisches Array Java Basics - Anfänger-Themen 4
T Array Java Basics - Anfänger-Themen 2
T Array Java Basics - Anfänger-Themen 15
T Wörteranzahl im Array zählen Java Basics - Anfänger-Themen 9
Ostkreuz Zweidimensionaler Array Index Java Basics - Anfänger-Themen 2
S String Array Buchstaben um einen gewissen Wert verschieben Java Basics - Anfänger-Themen 4
R Images aus einem Array ausgeben Java Basics - Anfänger-Themen 3
R 2d Array individuell machen Java Basics - Anfänger-Themen 4
D 2D Char Array into String Java Basics - Anfänger-Themen 2
J Array Median bestimmen Java Basics - Anfänger-Themen 6
S Array Maximum bestimmen mit for und foreach Java Basics - Anfänger-Themen 7
S Prüfen ob ein zweidimensionales Array rechteckig ist Java Basics - Anfänger-Themen 4
N Array Java Basics - Anfänger-Themen 1
J Array Mittleren Wert bestimmen Java Basics - Anfänger-Themen 2
D OOP Array einem Objekt zuweisen Java Basics - Anfänger-Themen 2
O Zahlen aus einem char-array per char + Zeichen addieren Java Basics - Anfänger-Themen 2
S leeres Array statt Null Pointer Exception ausgeben Java Basics - Anfänger-Themen 20
S Inhalte aus Array vergleichen und Max ausgeben Java Basics - Anfänger-Themen 3
M 2d array ohne längen anlegen Java Basics - Anfänger-Themen 4
S Bestimmte werte aus einem Array löschen Java Basics - Anfänger-Themen 2
S Ausgeben wie oft ein Wert in einem Array vorkommt Java Basics - Anfänger-Themen 7
E Reihenfolge der Werte umdrehen (mittels statischem int-Array Java Basics - Anfänger-Themen 3
O 2 Dimensionales Array Java Basics - Anfänger-Themen 6
M Bubble Sort - Int[] Array sortieren Java Basics - Anfänger-Themen 2
javaBoon86 Array mehrere Dimensionen Java Basics - Anfänger-Themen 10
B Array nach Elementwerten sortieren? Java Basics - Anfänger-Themen 1
B Explizit Array definieren geht nicht? Java Basics - Anfänger-Themen 14
D Kleinste Zahl in Array finden die vorher noch errechnet werden müssen. Java Basics - Anfänger-Themen 4
L Gegebenes Array sortieren, indem zufällige Zahlenpaare aus Array ausgewählt werden Java Basics - Anfänger-Themen 14
Say 2-DIM Array Code lesen und verstehen Java Basics - Anfänger-Themen 5
N Array beim erstellen mit Werten füllen Java Basics - Anfänger-Themen 6
C Java Array Struktur, welche ist wann besser? Java Basics - Anfänger-Themen 12
Temsky34 Array IndexOf nicht verfügbar Java Basics - Anfänger-Themen 18
belana wie am besten 2D Array von String to Integer Java Basics - Anfänger-Themen 18
S Array mit Methode löschen Java Basics - Anfänger-Themen 2
J Java To String Methode, Array mit For-Schleife Java Basics - Anfänger-Themen 2
E Durch Muster in Array iterieren Java Basics - Anfänger-Themen 3
L Frage zum Array Java Basics - Anfänger-Themen 1
C 2D Array Ausgabe mit for-Schleife i,j Java Basics - Anfänger-Themen 4
D Methode: Array Reihenfolge tauschen Java Basics - Anfänger-Themen 3
julian0507 Array aus Methode in anderer Methode sichtbar machen Java Basics - Anfänger-Themen 10
P Array vom Typ Klasse Java Basics - Anfänger-Themen 18
Lion.King Array deklarieren und initialisieren Java Basics - Anfänger-Themen 5
P Array-Objekte-Aufruf Java Basics - Anfänger-Themen 22
A CSv.Datei einlesen und die werte in zweidemosional Int Array speichern Java Basics - Anfänger-Themen 9
M Methoden Zweidimensionaler Array mit Setter Methode ändern Java Basics - Anfänger-Themen 4
AkiJou Zeile in 2d Array löschen Java Basics - Anfänger-Themen 2
LilliCherry Array in einer Zeile ausgeben Java Basics - Anfänger-Themen 6
A Elemente in einem Array Java Basics - Anfänger-Themen 5
A Vorkommende Farben ermittel und als Array zurückgeben Java Basics - Anfänger-Themen 7
AhmadSlack Array Java Basics - Anfänger-Themen 7
Jambolo Kartenhand Array Java Basics - Anfänger-Themen 14
ravenz Schleife mit for über String Array „zahlen“und prüfen ob Wert „a“ oder „b“ oder „c“ entspricht (mittels || ) Java Basics - Anfänger-Themen 4
S Eine Variable in einem Array speichern Java Basics - Anfänger-Themen 5
T Methode, die prüft ob in einem Int-Array maximal 2 Zahlen enthalten sind, die größer als ihr Vorgänger sind Java Basics - Anfänger-Themen 5
T String Array Fehler beim Index Java Basics - Anfänger-Themen 3
krgewb byte-Array, das ein Bild repräsentiert Java Basics - Anfänger-Themen 1
1 Array rekursiv durchlaufen Java Basics - Anfänger-Themen 8
I Methoden Wieso wird mein Array "a" verändert und meine Variable "a" nicht? Java Basics - Anfänger-Themen 4
EykS 3D Druckdatei basierend auf 3D Array? Java Basics - Anfänger-Themen 3
sserio Array funktioniert nicht Java Basics - Anfänger-Themen 2
sserio Iterierung über ein zweidimensionales Array Java Basics - Anfänger-Themen 16
sserio Zweidimensionales Array [][] wird untereinander ausgegeben Java Basics - Anfänger-Themen 14
Chris.089 2 Werte im Array tauschen Java Basics - Anfänger-Themen 6
D EinMalEins mithilfe einer for-Schleife und Array Java Basics - Anfänger-Themen 1
L Unbekanntes Problem mit 2d Array Java Basics - Anfänger-Themen 6
L Gridmuster in einem Array Java Basics - Anfänger-Themen 2
sgtcoopa Array übergeben Schleife Java Basics - Anfänger-Themen 0
B Compiler-Fehler Array aus Objekten übergeben Java Basics - Anfänger-Themen 7
padde479 Array Multiplikation der ersten n Zahlen Java Basics - Anfänger-Themen 7
G zweidimensionales int Array sortieren Java Basics - Anfänger-Themen 57
W Array ausgeben Java Basics - Anfänger-Themen 29

Ähnliche Java Themen

Neue Themen


Oben