String类与equals方法

常见的String类实例化方式有两种

public class Strings {
	
	public static void main(String[] args) {
		String str = "abc";//第一种方式
		String str2 = "abc";//第一种方式
		System.out.println(str == str2);//输出true
		String str3 = new String("abc");//第二种方式
		System.out.println(str == str3);//输出false
		str.equals(str3);//输出false
	}
}

第一种方式是直接赋值的类型。先在常量池中给“abc”字符串分配空间,然后让str指向常量池中的“abc”。执行String str2 = “abc”;前先在常量池中检查有没有abc字符串,要是有就直接让str2指向该字符串。所以str跟str2指向一样。对于引用数据类型而言==比较的是地址。第二种方式创建的对象地址均不同,所以str3指向的地址不可能跟str一样。

再来分析equals(Object anObject)这个方法。该函数定义于Object。在没有重写前该方法就是"=="的作用。String类中把这个方法重写了:

 public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

这是String类里的相关源码。首先比较指向的地址是否一样,一样的话直接判定为true。不一样就接着判断。然后用instanceof运算符检查anObject这个对象是否是String类创建的,也就是检查传入的参数是否是字符串。当判断成立就把anObject对象下转。然后一个对每个字符的对比了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值