字符串String equals和 ==

背景

分不清 equals 和 == 到底比较的是什么?equals 使用细节

描述:

二者区别:
简单理解内存,比作一个房间,里面住了一个人
equals 比较房间里面的人是不是同一个人,比较的是内容;
== 比较的是这个房间是不是同一个,比较地址;

使用细节:

错误写法---------------------------------------

// str 可能为空会异常
  public void fn(String str){
    if (str.equals("abc")){
            Log.e("TAG"," equal " );
        }else {
            Log.e("TAG", "unequal " );
        }
 }

str可能为空,这种写法会报错NullPointerException,可以把他放进参数就可;

推荐写法--------------------------------

// str 为空也不会NullPointerException
public void fn(String str){
        if ("abc".equals(str)){
            Log.e("TAG"," equal " );
        }else {
            Log.e("TAG", "unequal " );
        }
    }

工具类封装:

如果是安卓的同学,自带一个TextUtils类,是google封装的 2410 行代码,就有一个equals函数;我们就可放进自己的工具类中,


public static boolean equals(CharSequence a, CharSequence b) {
        if (a == b) return true;
        int length;
        if (a != null && b != null && (length = a.length()) == b.length()) {
            if (a instanceof String && b instanceof String) {
                return a.equals(b);
            } else {
                for (int i = 0; i < length; i++) {
                    if (a.charAt(i) != b.charAt(i)) return false;
                }
                return true;
            }
        }
        return false;
    }
### Java 字符串 `equals` 方法与 `==` 运算符的区别 在 Java 中,字符串是比较常见的数据类型之一,在实际开发中经常需要对其进行比较操作。以下是关于 `equals()` 方法 `==` 运算符的具体区别: #### 1. 基本概念 - **`==` 运算符**:它主要用于比较两个变量的值是否相等。对于基本数据类型(如 `int`, `char`),它是直接比较数值;而对于引用类型(如对象、数组、字符串),则是比较它们的内存地址是否相同 [^2]。 - **`equals()` 方法**:这是由 `Object` 类定义的一个方法,默认情况下也是用来比较对象的内存地址。然而,`String` 类重写了该方法,使其能够比较字符串的内容而不是内存地址 [^1]。 #### 2. 使用场景对比 - 当使用 `==` 对字符串进行比较时,如果两个字符串指向同一个对象或者通过编译期优化被分配到相同的常量池位置,则返回 `true`,否则即使内容一致也会返回 `false` [^3]。 - 而调用 `equals()` 方法则会逐字符地检查两个字符串的内容是否完全匹配,忽略其存储的位置差异 [^4]。 #### 示例代码说明 下面是一个简单的例子来展示两者的不同之处: ```java public class StringCompareExample { public static void main(String[] args) { String str1 = "hello"; String str2 = "hello"; String str3 = new String("hello"); System.out.println(str1 == str2); // true,因为str1str2指向同一常量池中的实例 System.out.println(str1 == str3); // false,虽然内容一样但是str3创建了一个新的对象 System.out.println(str1.equals(str2)); // true,内容相同 System.out.println(str1.equals(str3)); // true,尽管不是同一个对象但内容相同 } } ``` #### 总结 因此,在日常编程实践中,应该根据具体需求选择合适的比较方式。如果是想确认两个字符串是否具有同样的内容,请始终使用 `equals()` 方法;而仅当你确实关心这两个变量是否确切表示同一个对象而非仅仅拥有相似的数据时才考虑采用 `==` 来做判断。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值