2011-07-03 31 views
8

Khi tôi khởi tạo một mảng trong Java thích:Bộ đệm trực tiếp trong Java có được khởi tạo thành giá trị mặc định như mảng không?

float[] array = new float[1000]; 

tất cả các yếu tố này được khởi tạo là 0. Đó là cũng là trường hợp khi tôi bố trí một bộ đệm trực tiếp như thế này:

FloatBuffer buffer = ByteBuffer.allocateDirect(4*1000).asFloatBuffer(); 

? Tôi luôn có vẻ chỉ nhận được số 0, nhưng có lẽ nó phụ thuộc vào việc thực hiện ...

+2

Câu hỏi thú vị. [ByteBuffer javadoc] (http://download.oracle.com/javase/6/docs/api/java/nio/ByteBuffer.html) dường như không nói gì về vấn đề này. Tuy nhiên, lưu ý rằng các trường hợp hơi khác nhau. Trong trường hợp đầu tiên, mỗi phần tử được khởi tạo thành '0.0f' trong khi sau đó mỗi float được đọc là' 0.0f' sẽ chỉ là do thực tế mẫu [* bit * cho '0.0f' là" tất cả số 0 "] (http://steve.hollasch.net/cgindex/coding/ieeefloat.html) trong IEEE-754 –

+0

Xem câu trả lời của tôi dưới đây: ByteBuffer javadoc không nói bất cứ điều gì, nhưng lớp đệm cha mẹ làm. –

Trả lời

3

Từ ducmentation vào Buffer lớp trừu tượng cha mẹ:

Nội dung ban đầu của một bộ đệm là, nói chung, không xác định .

Trong trường hợp không có bất kỳ điều gì ngược lại, tôi giả định rằng điều này áp dụng cho bộ đệm do ByteBuffer.allocateDirect() cấp. Thật thú vị, tôi cho rằng nó nghiêm chỉnh áp dụng cho các bộ đệm được hỗ trợ bởi mảng thông thường, mặc dù nó ẩn trong việc phân bổ một mảng Java mà mảng sẽ được đánh số không.

+0

Chắc chắn câu trả lời này là chính xác khi bạn đăng nó, nhưng nó không còn nữa. –

+0

Tôi nghĩ rằng đó là chính xác vào thời điểm đó, nhưng như bạn nói, nó trông giống như điều này đã được làm rõ trong JDK gần đây và bộ đệm trực tiếp có thể được giả định là zeroed. –

4

Có vẻ như câu trả lời là có lẽ là.

Nhìn vào việc triển khai ByteBuffer, nó sử dụng DirectByteBuffer dưới mui xe. Nhìn vào việc thực hiện source code của Android, nó có nhận xét này:

xây dựng một bộ đệm byte trực tiếp mới của năng lực nhất định trên vừa được cấp phát bộ nhớ OS. Bộ nhớ sẽ là không.

Vì vậy, khi bạn phân bổ bộ đệm, tất cả nội dung bộ nhớ sẽ được khởi tạo bằng không. Việc thực hiện oracle cũng làm zeroing này.

Đây là chi tiết triển khai. Kể từ khi javadoc không nói gì về zeroing, nó về mặt kỹ thuật không chính xác để dựa vào nó. Để chính xác, bạn thực sự không nên tự đệm. Trong thực tế, nếu bạn thực sự lo lắng về hiệu suất vì một lý do nào đó, bạn có thể bỏ nó ra, nhưng được cảnh báo rằng một số việc triển khai JVM có thể không làm việc này.

+2

Tôi không đồng ý: nhận xét chỉ là nhận xét triển khai chứ không phải nhận xét javadoc. Và nó chỉ là trong việc thực hiện Android. Mã nguồn của việc triển khai thực hiện Oracle không bao gồm nhận xét này, mặc dù nó cũng đặt bộ nhớ là 0. Vì vậy, câu trả lời của tôi sẽ là nó có thể luôn luôn là zeroed, nhưng bạn không thể chắc chắn. –

+0

Cập nhật câu trả lời của tôi để rõ ràng hơn rằng đây là một chi tiết thực hiện. Cảm ơn @ jb-nizet – jterrace

+0

Xem câu trả lời của tôi bên dưới: đó là một chút ẩn, nhưng javadoc thực sự ngụ ý rằng bạn KHÔNG THỂ dựa vào bộ đệm chắc chắn là zeroed. –

0

Không có cách nào để kể câu hỏi là vô ích. Vị trí ban đầu là số không vì vậy không có API bạn có thể thực hiện mà sẽ trả về một phần của bộ đệm lúc chưa được 'đặt'.

+0

Điều gì về buffer.get (int index)? Tôi có thể làm: FloatBuffer buf = ByteBuffer.allocateDirect (400) .asFloatBuffer(); System.out.println (buf.get (7)); kết quả đầu ra 0.0 –

+0

Chắc chắn nó ném một ngoại lệ tràn nếu không có gì được đặt ở đó? – EJP

+0

nó không cho tôi, với kiến ​​thức của tôi chỉ số chỉ được kiểm tra đối với giới hạn bộ đệm. Một ngoại lệ tràn được afaik chỉ ném nếu một phương pháp truy cập tương đối được sử dụng và vượt quá giới hạn. Tuyệt đối có được (như trong get (int index) ném ra ngoài giới hạn, nhưng chỉ khi index> giới hạn –

1

Nhìn vào Javadoc cho Java 7 và cũng Java 8

nó bây giờ nói

vị trí Bộ đệm mới sẽ là zero, giới hạn của nó sẽ là công suất của nó, dấu ấn của nó sẽ được undefined, và mỗi các phần tử của nó sẽ là được khởi tạo về 0. Có hoặc không có mảng sao lưu là không xác định

Vì vậy, bạn không còn cần phải tự mình không tự mình.

Các vấn đề liên quan