当前位置: 首页 > 科技观察

我们都知道equals、==和intern()

时间:2023-03-16 00:39:04 科技观察

Java实例String类的生成,Java中一个新类的实例是在JVM的堆中完成的,如下图所示:这里我们以String类为例来解释更多细节!生成String实例的代码如下:Stringstr=newString("hello");通过new生成字符串(假设为“hello”)时,会先使用上图中的常量检查池中是否已有“hello”对象,如果没有,则在常量池中创建一个字符串对象,然后在堆中的常量池中创建一个“hello”对象的副本对象。==和equlas()我们看下面的代码Stringstr1=newString("hello");Stringstr2=newString("hello");System.out.println(str1==str2);System.out。println(str1.equals(str2));输出结果:falsestr1和str2是引用(引用可以理解为指针,指向"hello"所在内存中的地址),因为newString("hello")相当于在堆中开辟了一个新的内存空间,然后在新开辟的内存空间中存储“hello”。str1和str2指向的内存地址不同,与内存空间中存放的值是否相等无关!==对应的是方法equals(),比较String的值,因为s1和s2的值都是hello,所以相等!进阶的intern()接下来我们看看更高级的方法intern(),看下面的例子Strings1="hello";Strings3=newString("hello");System.out.println(s1==s3);System.out.println(s1==s3.intern());outputresult:falsetrue第一个结果false很好理解,因为s1和s3的引用地址不一样!s3调用intern()方法,相当于将运行时创建的字符串加入到字符串常量池中(如果还没有入池的话)。这样s1和s3都指向了常量池中同一个地址,所以是相等的!总结一下测试开发的同学,如果在面试的时候能说出==和equlas()的区别,那面试官应该很满意了。如果你也能给面试官解释一下intern()的用法,面试官一定会眼前一亮,大大提高你的就业机会!