首页 > 编程语言 >【java面试题】 == 和 equals

【java面试题】 == 和 equals

时间:2022-08-15 12:24:08浏览次数:66  
标签:面试题 java name equals name2 name1 println String

【java面试题】 == 和 equals

 

"=="比较的机制:== 对比的是栈中的值

基本数据类型是变量值,也就是 int i = 1;在栈中存放的是 i = 1,== 比较的也是这个数值1

引用类型是堆中内存对象的地址 ,String str = new String("hello"); 通过new在堆中开辟了空间,str指向堆中的空间的内存地址,也就是在栈中str等于堆中空间的地址,比如:0x2223,==比较的就是这个地址的值

如果是使用这种形式定义: String name = "张三"; 它是在常量池中定义了”张三“,并且在栈中的name指向的就是常量池中”张三“的地址

 

equals的比较机制:默认也是采用”==“比较,如果不重写equals,它和”==”相同,但通常会重写

在Object类的equals方法的源码中是用的“==”:

public boolean equals(Object obj) {
    return (this == obj);
}

 

但是在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;
}

实现原理是把字符串中的每一个字符拿出来比较,如果都相等则说明这两个字符串相等

 

面试题:

public class Demo01 {
    public static void main(String[] args) {
        String name = "zhangsan";
        String name1 = new String("zhangsan");
        String name2 = name1;
        System.out.println(name == name1);
        System.out.println(name == name2);
        System.out.println(name1 == name2);
        System.out.println(name.equals(name1));
        System.out.println(name.equals(name2));
        System.out.println(name1.equals(name2));
    }
}

 

image-20220815115911133

 

name == name1 比较的是在栈中存的地址,name的地址是在堆中,name1的地址是在常量池中,所以它们不相等,但如果用equals,那么比较的就不是地址了,比较的是字符串的内容是否相等

当把name1 赋值给 name2 时,就是把name1的地址赋值给了name2,所以用 == 比较结果是true

标签:面试题,java,name,equals,name2,name1,println,String
From: https://www.cnblogs.com/wztblogs/p/16587838.html

相关文章

  • python wsgi 规范 与java的servlet规范
    背景Web应用的本质就是:浏览器发送一个HTTP请求;服务器收到请求,生成一个HTML文档;服务器把HTML文档作为HTTP响应的Body发送给浏览器;浏览器收到HTTP响应,从HTTPBody取......
  • javascript关于正则表达式
    概述正则表达式是用于字符串匹配的(四个支持正则的方法search查找下标macth查找数组split切割 replace替换)1.正则表达式对象声明1.1new关键词声明varre......
  • 接口测试经典面试题:Session、cookie、token有什么区别?
    原文链接HTTP是一个没有状态的协议,这种特点带来的好处就是效率较高,但是缺点也非常明显,这个协议本身是不支持网站的关联的,比如https://ceshiren.com/和https://ceshiren.co......
  • Java SE 9 多版本兼容 JAR 包示例
    JavaSE9多版本兼容JAR包示例作者:Grey原文地址:JavaSE9多版本兼容JAR包示例说明Java9版本中增强了Jar包多版本字节码文件格式支持,也就是说在同一个Jar包......
  • Java NIO全面详解(看这篇就够了)
    很多技术框架都使用NIO技术,学习和掌握JavaNIO技术对于高性能、高并发网络的应用是非常关键的@mikechenNIO简介NIO中的N可以理解为Non-blocking,不单纯是New,是解决......
  • 【java面试题】ArrayList和LinkedList的区别
    【java面试题】ArrayList和LinkedList的区别 ArrayList和LinkedList都实现了List接口,它们有一下的不同点:ArrayList是基于索引的数据接口,它的底层是数组,它可以以O(1)时......
  • JavaScript 异步函数的 Promisification 处理
    Promisification是一个很长的词,表示一个编程范式的转变,即将接受回调的函数转换为一个返回类型为Promise的函数。我们现实的开发项目中经常需要这种转换,因为许多函数和......
  • Java 9.回文数
    给你一个整数x,如果x是一个回文整数,返回true;否则,返回false。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。   例如,121是回文,而123不是。来源:力扣......
  • 一文讲透Java核心技术之高可扩展利器SPI
    大家好,我是冰河~~SPI的概念JAVASPI=基于接口的编程+策略模式+配置文件的动态加载机制SPI的使用场景Java是一种面向对象语言,虽然Java8开始支持函数式编程和Stream,但是......
  • JAVA 发布订阅模式
    JAVA发布订阅模式一、发布订阅模式在软件架构中,发布订阅是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者)。而是将发布的消息分为......