zoukankan      html  css  js  c++  java
  • 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个字节都是有可能的。这其实是运算效率和存储空间之间的博弈,两者都非常的重要。

  • 相关阅读:
    数据库异常处理记录
    FINEMVC重定向和显示合计
    有意思的文章的链接
    oralce 创建用户和权限
    FINEUI(MVC) grid 双击弹窗功能
    FINEUI(MVC)布局问题记录
    通过判断cookie过期方式向Memcached中添加,取出数据(Java)
    通过数组方式向Oracle大批量插入数据(10万条11秒)
    Python基础学习13--面向对象
    Python基础学习12--变量作用域
  • 原文地址:https://www.cnblogs.com/xiaoluohao/p/11295542.html
Copyright © 2011-2022 走看看