2017-09-25 102 views
1

如果我们使用String类的toUpperCase()方法,它是否将对象放在堆中而不是在字符串池中创建它。下面是代码,当我运行时,我可以推断新创建的字符串对象不在字符串池中。string.toUppercase()在堆或字符串池中创建一个新对象

public class Question { 
    public static void main(String[] args) { 
     String s1="abc"; 
     System.out.println(s1.toUpperCase()==s1.toUpperCase()); 
    } 
} 

输出上述代码返回的。 我知道“==”和equals()的区别,但在这个问题中,我想知道为什么两个创建的字符串不相等。唯一的解释可能是它们不是在字符串池中创建的,而是两个不同的对象。

+2

可能的重复[如何比较Java中的字符串?](https://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java) – nullpointer

+1

当您创建字符串文字去字符串池。对于其他任何事情,都会创建一个新对象 – Pramod

+1

'=='不比较2个字符串,它比较2个对象包含引用这2个字符串,所以2个对象是不同的。字符串对象是不可变的,所以我认为它会去字符串池。阅读更多关于'不可变vs可变对象','字符串池vs堆' –

回答

1

Java自动实习字符串文字。请检查answer,但是当您使用toUpperCase()时,它会使用new String()创建字符串的新实例,这就是两个对象不同的原因。

0

“==”运算符比较两个对象引用的值,以检查它们是否引用同一个String实例,因此在这种情况下,toUpperCase()创建了一个String实例,这就是为什么它返回false。

在另一方面equals()方法比较“”而不管两个对象引用的内部String实例指的是相同String实例或没有,所以它返回真。

相关问题