Werden direkte Puffer in Java auf einen Standardwert wie Arrays initialisiert?

8

Wenn ich ein Array in Java initialisiere wie:

%Vor%

Alle Elemente werden auf 0 initialisiert. Ist das auch der Fall, wenn ich einen direkten Puffer wie folgt zuteile:

%Vor%

? Ich scheine immer nur Nullen zu bekommen, aber vielleicht ist es implementierungsabhängig ...

    
Se Norm 03.07.2011, 17:23
quelle

4 Antworten

3

Von der Dukmentierung zur übergeordneten abstrakten Klasse Buffer:

  

Der anfängliche Inhalt eines Puffers ist im Allgemeinen undefiniert .

In Ermangelung gegenteiliger Dinge würde ich annehmen, dass dies für Puffer gilt, die von ByteBuffer.allocateDirect () zugewiesen wurden. Interessanterweise nehme ich an, dass dies streng genommen auch für normale Array-Backed-Buffer gilt, obwohl es bei der Zuweisung eines Java-Arrays implizit ist, dass das Array auf Null gesetzt wird.

    
Neil Coffey 03.07.2011, 18:25
quelle
4

Es sieht so aus, als wäre die Antwort wahrscheinlich .

Betrachtet man die Implementierung von ByteBuffer , verwendet sie DirectByteBuffer unter der Haube. Werfen Sie einen Blick auf die Implementierung Quellcode von Android hat es diesen Kommentar:

  

Konstruiert einen neuen direkten Byte-Puffer von   die gegebene Kapazität auf neu zugeteilt   Betriebssystemspeicher Die Erinnerung wird gewesen sein   genullt.

Wenn Sie also einen Puffer reservieren, wird der gesamte Speicherinhalt auf Null initialisiert. Die Orakel-Implementierung führt auch diese Nullstellung durch.

Dies ist jedoch ein Implementierungsdetail. Da das Javadoc nichts über die Nullsetzung aussagt, ist es technisch falsch, sich darauf zu verlassen. Um richtig zu sein, sollten Sie den Puffer selbst auf Null setzen. Wenn Sie in der Praxis aus irgendeinem Grund wirklich um die Leistung besorgt sind, könnten Sie dies auslassen, aber seien Sie gewarnt, dass einige Implementierungen der JVM diese Nullsetzung möglicherweise nicht durchführen.

    
jterrace 03.07.2011 17:35
quelle
1

Blick auf den Javadoc für Java 7 und auch Java 8

es sagt jetzt

  

Die Position des neuen Puffers ist Null, sein Limit ist sein   Kapazität, seine Marke wird undefiniert sein, und jedes seiner Elemente wird sein   auf Null initialisiert. Ob es ein Backing Array hat oder nicht, ist   nicht spezifiziert

Es besteht also keine Notwendigkeit mehr, dass Sie sie selbst auf Null setzen.

    
Paul Taylor 03.03.2016 14:13
quelle
0

Es gibt keine Möglichkeit zu sagen, dass die Frage vergeblich ist. Die Anfangsposition ist Null, so dass es keine API gibt, die Sie ausführen können und die einen Teil des Puffers zurückgibt, der noch nicht 'put' ist.

    
EJP 03.07.2011 23:09
quelle

Tags und Links