JAVA面试题字符串产生了几个对象

  

<>强面试官Q1:请问字符串s=新的字符串(“xyz”);产生了几个对象?

  

对于这Java面个试题,老套路先上代码:

        公开课StringTest {   公共静态void main (String [] args) {   字符串s1=澳愫谩?   字符串s2=澳愫谩?   字符串s3=新的字符串(“Hello”);   system . out。println (“s1和s2引用地址是否相同:”+ (s1==s2));   system . out。println (“s1和s2值是否相同:“+ s1.equals (s2));   system . out。println (“s1和s3引用地址是否相同:“+ (s1==s3));   system . out。println (“s1和s3值是否相同:“+ s1.equals (s3));   }   }      

打印结果如下:

        s1和s2引用地址是否相同:真的   s1和s2值是否相同:真的   s1和s3引用地址是否相同:假的   s1和s3值是否相同:真      

上面程序中的“==笔桥卸狭礁龆韵笠玫牡刂肥欠裣嗤?也就是判断是否为同一个对象,s1与s2返回为真的,s1与s3返回则是错误的。说明s1与s2引用的同一个对象的地址,s3则与其它两个引用不是同一个对象地址。

  

Java为了避免产生大量的字符串对象,设计了一个字符串常量池。工作原理是这样的,创建一个字符串时,JVM首先为检查字符串常量池中是否有值相等的字符串,如果有,则不再创建,直接返回该字符串的引用地址,若没有,则创建,然后放到字符串常量池中,并返回新创建的字符串的引用地址。所以上面s1与s2引用地址相同。

  

那为什么s3与s1, s2引用的不是同一个字符串地址呢?字符串s3=新的字符串(“Hello”);JVM首先是在字符串常量池中找“Hello”字符串,如果没有创建字符串常量,然后放到常量池中,若已存在,则不需要创建;当遇到新时,还会在内存(不是字符串常量池中,而是在堆里面)上创建一个新字符串的对象,存储“你好”,并将内存上的字符串对象引用地址返回,所以s3与s1, s2引用的不是同一个字符串地址。内存结构图如下:

  

癑AVA面试题字符串产生了几个对象"

  

从内存图可见,s1与s2指向的都是常量池中的字符串常量,所以它们比较的是同一块内存地址,而s3指向的是堆里面的一块地址,说的具体点应该是堆里面的伊甸园区域,跟s1, s2跟s3比较都是不相等的,都不是同一块地址。

  

了解了字符串类的工作原理,回归问题本身:

  

在字符串的工作原理中,已经提到了,新的一个字符串对象,是需要先在字符串常量中查找相同值或创建一个字符串常量,然后再在内存中创建一个字符串对象,所以字符串str=新的字符串(“xyz”);会创建两个对象。

  

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

JAVA面试题字符串产生了几个对象