细说java面试“=="和"equals"方法的区别以及常量池的概念及使用

前言

又是一年毕业季节,转眼间也就面临毕业找工作,开学大四。
暑假抱着一丝丝希望去外找工作,最终因无实际工作经验而不了了之。当然也有自己存在的不足。另外就是,在郑州的it行业确实没有工作经验也不容易得到offer,所以只有慢慢的潜修。利用这一年的时间去更好更深入的去钻研。

“==”

废话少说,今天和大家细说一下关于java中“==”和”equals”的区别,好多人在这里都是模棱两可,下边和大家分析一下。希望对于求职者得到一些帮助(许多面试公司都喜欢问这些话题)。

java程序员中测试两个变量是否相等有两种方式,一种是一运算符,另一种是利用equals()方法,当使用“==”来判断两个变量是否相等时,如果两个变量是基本类型,且艘是数值类型(不一定要求数据类型严格相同)则只要两个变量的值相等,就返回true.–但是对于两个引用类型变量,只有他们指向同一个对象时候,”==”判断才会返回true(就是在堆内存指向同一对象),“==”不可用于比较类型上没有父子关系的两个对象,否则报错,无法通过编译(eg:”hello”=new Example())
public Class Example{
    public static void main(String[] args){
    int it=65;
    float f1=65.0;
    //将输出true
    System.out.println(it==f1);
    char ch='A';
    //将输出true
    System.out.println(it==ch);
    String str1=new String("hello");
    String str2=new String("hello");
    //将输出false
    System.out.println(str2==str2);
    //这一点相信好多人比较迷糊,因为str1和str2都是通过new String()创建出来的,都是一个新的实例,存储在堆内存的非同一个,而str1和str2都是引用类型,而且他们引用的对象都不指向不同的对象,所以输出false
    //由于java.lang.String 与Test类没有继承关系,所以先变语句导致编译失败
    System.out.println("hello"==new Test());    
}
}

//运行上边的程序,可以看出65,65.0f和‘A’相等,但对于str1和str2.因为他们都是引用类型的变量,他们分别指向两个通过new 关键字创建的String对象,因此str1和str2两个变量不相等。

常量池

“hello”的直接量和new String(“hello”)有什么区别呢,当java程序直接是哟个形如“hello”的字符串常量时候(包括可以在编译时候就计算出来的字符串值)JVM将会使用常量池来管理这些字符串,当时用new String(“helllo”)时候,JVM会先使用常量池来管理“hello”的直接量,再调用String 类的构造器来创建一个新的String对象,新建的String对象被保存在堆内存中,换句话说,new String(“hello”)一共产生了两个字符对象。

常量池:(constant pool)专门管理在编译时就被确定并被保存在已编译的.class文件中的一些数据,它包括了关于类,方法,接口中的常量,好包括字符串常量。

public class StringCompareTest
{
    public static void main(String[] args)
    {
        // s1直接引用常量池中的"疯狂Java"
        String s1 = "疯狂Java";
        String s2 = "疯狂";
        String s3 = "Java";
        // s4后面的字符串值可以在编译时就确定下来
        // s4直接引用常量池中的"疯狂Java"
        String s4 = "疯狂" + "Java";
        // s5后面的字符串值可以在编译时就确定下来
        // s5直接引用常量池中的"疯狂Java"
        String s5 = "疯" + "狂" + "Java";
        // s6后面的字符串值不能在编译时就确定下来,
        // 不能引用常量池中的字符串
        String s6 = s2 + s3;
        // 使用new调用构造器将会创建一个新的String对象,
        // s7引用堆内存中新创建的String对象
        String s7 = new String("疯狂Java");
        System.out.println(s1 == s4); // 输出true
        System.out.println(s1 == s5); // 输出true
        System.out.println(s1 == s6); // 输出false
        System.out.println(s1 == s7); // 输出false
    }
}
JVM中的恶常量池保证相同的字符串直接量只有一个,不会产生副本,例子中的s1,s4,s5所引用的恶字符串可以在编译时候被确定下来,因此他们都将引用常量池中的同一个字符串对象,使用new String()创建的String对象的字符串对象是运行时候创建出来的,它被保存在运行时的内存区(即堆内存)不会放入常量池。

equals()方法

有时候我们寄希望于如何直接比较两个字符串的值是否相等,eg:
String str1=new String(“hello”);
String str2=new String(“hello”);
//输出为true
System.out.println(str1.equals(str2));
所以在比较字符串的对象的值是否相同的时候,那么可以通过equals()方法来完成。
equals()方法是Object类提供的一个实例方法,*因此所有引用变量都可以调用该方法来判断是否与其他变量的引用值是否相等,但使用这个方法判断两个对象是否相等时和“==”没有任何区别

总结

“==”用于比较两个直接量的时候,如果值相同就返回true
否则返回false(不一定要求数据类型严格相同,int a=3;float b=5.0返回true),如果是引用类型,只有他们指向同一个对象时候才返回true,否则false.
“equals()”在字符串对象通过该方法来比较另一个字符串对象的时候,只要字符串引用对象的内容相同就返回true,否则返回false,但是在比较两个对象是否相同的时候,该方法和”==“没有任何区别。

如果对您有用,希望您点赞,您的赞会给予我很大的鼓励。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uniquewdl

匆忙的人生,总有你喜欢的文章

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值