Java Array ohne Index, speichert Wert einer getBytes Methode.

D

DefconDev

Gast
Code:
import java.util.Scanner;


public class HadesTest {
    public static void main(String[] args) {
       Scanner s= new Scanner(System.in);
       byte []array=new byte[10];
       String a=s.next();
       array=a.getBytes();
       System.out.println(array);
    

    
    }
}

Wieso kann ich in Zeile 9 den Wert einer Methode in ein Array ohne Index-Angabe speichern?

Ich habe es zuvor mit

array[0]=a.getBytes();

versucht , aber das ergibt nur einen Fehler.
 
Ich verstehe nicht woher du weißt dass der Rückgabewert ein byte array ist?

"Encodes this String into a sequence of bytes"
 
Hades85 schrieb:
Ich verstehe nicht woher du weißt dass der Rückgabewert ein byte array ist?

"Encodes this String into a sequence of bytes"

  1. getBytes();
  2. a sequence of bytes
  3. public byte[] getBytes()
 
ja weil, array[0] kein Byte Array ist sondern nur ein Byte. GetByte() liefert aber einen Array. Typensicher, schon mal was davon gehört?
Ein Byte Array ist auf jeden Fall nicht Typengleich wie Byte.

Wenn du schreiben würdest.

Code:
byte [][] array = new array[10][10];
array[0] = a.getBytes();

dann würde es funktionieren, da array[0] selbst ein Byte Array ist.
 
Also aus der englischen Erklärung hätte sich das mir nicht direkt erschlossen, aber danke für die fettgedruckten Wörter.

Nur wieso gibt er mir immer "[B@549d1e83" das aus bzw. was genau passiert bei diesem Vorgang ohne Index angabe?

Also mir ist klar wenn man es über den Index anspricht, dass man die dezimalwerte für die jeweiligen Zeichen bekommt.
Ergänzung ()

roker002 schrieb:
ja weil, array[0] kein Byte Array ist sondern nur ein Byte. GetByte() liefert aber einen Array. Typensicher, schon mal was davon gehört?
Ein Byte Array ist auf jeden Fall nicht Typengleich wie Byte.

Wenn du schreiben würdest.

Code:
byte [][] array = new array[10][10];
array[0] = a.getBytes();

dann würde es funktionieren, da array[0] selbst ein Byte Array ist.

Soweit ich das verstehe, dass er automatisch jedes zeichen in ein array index speichert oder?

Also wenn ich als string "hallo" eingebe, dann speichert er das ins array[0-4].
 
Nein:
Code:
Byte Array[]=new Byte[10];
Ich erstelle eine Variable (Name: Array, Type: Byte[]) und gleichzeitig weiß ich dieser die Adresse eines 10 Byte großen Speichers zu, den ich auch noch gleich mit angefordert habe.
Code:
Array=a.getBytes();
Ich setzte den Wert von Array auf den Rückgabewert von getBytes(), das originale Array wird daher nicht mehr referenziert und irgendwann vom Garbage-Collector aufgeräumt.

Wenn du also "hallo" eingibst, dann ist am Ende Array irgendwas wie 'h','a','l','l','o' (also 5 Bytes groß).

Das "[B@12345" ist das, was du bekommst, wenn du toString() auf ein Objekt aufrufst, welches die Methode nicht überschreibt. [ steht für Array, B für Byte das @ ist ein Trennzeichen und 12345 ist der Hash des Objektes. Wenn du das Array ausgeben willst, musst du daher deine eigene Schleife schreiben.
 
Um Arrays auszugeben hat Java eine Util-Methode
Code:
java.util.Arrays.toString(deinArrayHier)
 
Verstehe immer noch nicht.
"Ich setzte den Wert von Array auf den Rückgabewert von getBytes(), das originale Array wird daher nicht mehr referenziert und irgendwann vom Garbage-Collector aufgeräumt."

Bisher ging ich davon aus dass wenn ich ein array anspreche, dass es ein call by reference ist. Wenn ich also mittels einer for Schleife, den Index durchlaufe von 0-4, bekomme ich die jeweiligen 'h','a','l','l','o'.
 
Java kennt kein call by reference, nur call by value. Du kannst aber direkt auf das referenzierte Objekt zugreifen (a[0] = 'h') ohne mit de/referenzierungsoperatoren arbeiten zu müssen.

Und ja, um eine Array auzugeben brauchst du eine Schleife oder nimmst die Methode von Tumbleweed.

Weiterführende Literatur: Java ist auch eine Insel – 3.8 Arrays
 
@Hades85:
Beispiel:
Code:
Byte Array[]=new Byte[1];
Array[0]='a';
Byte a2[]=Array;
Array="Hallo".getBytes();
System.out.println(Array[0]);
System.out.println(a2[0]);
Ausgabe:
H
a

Weil: Alles, was nicht int, double, short, long, byte, char, float ist, eine Referenz darstellt.
Das bedeutet: Wenn ich in ein Array reinschreiben will, muss ich das "händisch" erledigen. Wenn ich ein Array zuweise (a2=a1), dann weiße ich nicht das Array zu, sondern biege die Referenz von a2 auf das Array von a1.

Das kann tückisch werden, weil wenn ich jetzt den Inhalt von a2 ändere, ändert sich auch der Inhalt von a1, da beide Referenzen auf das gleiche Array zeigen.

Aus diesem Grund bieten viele Objekte die clone()-Methode an, mit der man das gesamte Objekt kopieren kann.
 
Darlis schrieb:
Java kennt kein call by reference, nur call by value.
oh... böses nein!

java arbeit mit call by reference. alle variablen zugriffe sind call by reference (ausser für primitive datentypen).

ABER methodenargumente werden call by value übergeben. hier ist aber zu beachten, dass wenn die arguemnte keine primitiven datentypen sind (int, char, long etc.) sondern Objekte, dann werden die Referenzen by value übergeben, d.h.:
Code:
void method( Object obj ) {
    obj = null;
}

...
obj = new String("bla");
method(obj);

// es gilt weiterhin obj!=null, bzw. obj zeigt auf das obige String-Objekt

also, die objekte werden auch bei methodenparamtern immer noch call by reference übergeben, lediglich die variable selbst, die die referenz enthält wird call by value übermittelt.

wenn man das mal pauschal grob zusammenfassen will, dann ist eher das gegenteil deiner aussage der fall: java arbeitet eigentlich (fast) durchweg call by reference.
 
Wenn die Rückgabe ein byte array zurück gibt, dann erstellst dir einfach ein byte array und überschreibst deine byte array mit dem gelieferten direkt bei der Zuweisung, also da wo man normal erst die Array Größe bestimmen würde. Willst du aber bei zwei vorhandenen Arrays das Eine mit dem Anderen überschreiben, siehe weiter unten im Text.

Code:
		String bla = "bla";
		byte[] ar = bla.getBytes();
		
		for (byte tmp : ar){
			System.out.println(tmp);
		}

Oder du benutzt es direkt, Variablen "cache" brauchst keinen wenn der Zugriff nur einmalig ist:

Code:
		String bla = "bla";
		for (byte tmp : bla.getBytes()){
			System.out.println(tmp);
		}

		System.out.println(bla.getBytes()[0]); // Methode 2

		// Methode 3, wo Variablen lohnen

		for (int i=0; i < bla.getBytes().length; i++){
		          System.out.println(bla.getBytes()[i]);
		}

Pass nur auf falls du das Array klonen willst, dies kann man nicht einfach mit "=" machen, benutz System.arraycopy. Würdest du das in C machen müssen, wüsstest du was da eigentlich passiert.
Es wird erst mal die Größe des vorhandenen Arrays ermittelt (Reihe von Speicherzellen), eine neue gleicher Größe reserviert und dann jeder Wert umkopiert. Ähnliches passiert auch wenn man z.B. Strings mit "+" verbindet, deswegen den StringBuffer nutzen wenn man mehr als 1-2 + Zeichen hat.

Ist komisch in Java da man sich normal nicht darum kümmern muss wie in C, hat was zu tun mit "pass by value" und "pass by reference". Wegen solchen Geschichten wird überhaupt empfohlen C zu lernen, da praktisch alle Sprachen letzen Endes direkt oder indirekt darauf basieren.
 
Zuletzt bearbeitet von einem Moderator:
@Dese:
Ich wiedersprech dir da komplett.
Java ist KOMPLETT Call-By-Value (wie JS). Aber jedes Objekt wird immer nur über eine Referenz/Zeiger angesprochen, also quasi alle Objekte sind im Heap. (Wenn du es nicht glaubst, dann schau mal in die Wiki/Doku/... rein).

@rob-
Methode 3 ist nicht arg gut, weil du die Funktion ja jetzt oft aufrufst, damit müllst du dir nur den Speicher zu.
 
http://www.javaworld.com/javaqa/2000-05/03-qa-0526-pass.html

hancock: ich hatte es verscuht zu erklären. es gibt hier einen unterschied bzgl. was man als value betrachtet.
wenn du c/c++ nimmst und du hast ein objekt als parameter:

void methode( MyClass a )

dann hast du hier ein pass by value. es wird der komplette inhalt von a kopiert.

in java ist:
void methode( MyClass a )

aber ein pass-by-reference aus sicht des objekts. man betrachtet (leider) im allgemeinen java so, als hätte es KEINE pointer. damit ist das da oben ein call-by-reference.

wenn man aber "MyClass a" aber als einen pointer des typs MyClass versteht, dann hat man ein pass-by-value der POINTER/REFERENZ-variable a.

insofern: SYNTAKTISCH werden die objekte PASS-BY-REFERENZ übergeben. aus sicht des kompilers sind es aber nur referenzvariablen, die pass-by-value übergeben werden.

ich hoffe ich konnte mich jetzt klar genug ausdrücken.

edit: ob es pass-by-value oder by reference ist hängt einzig und alleine von der frage ab, ob man "a" defineirt als "MyClass a" als ein Objektvariable versteht oder als eine Pointervariable.

Ich hab mich lange nicht mehr mit solchen nebensächlichkeiten beschäftigt, aber fürher hieß es mal, dass es keine pointer seien sollen. halte ich nicht für sinnvoll, aber wenn man das so betrachtet, dann ist es ein pass-by-reference.

frage: gibt es keine referenzvariablen in java für eine Klasse MyClass oder keine valuevariablen? such es dir aus. jeh nach dem, wie du dich entscheidest hast du ein pas-by-value oder pass-by-reference.
 
Zuletzt bearbeitet:
...ob man "a" defineirt als "MyClass a" als ein Objektvariable versteht oder als eine Pointervariable.

Ist doch in Java egal, da es keine Pointer gibt bzw. man nicht direkt mit ihnen arbeiten kann. Man arbeitet dabei immer mit einem (kopierten) Objekt.
Kenne die höchstgenaue Definition von Call-By-Reference jetzt nicht, aber wenn ich das Objekt in einer aufgerufenen Methode nicht manipulieren kann (da Klon), würde ich das als Call-By-Value bezeichnen.
 
Dese schrieb:
insofern: SYNTAKTISCH werden die objekte PASS-BY-REFERENZ übergeben. aus sicht des kompilers sind es aber nur referenzvariablen, die pass-by-value übergeben werden.
FAKT ist, dass es Call/Pass-by-Value ist. Wenn du anfängst die Syntax anderer Sprachen einzubeziehen oder es so erklärst, wie du meinst es zu verstehen, gibt's nur Chaos und seitenlange Diskussionen.

Vielleicht ist es so besser erklärt: "Java is Call-by-Value where the value is a reference"

@ks-deh: Das ist falsch. Es wird eben nicht das Objekt kopiert sondern nur dessen Referenz.
 
oh... böses nein!

Dito, aber für deinen Beitrag. Warum führst du Dinge in die Diskussion ein, die es in Java nicht gibt?

Es gibt nur Call-by-value in Java. Man übergibt in Java nunmal keine Objekte an Methoden, sondern Referenzen. Deshalb sind Aussagen wie

...also, die objekte werden auch bei methodenparamtern immer noch call by reference übergeben, lediglich die variable selbst, die die referenz enthält wird call by value übermittelt.

hochgradig schwammig. Objekte werden gar nicht übergeben, ihre Referenzen werden by value übergeben, ganz einfach. In Büchern mag man lesen, dass man Objekte an Methoden übergibt, weil es semantisch das ist, was passiert und für den Anfänger eingänglicher ist. Aber solche Typen heißen nicht umsonst Referenztypen, weil man nicht auf Objekten arbeitet, sondern auf Referenzen, das ist ein Kernkonzept.

alle variablen zugriffe sind call by reference [...] ABER methodenargumente werden call by value übergeben

Was bezweckst du mit dieser Unterscheidung? Die Begriffe "Call by value/reference" treten im Kontext von Methodenparametern auf, Variablenzugriffe sind einfach Variablenzugriffe und nichts weiter.
 
Zuletzt bearbeitet:
Darlis schrieb:
@ks-deh: Das ist falsch. Es wird eben nicht das Objekt kopiert sondern nur dessen Referenz.

Wenn ich aber eine Kopie einer Referenz erstelle, zeigt auch die kopierte Referenz immer noch auf das gleiche Objekt im Speicher, ergo müssten sich doch Änderungen die über die kopierte Referenz erfolgen, auch auf das ursprüngliche Objekt auswirken.
 
Richtig. Du hast aber von einem geklonten Objekt gesprochen. Da wäre das nicht der Fall.
 
Zurück
Oben