String类型的变量比较( == / equals() )

本文深入探讨了Java中String与StringBuffer的区别,包括它们的内存分配方式、对象比较方法及如何正确使用equals与==进行字符串比较。同时,通过代码示例展示了new关键字与直接赋值在创建字符串对象时的不同行为。
  1. 均直接赋值
String s = "123";
String str = "123";
System.out.println(s==str);true
System.out.println(s.equals(str));true
//二者均指向常量池中对象,地址和值均相等
  1. new和直接赋值的区别
String s = "123";//常量池中创建一个“123”对象
String str = new String("123");//常量池和堆中各创建一个“123”对象,并指向堆中对象
System.out.println(s==str);false//  == 比较的是引用地址
System.out.println(s.equals(str));true// String类重写了equals方法,对二者的value进行比较
  1. String和StringBuffer
String s = "123";
StringBuffer str = new StringBuffer("123");
System.out.println(s==str);//二者变量类型不同,无法==比较,编译错误
System.out.println(s.equals(str));false//str不是String的实例,直接return false
System.out.println(s.equals(str.toString()));true//转化为String类型,对值比较
### 解决方案分析 当串口监视器发送命令 `'00'` 时,程序输出 `'Unknown command'` 的问题通常字符串比较逻辑或数据读取方式有关。以下是详细分析和解决方案。 --- ### 问题根源 1. **字符串比较方法错误**: 在 Arduino 中,直接使用 `==` 比较两个 `String` 类型变量可能导致错误结果[^2]。这是因为 `==` 比较的是指针地址而非字符串内容。正确的做法是使用 `.equals()` 方法进行字符串内容比较。 2. **输入数据格式问题**: 如果串口输入包含多余的空格、换行符或其他不可见字符,可能导致字符串比较失败。因此,在进行字符串比较之前,需要调用 `.trim()` 方法去除多余字符[^3]。 3. **数据读取不完整**: 使用 `Serial.readStringUntil('\n')` 读取数据时,如果输入数据未以换行符结束,可能导致读取的数据不完整。可以通过设置超时时间来避免此问题。 --- ### 改进后的代码实现 以下是对原始代码的改进版本: ```cpp void setup() { Serial.begin(9600); // 初始化串口通信,波特率为9600 } void loop() { if (Serial.available()) { // 检查是否有可用的数据 String input = Serial.readStringUntil('\n'); // 读取直到换行符的字符串 input.trim(); // 去除字符串两端的空白字符(包括换行符和空格) // 打印接收到的命令 Serial.print("Received: "); Serial.println(input); // 组切换命令 if (input.equals("00")) { // 使用 equals() 方法进行字符串比较 Serial.println("Command recognized: 00"); int currentGroupIndex = 0; currentPatternIndex = 0; // 切换到新组的第一个图案 groupChanged = true; patternChanged = true; // 需要重绘图案 printCurrentStatus(); } else if (input.equals("01")) { Serial.println("Command recognized: 01"); int currentGroupIndex = 1; currentPatternIndex = 0; // 切换到新组的第一个图案 groupChanged = true; patternChanged = true; // 需要重绘图案 printCurrentStatus(); } else if (input.equals("02")) { Serial.println("Command recognized: 02"); int currentGroupIndex = 2; currentPatternIndex = 0; // 切换到新组的第一个图案 groupChanged = true; patternChanged = true; // 需要重绘图案 printCurrentStatus(); } // 开关命令 else if (input.equals("on")) { isOn = true; patternChanged = true; Serial.println(F("Display ON")); } else if (input.equals("off")) { isOn = false; clearStrip(); Serial.println(F("Display OFF")); } else { Serial.println(F("Unknown command")); // 如果输入不符合任何条件,则输出未知命令 } } } ``` --- ### 代码改进点说明 1. **字符串比较**: 使用 `String` 类的 `.equals()` 方法替代 `==` 进行字符串比较,确保正确性。 2. **去除多余字符**: 调用 `.trim()` 方法去除字符串两端的空白字符,避免因多余字符导致的比较失败[^3]。 3. **调试信息输出**: 在每次接收数据后,打印接收到的命令内容,便于调试和确认输入是否正确。 4. **命令处理逻辑**: 对每个命令分支进行明确处理,并在匹配成功时输出对应的调试信息。 --- ### 注意事项 1. **串口监视器设置**: 确保串口监视器的行尾格式设置为 `Both NL & CR` 或仅包含换行符 `\n`,以便程序能够正确识别命令[^1]。 2. **数据完整性**: 如果输入数据可能较长或不完整,建议使用 `Serial.setTimeout()` 设置超时时间,避免长时间等待数据输入。 3. **内存管理**: 使用 `String` 类时需注意其动态内存分配特性,可能会导致内存碎片化问题。如果项目对性能要求较高,建议使用固定长度的 `char[]` 数组代替 `String`。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值