Java中Stringstr_1=abc;和Sings_2=new

2019-03-02 22:48:00
hjcadmin
原创
132

  原因:用构造器创建的对象,是不会被放入常理池中的,也很明显这完全是两个对象,只是内容相同罢了,结果当然为false了。用equals()或者ern()==b.intern());就返回true了。

  原因:编译时,这两个abc被认为是同一个对象保存到了常量池中;运行时JVM则认为这两个变量赋的是同一个对象,所以返回true。

  指的是在编译期确定,并被保存在已编译的字节码文件中的一些数据,它包括类、方法、接口等中的常量,也包括字符串常量。

  原因:运行出现的字符串常量,若是在常量池中出现过,则JVM会认为同一个对象,以节省内存开销,所以这两个字符串会被认为是同一个对象。

  同样的,def也是一个字符串,而str_2却不是指向它的引用,实质上

  展开全部第一个 (1)先定义一个名为str的对String类的对象引用变量:String str_1;

  只要是用new()来新建对象的,都会在堆中创建,而且其字符串是单独存值的,即使与栈中的数据相同,也不会与栈中的数据共享。

  (2)在栈中查找有没有存放值为abc的地址,如果没有,则开辟一个存放字面值为abc的地址,接着创建一个新的String类的对象o,并将o 的字符串值指向这个地址,而且在栈中这个地址旁边记下这个引用的对象o。如果已经有了值为abc的地址,则查找对象o,并返回o的地址。

  原因:编译时,先将abcedf放在常量池中,而c的值则是在运行时在堆里创建的。所以为false。

  值得注意的是,一般String类中字符串值都是直接存值的。但像String str = abc这种场合下,其字符串值却是保存了一个指向存在栈中数据的引用!

  第二个 则不管栈中有没有存放值为def的地址(与new创建的不共享),都新建一个“def”对象o在堆内 其首地址存储在栈 也即str_2指向对象o的地址。

文章分类
联系我们
联系人: newBB
Email: 1586171493@qq.com
QQ: 1586171493