String的一些理解

2 篇文章 0 订阅

随便总结:可能有些问题,希望看到的人可以给点补充和修改建议。
String是字符串类型,不属于java的原始数据类型,所以存放于内存的堆中。举个例子

String ggg = "fff";
String hhh = "fff";
String gg = new String("fff");
String hh = new String("fff");

代码中定义这四个变量,他们的值都是“fff”,但是实际上确实不完全相同的。使用equals去比较

System.out.println(ggg.equals(hhh));
System.out.println(ggg.equals(gg));
System.out.println(hhh.equals(gg));
System.out.println(hh.equals(gg));

结果都为:true
那就奇怪了,不是不完全相同吗?为何还是true呢?
例子中的equals只是比较了字符串中字符的匹配情况,所以只要是字符相互匹配,则equals这个方法就返回true,以上例子就是这样的情况,看一下java.lang.String中的equals方法的源码:

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;
    }

然后现在看看其他的:

System.out.println(ggg == hhh);
System.out.println(ggg == gg);
System.out.println(hhh == gg);
System.out.println(hh == gg);

结果就变成了:

true
false
false
false

怎么就出现false了?值不是相等的吗?
嗯,值是相等的,但是==号还要比较他们的存储地址,

System.out.println(ggg == hhh);

这个相等是因为,刚开始“ggg”定义了”fff”,存放于堆中,而“ggg”的值其实是字符串“fff”存放的地址,在java虚拟机没有进行垃圾回收前,在定义其他对象,会先从堆中去寻找这个对象是否存在,如果存在,则将地址赋予“hhh”,所以不会去创建新的对象,所以他们的值和地址都是相等的,使用“==”去比较也就想等了。
而使用new String("fff")这中方式是每次创建一个对象,每次都会在堆中生成相对应的地址和内容,所以内容相同,但是内存地址却不一致,所以结果为 false;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值