a+“b“==“ab“返回false?--盘点字符串比较常见的几大场景

本文深入探讨了Java中字符串比较的常见场景,包括常量池、`==`与`equals()`的区别,以及`new`关键字创建字符串的影响。通过六个示例分析了不同情况下的字符串比较结果,帮助理解字符串对象的内存地址和值的比较。

前言

字符串的比较是一个常见的面试题,这里总结一下常见的关于String的一些题目。

先明确一个概念:

基本数据类型之间的 == 是比较值,引用数据类型 == 比较的是地址值,equals方法比较的是值不是地址

示例一:

  public static void main(String[] args) {
   
   
        String s2="abc";
        String s3="abc";
        System.out.println(s2==s3);
    }

运行结果:

true

分析:使用 “” 创建的字符串会直接存储在常量池中,先检查常量池中有没有“abc"字符串,若没有则添加到常量池中去,并且直接指向它。所以变量s2指向的地址是常量池中的”abc"。同理,s3也指向了常量池中的同一个地址“abc"。由于s2和s3指向的是同一个地址,而”==“比较的是内存地址,所以返回true.

示例二:

  public static void main(String[] args) {
   
   
        String s1="ab", s2="a"+"b", s3="a"
<think> 我们正在讨论Python语法。`response = b''` 表示将一个空的字节串(bytes)赋值给变量`response`。 在Python中,前缀`b`表示后面的字符串字面量是字节类型(bytes),而不是普通的字符串(str)。 字节串用于处理二进制数据,例如网络通信、文件读写(二进制模式)等场景。 ### 详细解释: 1. **字节串 vs 字符串**: - 普通字符串:`'hello'` → Unicode字符序列(默认UTF-8编码) - 字节串:`b'hello'` → 字节序列(每个字符对应一个字节,范围0-255) 2. **创建字节串**: - 空字节串:`b''` - 非空示例:`b'abc'` → 包含三个字节:`\x61\x62\x63` - 限制:字节串字面量只能包含ASCII字符(0-127),非ASCII字符需用转义序列: ```python # 合法 b'\x80\xff' # 两个字节:128 和 255 # 非法(直接写非ASCII字符会报错) b'中文' # SyntaxError: bytes can only contain ASCII literal characters. ``` 3. **常用操作**: -字符串类似的操作(切片、索引等): ```python data = b'ABCD' print(data[0]) # 输出 65(ASCII值'A') print(data[1:3]) # 输出 b'BC' ``` - 编码转换: ```python # 字符串转字节串:编码 s = "中文" b = s.encode('utf-8') # b'\xe4\xb8\xad\xe6\x96\x87' # 字节串转字符串:解码 s2 = b.decode('utf-8') # "中文" ``` 4. **应用场景**: - 网络传输(如HTTP响应内容) - 二进制文件读取(如图片、音频) - 加密/压缩数据的中间表示 ### 错误处理注意: 若尝试将非ASCII字符写成字节串字面量,Python会直接报语法错误: ```python # 错误示例 b = b'é' # 报错!需改为 b'\xc3\xa9' 或使用编码转换 ``` §§相关问题§§ 1. 在Python中,如何正确创建一个包含非ASCII字符(例如中文)的字节串对象? 2. 字节串(bytes)和字节数组(bytearray)之间有何主要区别? 3. 当从网络接收的数据为字节串时,如何将其转换为JSON对象? 4. 使用`open()`函数读取文本文件和二进制文件时,参数设置有何不同? 5. 为什么在HTTP响应中经常看到`response.content`(字节串)和`response.text`(字符串)两种属性? </think> 在Python中,`response = b''` 是一种创建**字节串(bytes)对象**的语法。下面详细解释其含义和用法: ### 1. `b''` 的本质 - **字节串(bytes)对象**:前缀 `b` 表示创建的是字节序列而非普通文本字符串 - **二进制数据表示**:用于处理原始字节数据(如网络传输、文件读写、加密数据等) - **空字节串**:`b''` 创建一个长度为0的空字节序列 ### 2. 与普通字符串的区别 | 特性 | 字节串 `b'...'` | 普通字符串 `'...'` | |---------------|-------------------------------------|----------------------------------| | **类型** | `bytes` | `str` | | **内容** | 原始字节序列 (0-255) | Unicode字符序列 | | **编码** | 无编码(原始二进制) | 自动处理UTF-8等编码 | | **适用场景** | 网络协议、二进制文件、加密数据 | 文本处理、用户界面显示 | | **示例** | `b'\x48\x65\x6c\x6c\x6f'` → b'Hello' | `'Hello'` | ### 3. 常用操作示例 ```python # ➤ 创建字节串 empty = b'' # 空字节串 ascii_data = b'Python' # ASCII字符字节串 hex_data = b'\x41\x42' # 十六进制表示 → b'AB' # ➤ 类型验证 print(type(b'')) # 输出 <class 'bytes'> # ➤ 长度检查 len(b'') # 返回 0 # ➤ 与字符串转换 text = "中文" byte_data = text.encode('utf-8') # 字符串转字节串: b'\xe4\xb8\xad\xe6\x96\x87' new_text = byte_data.decode('utf-8') # 字节串转字符串 ``` ### 4. 典型应用场景 1. **网络通信**(如HTTP响应): ```python import socket response = b'HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n' ``` 2. **文件处理**(二进制模式): ```python with open('image.jpg', 'rb') as f: # 'rb' = 二进制读取模式 data = b'' # 初始化空字节串容器 while chunk := f.read(1024): data += chunk # 拼接字节块 ``` 3. **加密操作**: ```python import hashlib hash_obj = hashlib.sha256(b'secret') # 必须用字节串作为输入 ``` ### 5. 注意事项 - **不可变性**:字节串对象创建后不可修改(类似元组) - **ASCII限制**:字面量写法 `b'...'` 只能包含ASCII字符(0-127) ```python b'中文' # 语法错误!需改用编码转换:'中文'.encode() ``` - **前缀变体**:Python还支持其他前缀如: - `rb''`:原始字节串(忽略转义字符) - `br''`:同上(`r`和`b`顺序可互换)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员资料站

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值