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 ...
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.
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.
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.
Tags und Links java initialization buffer