JAVA-基础-boolean数据类型详解

布尔类型

Java 有一种表示逻辑值的简单类型,称为布尔型。它的值只能是真或假这两个值中的一个。它是所有的诸如下面的程序说明了布尔类型的使用: 

  

 1 // Demonstrate boolean values. 
 2 class BoolTest { 
 3 public static void main(String args[]) { 
 4 boolean b; 
 5  
 6 b = false; 
 7 System.out.println("b is " + b); 
 8 b = true; 
 9 System.out.println("b is " + b); 
10 // a boolean value can control the if statement 
11 if(b) System.out.println("This is executed."); 
12 b = false; 
13 if(b) System.out.println("This is not executed."); 
14 // outcome of a relational operator is a boolean value 
15 System.out.println("10 > 9 is " + (10 > 9)); 
16 } 
17 } 

这个程序的运行结果如下所示: 

   1 b is false 2 b is true 3 This is executed. 4 10 > 9 is true  

关于这个程序有3件有趣的事情要注意。首先,你已经看到,当用方法println ( ) 输出布尔的值时,显示的是“true ”或“false”。第二,布尔变量的值本身就足以用来控制if语句。没有必要将if语句写成像下面这样: 

 1 if(b == true) ...  

第三,关系运算符(例如<)的结果是布尔值。这就是为什么表达式10>9 的显示值是“true”。此外,在表达式10>9 的两边额外的加上括号是因为加号“+”运算符比运算符“>”的优先级要高。

JAVA布尔类型进行逻辑运算和按位运算的区别

从结果上,2种运算结果都是一样,但逻辑运算会有“短路”现象,按位的没有,而按位又比逻辑运算多了“异或”功能。

短路现象

 1 class br {
 2   static boolean f1() {
 3     return false;
 4   }
 5   static boolean f2() {
 6     return true;
 7   }
 8   static boolean f3() {
 9     return true;
10   }
11 }
12   
13 boolean f_1 = br.f1()&&br.f2()&&br.f3();

结果为false,当因为f1()就为false,那么后面的&&运算不用进行都知道结果了,JAVA就会发生“短路”对后面的运算乎略,性能提高。

 1 boolean f_2 = br.f2()||br.f1()||br.f3(); 

结果true,同样f2()为true,后面一样不用再运算了。
好像很方便又高效,但还是有缺点。

 1 boolean f_3 = br.f2()||br.f3()&&br.f1(); 

结果就变成true,正确应该是false,这就是“短路”造成的错误了,想获得正确的答案就需要加括号:

 1 f_3=( br.f2()||br.f3())&&br.f1(); 

按位运算提供逻辑没有的异或功能:

 1 boolean f = true^true; 

结果f = false;

boolean到底占几个字节?

  

为什么要问这个问题,首先在Java中定义的八种基本数据类型中,除了其它七种类型都有明确的内存占用字节数外,就boolean类型没有给出具体的占用字节数,因为对虚拟机来说根本就不存在 boolean 这个类型,boolean类型在编译后会使用其他数据类型来表示,那boolean类型究竟占用多少个字节?带着疑问,随便网上一搜,答案五花八门,根据 https://www.jianshu.com/p/2f663dc820d0的总结基本有以下几种:

1、1个bit

理由是boolean类型的值只有true和false两种逻辑值,在编译后会使用1和0来表示,这两个数在内存中只需要1位(bit)即可存储,位是计算机最小的存储单位。

2、1个字节

理由是虽然编译后1和0只需占用1位空间,但计算机处理数据的最小单位是1个字节,1个字节等于8位,实际存储的空间是:用1个字节的最低位存储,其他7位用0填补,如果值是true的话则存储的二进制为:0000 0001,如果是false的话则存储的二进制为:0000 0000。

3、4个字节

理由来源是《Java虚拟机规范》一书中的描述:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位”。这样我们可以得出boolean类型占了单独使用是4个字节,在数组中又是1个字节。

显然第三条是更准确的说法,那虚拟机为什么要用int来代替boolean呢?为什么不用byte或short,这样不是更节省内存空间吗。大多数人都会很自然的这样去想,我同样也有这个疑问,经过查阅资料发现,使用int的原因是,对于当下32位的处理器(CPU)来说,一次处理数据是32位(这里不是指的是32/64位系统,而是指CPU硬件层面),具有高效存取的特点。

最后的总结:

根据http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html官方文档的描述:

boolean: The boolean data type has only two possible values: true and false. Use this data type for simple flags that track true/false conditions. This data type represents one bit of information, but its "size" isn't something that's precisely defined.

布尔类型:布尔数据类型只有两个可能的值:真和假。使用此数据类型为跟踪真/假条件的简单标记。这种数据类型就表示这一点信息,但是它的“大小”并不是精确定义的。

可以看出,boolean类型没有给出精确的定义,《Java虚拟机规范》给出了4个字节,和boolean数组1个字节的定义,具体还要看虚拟机实现是否按照规范来,所以1个字节、4个字节都是有可能的。这其实是运算效率和存储空间之间的博弈,两者都非常的重要。

猜你喜欢

转载自www.cnblogs.com/xiaoluohao/p/11295542.html