zoukankan      html  css  js  c++  java
  • 亲, 我们来再重申一遍"=="和"equals的区别

      今天经历的一个事情太丢脸了, 一个学弟向我请教问题, 是这样的:

      一个字符串里面含有空格, 不允许使用.trim()和replace方法, 只用if和for将空格去掉, 题目很简单, 一开始我是这样写的:

            String s = "zhong hua ren min gong he guo";
            String[] s1 = s.split("");
            String s2 = "";
            for(int i=0;i<=s.length();i++) {
                if(s1[i]==" ";) {
                    s1[i] = "";
                }
                s2 += s1[i];
            }
            System.out.println("原来的字符串为: "+s);
            System.out.println("去掉空格之后的字符串为: "+s2);

    但是发现运行之后还是原来的字符串, 没有任何改变, 顿时场面相当的尴尬啊, 检查了好几遍没发现有错的地方啊, 而且这个逻辑也可以啊, 没啥错误啊, 后来请教了一个本班同学, 给出了这样的代码

            String s = "zhong hua ren min gong he guo";
            String[] s1 = s.split("");
            String s2 = "";
            for(int i=0;i<=s.length();i++) {
                if(s1[i].equals(" ")) {
                    
                }
                else {
                    s2 += s1[i];
                }
            }
            System.out.println("原来的字符串为: "+s);
            System.out.println("去掉空格之后的字符串为: "+s2);

    才给我解了个围, 回家再一想, 再三的肯定我写的代码是没有错误的, 当看到那个if语句的时候我就想给自己来一套天马流星拳了

      分割后的字符串数组中的元素属于重新定义了一个String, 与String s在存储中的内存地址已经不相同了, 用==来比较这两个值, 那就是真的自找难看了, 还是自己学的知识不够扎实, 以后多多注意吧! ! !

      网上的解释: 

    解释一下==号,他比较的是一个对象在内存中的地址值,
    比如2个字符串对象
    String s1 = new String("str");
    String s2 = new String("str");
    如果用==号比较,会返回false,因为创建了两个对象,他们在内存中地址的位置是不一样的。

    equals的情况比较复杂,它是java.lang.Object类中的一个方法。因为java中所有的类都默认继承于Object,所以所有的类都有这个方法。

    在Object类源码中是这样写的。
    public boolean equals(Object obj) {
    return (this == obj);
    }
    他同样使用==号进行内存地址的比较。但是许多java类中都重写了这个方法,比如String。
    public boolean equals(Object anObject) {
    if (this == anObject) {
    return true;
    }
    if (anObject instanceof String) {
    String anotherString = (String)anObject;
    int n = count;
    if (n == anotherString.count) {
    char v1[] = value;
    char v2[] = anotherString.value;
    int i = offset;
    int j = anotherString.offset;
    while (n-- != 0) {
    if (v1[i++] != v2[j++])
    return false;
    }
    return true;
    }
    }
    return false;
    }

    String里的方法,如果==号比较不相等,还会进行一下值的比较。
    所以equals方法具体的作用要看当前的那个类是如何实现重写父类中该方法的。如果没有重写该方法,那么他和==号等价。

    所以一定要记住:
    "=="比较的是地址
    "equals"比较的是值
  • 相关阅读:
    mytest3.py-api接入平台获取数据
    对比python的进程和线程:多线程是假的
    bug-sqlite3
    安装python3 centos
    句式英语
    java组件学习15天
    areas表-省市区
    中转复制
    追踪路由的2种方法
    干掉头疼的finished with non-zero exit value 2
  • 原文地址:https://www.cnblogs.com/wgbs25673578/p/5128918.html
Copyright © 2011-2022 走看看