如果我们使用新的字符串(" abcd"),则会在堆中创建字符串对象

时间:2014-04-21 09:17:19

标签: java

    String s1 = new String("anil");
    String s2 = s1.toUpperCase();
    String s3 = s1.toLowerCase();
    System.out.println(s1 == s2);
    System.out.println(s1 == s3);

如果在堆中创建的字符串对象则都为false。但它给出false,true。

5 个答案:

答案 0 :(得分:3)

String s1 = new String("anil");

此语句创建一个新对象

而且,

String s3 = s1.toLowerCase();

指出第一个对象s1

的位置

这就是你得到true第二个条件的原因

另请参阅how java handles strings以获得清晰的理解

希望这会有所帮助!!

答案 1 :(得分:1)

这里有四个 String对象:

  • 由编译器和类加载器
  • 创建的文字
  • s1,由new String()
  • 创建
  • s2,由toUpperCase()
  • 创建
  • s3,由toLowerCase()创建。

通过==运算符,它们中没有两个是相同的。

外,toLowerCase()可能会返回相同的对象(如果它已经是小写)。 Javadoc中没有任何内容,因此不能依赖于实现中的任何此类行为。

答案 2 :(得分:0)

这里将在堆中创建S1对象。其值存储在常量字符串池中。

S2是字符串文字而不是对象。因此,第一个JVM将检查字符串是否在常量池中。如果String有常量池,则不会创建新对象。它将返回可用对象的引用。

这里s1.toUpper将返回" ANIL"。 " ANIL"不在常数池中。所以将创建新对象。并将其与s1进行比较(使用' ==')给出错误。

S3同样如此。但是对于S3来说,它不会创造出新的对象,因为它不会像#34; anil"已经在恒定的池中。 所以将返回S1的参考。所以它给出了真实。

研究以下链接

Study this

答案 3 :(得分:0)

如果你看一下String类中的toLowerCase()方法。

  1. 调用toLowerCase(Locale locale)
  2. toLowerCase(Locale locale)使用Character.toLowerCase(c)
  3. Character类中的
  4. Character.toLowerCase(c)有此注释 -

    • @param ch要转换的字符。
    • @return该字符的小写等效项,如果有的话;
    • 否则,角色本身。

答案 4 :(得分:0)

案例1 字符串Capital First Letter

> String s1 = new String("Ajay")
String s2 = s1.toUpperCase()
String s3 = s1.toLowerCase()
System.out.println s1 == s2
System.out.println s1 == s3
false
false

案例2 字符串Small First Letter

> String s1 = new String("ajay")
String s2 = s1.toUpperCase()
String s3 = s1.toLowerCase()
System.out.println s1 == s2
System.out.println s1 == s3
false
true
案例1 中的

,因为字符串有大写字母,转换为小写会产生新对象,因此会有新参考> 案例2 小首字母转换为小写后仍会指向同一个对象,因为原始对象相同因此创建两个对同一对象的引用

您可以看到Groovy Shell的输出非常明确。