乐途乐途
主页
  • 计算机基础

    • TCP/IP
    • Linux
    • HTTP
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C
    • C++
    • Java SE
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • Maven 入门
    • Maven 进阶
    • MyBatis
    • Spring
    • Spring MVC
  • Java

    • Spring Boot
    • Spring Cloud
    • Spring Cloud Alibaba
    • Spring Security
    • Spring AI
    • Spring Batch
    • Kafka
    • Java 设计模式
  • 缓存

    • Redis
  • 搜索引擎

    • Elasticsearch
  • 分布式协调

    • ZooKeeper
联系
阿里云
主页
  • 计算机基础

    • TCP/IP
    • Linux
    • HTTP
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C
    • C++
    • Java SE
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • Maven 入门
    • Maven 进阶
    • MyBatis
    • Spring
    • Spring MVC
  • Java

    • Spring Boot
    • Spring Cloud
    • Spring Cloud Alibaba
    • Spring Security
    • Spring AI
    • Spring Batch
    • Kafka
    • Java 设计模式
  • 缓存

    • Redis
  • 搜索引擎

    • Elasticsearch
  • 分布式协调

    • ZooKeeper
联系
阿里云
  • 学习路径
  • 第1章 Java概述与环境搭建

    • Java概述与环境搭建
    • Java语言概述
    • 解释型语言与编译型语言对比
    • JDK安装与配置
    • JDK、JRE、JVM 详解
    • HelloWorld程序详解
    • IDE 介绍
  • 第2章 标识符与基本数据类型

    • 章节导读
    • 变量概述
    • 常量概述
    • 基本类型与包装类
    • 字节型 byte
    • 短整型 short
    • 整型 int
    • 长整型 long
    • 单精度浮点型 float
    • 双精度浮点型 double
    • 字符型 char
    • 布尔型 boolean
    • 类型转换
  • 第3章 运算符与表达式

    • 章节导读
    • 算术运算符
    • 赋值运算符
    • 关系运算符
    • 逻辑运算符
    • 位运算符
    • 条件运算符
    • 运算符优先级
    • 表达式
  • 第4章 流程控制

    • 章节导读
    • 常见的程序运行流程
    • if-else 选择结构
    • switch 多分支选择
    • while 循环
    • do-while 循环
    • for 循环
    • break 与 continue
  • 第5章 数组

    • 章节导读
    • 一维数组
    • 多维数组
    • Arrays 工具类
  • 第6章 类与对象

    • 章节导读
    • 类与对象
    • 方法定义与调用
    • 构造方法
    • 封装
    • 访问修饰符
    • package 与 import
    • static 关键字
    • this 关键字
    • 参数传递 详解
    • 枚举
    • 成员内部类
    • 局部内部类
    • 静态内部类
    • 匿名内部类
  • 第7章 接口与继承

    • 章节导读
    • 继承
    • super 关键字
    • final 关键字
    • 多态
    • 向上转型与向下转型
    • 抽象类
    • 接口
    • 抽象类与接口对比
  • 第8章 注解

    • 章节导读
    • 注解基础
    • 元注解详解
    • 自定义注解
  • 第9章 常用类

    • 章节导读:Java 常用类
    • Object 类:万类之祖
    • 包装类:基本类型的对象化
    • String:不可变的字符串
    • StringBuffer:线程安全的可变字符串
    • StringBuilder:可变的字符串构建器
    • Math:数学运算工具类
    • Random:伪随机数生成器
    • 大数值运算 详解
    • 日期时间API 详解
  • 第10章 异常机制

    • 章节导读
    • 异常体系与分类
    • try-catch-finally
    • try-with-resources
    • throws 与 throw
    • 自定义异常
  • 第11章 泛型

    • 章节导读
    • 泛型基础
    • 通配符与PECS原则
    • 类型擦除
  • 第12章 集合框架

    • 章节导读
    • 集合框架概述
    • ArrayList
    • LinkedList
    • HashMap 详解
    • LinkedHashMap 详解
    • TreeMap 详解
    • HashSet
    • TreeSet 详解
    • TreeSet 与 Comparable
    • Collections 工具类详解
  • 第13章 IO流

    • 章节导读
    • IO流概述
    • 字节流
    • 字符流
    • 缓冲流
    • 转换流 详解
    • 序列化 详解
    • NIO与Files 详解
    • NIO与Files工具类
  • 第14章 多线程与并发

    • 第十六章 多线程与并发 —— 章节导读
    • 线程基础详解
    • synchronized 详解
    • Lock 与显式锁详解
    • volatile 详解
    • wait 与 notify 详解
    • ThreadLocal详解
    • 原子类详解
    • 并发工具类详解
    • 线程池详解
  • 第15章 反射

    • 章节导读
    • 反射概述与 Class 对象
    • Constructor 与对象创建
    • Field与Method详解
    • 反射应用详解
  • 第16章 JDK8新特性

    • 章节导读
    • Lambda 表达式
    • Stream API 基础
    • Stream API 高级详解
    • Optional 详解
    • 新日期时间API详解
  • 第17章 JDK9-11新特性

    • 章节导读
    • 模块化系统 — Project Jigsaw(JDK 9)
    • var 局部变量类型推断(JDK 10)
    • 集合工厂方法与增强(JDK 9 / 10 / 11)
    • 接口增强:private 方法(JDK 9)
    • Stream API 增强(JDK 9)
    • Optional 增强(JDK 9 / 10 / 11)
    • String 新增方法(JDK 11)
    • HTTP Client 与 Files 增强(JDK 11)
    • 直接运行 Java 源文件 — JEP 330(JDK 11)
  • 第18章 JDK12-17新特性

    • 章节导读
    • Switch 表达式(JDK 12 预览 / JDK 14 正式)
    • 文本块 Text Blocks(JDK 13 预览 / JDK 15 正式)
    • Records 记录类(JDK 14 预览 / JDK 16 正式)
    • 密封类 Sealed Classes(JDK 15 预览 / JDK 17 正式)
    • instanceof 模式匹配(JDK 14 预览 / JDK 16 正式)
    • Switch 模式匹配 — Pattern Matching for switch(JDK 17 预览 / JDK 21 正式)
    • Helpful NPE 与 String 增强(JDK 12 / JDK 14 / JDK 15)
    • Stream 增强(JDK 12 / JDK 16)
    • 日期时间增强 — Day Period 支持(JDK 16)
  • 第19章 JDK18-21新特性

    • 章节导读
    • 虚拟线程(JDK 19 预览 / JDK 20 第二预览 / JDK 21 正式)
    • 序列集合(JDK 21 正式)
    • Switch 模式匹配(JDK 17 预览 / JDK 18 第二预览 / JDK 20 第四预览 / JDK 21 正式)
    • Record 模式匹配(JDK 19 预览 / JDK 20 第二预览 / JDK 21 正式)
    • 未命名模式与变量(JDK 21 预览 / JDK 22 正式)
  • 第20章 JDK 22-25 新特性

    • 章节导读
    • 字符串模板(JDK 22 预览 / JDK 23 第二预览 / JDK 24 第三预览)
    • Stream Gatherers(JDK 22 预览 / JDK 24 第二预览)
    • 隐式声明类与实例方法(JDK 23 预览 / JDK 24 第二预览)
    • 原始类型模式匹配(JDK 24 预览)
  • 附录

    • Java 核心知识点
    • Java SE 专业术语
    • Java特性索引(JDK 8 → 25)

布尔型 boolean

本章定位:boolean是Java中表示逻辑真假的类型,只有true和false两个值。在飞翔科技的系统中,支付状态、满勤判断、权限校验、是否旺季——每一个二选一的判断都依赖boolean。白歌特别强调:"Java的boolean不参与算术运算,这和C语言完全不同,别把0当false。"


定义与语法

属性说明
关键字boolean(布尔型)
取值true 或 false(仅此两个值)
JVM中的大小规范未明确定义,HotSpot中通常用int(4字节)存储,数组中用byte(1字节)
默认值false
包装类java.lang.Boolean
与C语言区别不能与整数互转,不参与算术运算

基本声明

boolean isPaid = true;             // 是否已支付
boolean inStock = true;            // 是否有货
boolean needReservation = true;    // 是否需要预约
boolean isPeakSeason = false;      // 是否旺季
boolean fullAttendance = true;     // 是否满勤
boolean hasFever = false;          // 是否发热
boolean isGraduated = false;       // 是否毕业
boolean isExcellent = true;        // 是否优秀
boolean isSignature = true;        // 是否招牌菜
boolean isFull = true;             // 是否满油

深度原理:boolean在JVM中的存储真相

boolean的"暧昧"大小

结论:既不要假定boolean是1位,也不要假定它是1字节。在大多数场景下,boolean像int一样处理,但在数组中会被压缩为字节。

Java boolean与C语言bool的本质区别

特性Java booleanC语言 bool/_Bool
取值范围仅 true / false0(false)/ 非0(true)
与整数互转不允许允许:int x = true;(x=1)
参与算术不允许允许:true + true = 2
if条件必须是boolean表达式任意非0值

完整代码示例

示例一:飞翔商城——多条件支付判断

/**
 * 飞翔科技 - boolean 类型演示
 * 场景:飞翔商城的订单支付状态与库存校验
 */
public class BooleanOrderDemo {
    public static void main(String[] args) {
        // 订单状态
        boolean isPaid = true;
        boolean inStock = true;
        boolean isVIP = true;
        boolean needShipping = true;
        boolean hasCoupon = false;
        
        int buyCount = 2;
        float price = 188.88f;
        float shippingFee = 8.8f;
        
        // 逻辑判断
        boolean canPurchase = inStock && (buyCount > 0);
        boolean freeShipping = isVIP || (price * buyCount >= 200.00f);
        boolean needPay = !isPaid;
        
        float totalPrice = price * buyCount;
        float finalShipping = freeShipping ? 0.0f : shippingFee;
        float totalAmount = totalPrice + finalShipping;
        
        System.out.println("【飞翔商城 - 订单状态】");
        System.out.println("商品库存:" + (inStock ? "有货" : "缺货"));
        System.out.println("支付状态:" + (isPaid ? "已支付" : "未支付"));
        System.out.println("VIP会员:" + (isVIP ? "是" : "否"));
        System.out.println("免运费:" + (freeShipping ? "是" : "否"));
        System.out.println("可用优惠券:" + (hasCoupon ? "有" : "无"));
        System.out.println("可购买:" + (canPurchase ? "是" : "否"));
        System.out.println("\n商品总价:¥" + totalPrice);
        System.out.println("运费:¥" + finalShipping);
        System.out.println("应付总额:¥" + totalAmount);
    }
}
运行输出:
【飞翔商城 - 订单状态】
商品库存:有货
支付状态:已支付
VIP会员:是
免运费:是
可用优惠券:无
可购买:是

商品总价:¥377.76
运费:¥0.0
应付总额:¥377.76

示例二:飞翔科技——权限与出勤综合判断

/**
 * 飞翔科技 - boolean 复合判断演示
 * 场景:员工考勤与权限校验系统
 */
public class BooleanAttendanceDemo {
    public static void main(String[] args) {
        // 员工考勤信息
        boolean fullAttendance = true;     // 是否满勤
        boolean salaryPaid = true;         // 工资是否已发
        boolean hasPermission = true;      // 是否有薪资系统权限
        boolean isWeekend = false;         // 是否周末
        
        // 绩效条件
        int performanceScore = 100;
        boolean excellentPerformance = performanceScore >= 90;
        boolean goodPerformance = performanceScore >= 75 && performanceScore < 90;
        
        // 复合逻辑判断
        boolean yearEndBonus = fullAttendance && excellentPerformance;
        boolean canViewSalary = hasPermission && salaryPaid;
        boolean needOvertime = isWeekend && performanceScore < 75;
        
        // 短路的实际应用
        boolean accessGranted = hasPermission && checkDatabaseConnection();
        
        System.out.println("【飞翔科技 - 考勤与权限】");
        System.out.println("满勤:" + fullAttendance);
        System.out.println("绩效分:" + performanceScore + " → " 
                           + (excellentPerformance ? "优秀" : goodPerformance ? "良好" : "待改进"));
        System.out.println("年终奖资格:" + (yearEndBonus ? "有" : "无"));
        System.out.println("薪资查看权限:" + (canViewSalary ? "可查看" : "无权限"));
        System.out.println("需要加班:" + (needOvertime ? "是" : "否"));
        
        System.out.println("\n【Boolean工具方法】");
        System.out.println("Boolean.TRUE: " + Boolean.TRUE);
        System.out.println("Boolean.FALSE: " + Boolean.FALSE);
        System.out.println("Boolean.parseBoolean(\"true\"): " + Boolean.parseBoolean("true"));
        System.out.println("Boolean.parseBoolean(\"TrUe\"): " + Boolean.parseBoolean("TrUe"));  // 不区分大小写
        System.out.println("Boolean.parseBoolean(\"yes\"): " + Boolean.parseBoolean("yes"));    // false!只认"true"
    }
    
    static boolean checkDatabaseConnection() {
        // 模拟数据库连接检查
        System.out.println("  → 正在检查数据库连接...");
        return true;
    }
}
运行输出:
【飞翔科技 - 考勤与权限】
满勤:true
绩效分:100 → 优秀
年终奖资格:有
薪资查看权限:可查看
需要加班:否

【Boolean工具方法】
Boolean.TRUE: true
Boolean.FALSE: false
Boolean.parseBoolean("true"): true
Boolean.parseBoolean("TrUe"): true
Boolean.parseBoolean("yes"): false
  → 正在检查数据库连接...

易错场景

反例一:把boolean当整数用——Java不允许

// ❌ 常见C转Java的错误:用0和1表示真假
// int flag = 1;
// if (flag) { ... }  // 编译错误!int不能作为boolean条件

// ❌ 错误:boolean参与算术
boolean b = true;
// int result = b + 1;     // 编译错误!
// int result = b ? 1 : 0; // ✅ 如果需要转为int,用三元运算符

// ❌ 错误:if(1) 这种写法
// if (1) { }  // 编译错误

// ✅ 正确:if 条件必须是 boolean 表达式
boolean flag = true;
if (flag) {
    System.out.println("正确");
}

反例二:Boolean.parseBoolean() 的陷阱

// ❌ 危险:parseBoolean 只认 "true"(不区分大小写)
boolean b1 = Boolean.parseBoolean("true");   // true
boolean b2 = Boolean.parseBoolean("false");  // false
boolean b3 = Boolean.parseBoolean("yes");    // false!(不是true!)
boolean b4 = Boolean.parseBoolean("1");      // false!
boolean b5 = Boolean.parseBoolean("");       // false!
boolean b6 = Boolean.parseBoolean(null);     // false!

// ✅ 如果需要更灵活的解析,自己写判断
// "yes"/"1"/"on" → true;"no"/"0"/"off" → false

反例三:用==比较Boolean对象时的空指针

// ❌ 危险:Boolean对象可能为null
Boolean paid = null;
if (paid == true) {   // NullPointerException?不会,但语义不对
    // paid==true 在paid为null时返回false(不抛异常)
}
if (paid) {  // NullPointerException!自动拆箱时paid为null
}

// ✅ 正确:先判空或用 Boolean.TRUE.equals()
if (Boolean.TRUE.equals(paid)) {
    // 安全
}

反例四:boolean变量命名不当

// ❌ 糟糕的命名
boolean flag = true;       // flag是什么?
boolean status = false;    // status是什么状态?
boolean b = true;          // 完全不知道含义

// ✅ 好的命名:is/has/can/should 前缀
boolean isPaid = true;           // 是否已支付
boolean hasPermission = false;   // 是否有权限
boolean canEdit = true;          // 是否可编辑
boolean shouldNotify = true;     // 是否应通知
boolean fullAttendance = true;   // 是否满勤
boolean needReservation = false; // 是否需要预约

面试考点

Q1:Java中的boolean占几个字节?

JVM规范没有明确定义boolean的大小。在HotSpot JVM中:单个boolean变量通常用**4字节(int)存储;boolean数组中的元素用1字节(byte)**存储,这是JVM专门优化的。结论:取决于JVM实现和上下文,不要假定其大小。

Q2:if(flag = true) 和 if(flag == true) 有什么区别?

flag = true是赋值表达式,值为true,因此if(flag = true)总是进入if分支(且flag被改为true)。flag == true是比较表达式,根据flag的值判断。这是经典的"赋值与比较混淆"BUG。最佳实践:直接写if(flag)(判断true)或if(!flag)(判断false),避免写== true/false。

Q3:Java中boolean能转换成int吗?

不能直接转换。Java是强类型语言,boolean和int是完全不同的类型。如果需要将boolean转为0/1,使用三元运算符:int i = b ? 1 : 0;。这与C/C++不同,C中true就是非0值,可以参与算术。

Q4:Boolean对象的缓存机制是什么?

Boolean类只有两个不可变实例:Boolean.TRUE和Boolean.FALSE。Boolean.valueOf(boolean)和Boolean.valueOf(String)总是返回这两个常量之一,不会创建新对象。因此Boolean.valueOf(true) == Boolean.TRUE永远为true(是同一引用)。这与Integer的-128~127缓存不同——Boolean的缓存是全覆盖的。

上一页
字符型 char
下一页
类型转换