Có ai có thể cho biết kích thước bit của boolean trong Java không?
Câu trả lời:
Nó phụ thuộc vào máy ảo.
Nó phụ thuộc vào máy ảo, nhưng thật dễ dàng để điều chỉnh mã từ một câu hỏi tương tự hỏi về byte trong Java :
class LotsOfBooleans
{
boolean a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, aa, ab, ac, ad, ae, af;
boolean b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, ba, bb, bc, bd, be, bf;
boolean c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, ca, cb, cc, cd, ce, cf;
boolean d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, da, db, dc, dd, de, df;
boolean e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, ea, eb, ec, ed, ee, ef;
}
class LotsOfInts
{
int a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, aa, ab, ac, ad, ae, af;
int b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, ba, bb, bc, bd, be, bf;
int c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, ca, cb, cc, cd, ce, cf;
int d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, da, db, dc, dd, de, df;
int e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, ea, eb, ec, ed, ee, ef;
}
public class Test
{
private static final int SIZE = 1000000;
public static void main(String[] args) throws Exception
{
LotsOfBooleans[] first = new LotsOfBooleans[SIZE];
LotsOfInts[] second = new LotsOfInts[SIZE];
System.gc();
long startMem = getMemory();
for (int i=0; i < SIZE; i++)
{
first[i] = new LotsOfBooleans();
}
System.gc();
long endMem = getMemory();
System.out.println ("Size for LotsOfBooleans: " + (endMem-startMem));
System.out.println ("Average size: " + ((endMem-startMem) / ((double)SIZE)));
System.gc();
startMem = getMemory();
for (int i=0; i < SIZE; i++)
{
second[i] = new LotsOfInts();
}
System.gc();
endMem = getMemory();
System.out.println ("Size for LotsOfInts: " + (endMem-startMem));
System.out.println ("Average size: " + ((endMem-startMem) / ((double)SIZE)));
// Make sure nothing gets collected
long total = 0;
for (int i=0; i < SIZE; i++)
{
total += (first[i].a0 ? 1 : 0) + second[i].a0;
}
System.out.println(total);
}
private static long getMemory()
{
Runtime runtime = Runtime.getRuntime();
return runtime.totalMemory() - runtime.freeMemory();
}
}
Để nhắc lại, điều này phụ thuộc vào máy ảo, nhưng trên máy tính xách tay Windows của tôi chạy phiên bản JDK của Sun 1.6.0_11, tôi nhận được kết quả sau:
Size for LotsOfBooleans: 87978576
Average size: 87.978576
Size for LotsOfInts: 328000000
Average size: 328.0
Điều đó cho thấy rằng boolean về cơ bản có thể được đóng gói thành một byte mỗi bởi JVM của Sun.
Thông tin thực tế được biểu diễn bằng giá trị boolean trong Java là một bit: 1 cho true, 0 cho false. Tuy nhiên, kích thước thực của một biến boolean trong bộ nhớ không được đặc tả Java xác định chính xác. Xem Các kiểu dữ liệu nguyên thủy trong Java .
Kiểu dữ liệu boolean chỉ có hai giá trị có thể có: true và false. Sử dụng kiểu dữ liệu này cho các cờ đơn giản theo dõi các điều kiện đúng / sai. Kiểu dữ liệu này đại diện cho một bit thông tin, nhưng "kích thước" của nó không phải là thứ được xác định chính xác.
Còn một chú ý đáng nói...
Nếu bạn đang nghĩ đến việc sử dụng một mảng các đối tượng Boolean, thì đừng. Thay vào đó, hãy sử dụng BitSet - nó có một số tối ưu hóa hiệu suất (và một số phương pháp bổ sung hay, cho phép bạn lấy bit đặt / hủy đặt tiếp theo).
Tôi đọc rằng Java dự trữ một byte cho một boolean
kiểu dữ liệu, nhưng nó chỉ sử dụng một bit. Tuy nhiên, tài liệu nói rằng "kích thước" của nó "không phải là thứ được xác định chính xác" .
Xem tại đây.
Các boolean
giá trị được biên dịch thành int
kiểu dữ liệu trong JVM. Xem tại đây .
Kích thước của boolean trong java phụ thuộc vào máy ảo. nhưng Bất kỳ đối tượng Java nào đều được căn chỉnh để có độ chi tiết 8 byte. Một Boolean có 8 byte tiêu đề, cộng với 1 byte trọng tải, cho tổng số 9 byte thông tin. JVM sau đó làm tròn nó lên bội số tiếp theo của 8. do đó, một phiên bản java.lang.Boolean chiếm 16 byte bộ nhớ.
Boolean
wold được một sự lãng phí như vậy ... đó là kích thước của một long
mà có thể mang nhiều nghìn tỷ lần thông tin hơn mộtBoolean
Nó không xác định; làm những điều như Jon Skeet đề xuất sẽ giúp bạn có được giá trị gần đúng trên một nền tảng nhất định, nhưng cách để biết chính xác cho một nền tảng cụ thể là sử dụng một trình mô tả.