2016-03-05 48 views
-1

我想将字符串文字转换为全大写字母。这里是我的代码:当字符串文字改变时会发生什么?

// a and b are the same literal 
    String a = "Test"; 
    String b = "Test"; 
    // now I want to change all b's letter 
    // into uppercases, but fail. 
    b.toUpperCase(); 
    System.out.println("a = " + a + ", " + "b = " + b); 
    // print: a = Test, b = Test 

    String c = "Test1"; 
    System.out.println("c = " + c + " , c.toUpperCase() = " 
       + c.toUpperCase()); 
    // print: c = Test1 , c.toUpperCase() = TEST1 

    // change letters of "Test" literal 
    // into uppercase and success 
    System.out.println("Test".toUpperCase()); 
    // print: TEST 

我的问题是:1。 可以b没有变成大写之一,但c和​​即可。为什么?

我知道的是: 1. ab引用字符串池中的同一个对象。 2.字符串是不可变的,但它似乎与此问题无关。

+4

什么让你觉得你已经改变了'c'的任何东西?你已经显示了'c.toUpperCase()'的*返回值*,就这些。这不会改变'c'的值(一个引用)或'c'的值所指的字符串中的数据。 –

+2

你在哪里持有声明结果//b.toUpperCase(); – 2016-03-05 12:12:58

+0

在Java中,'String'变量是_immutable_,所以一旦创建,就无法更改它们。 –

回答

4

字符串是不可变的。所以对于变化b:

b = b.toUpperCase(); 

每次你做一些改变一个字符串的东西,一个新的字符串对象被创建。所以你需要改变对象的参考。

1

字符串是不可改变的,但它似乎对这个问题不相关

其实,这是对问题

b不能变成大写一个

非常相关

由于toUpperCase()通过作用于调用字符串返回一个新字符串,请使用

b = b.toUpperCase();

c和 “测试” 即可。为什么?

c还没有改变它的结果已经被添加到System.out.println()

1

会发生什么字符串时一个字符串文字被改变?

没有。那就是字符串文字对象不能改变,因为当你指出你已经知道它是不可改变的。可以引用它(变量如a,b,c)以引用其他字符串,但该字符串实例不会从​​更改。

不过来解释你的代码:

这是bc之间的区别:

b.toUpperCase(); //there's a result from this function you are not using 
System.out.println("b = " + b); 

System.out.println("c = " + c.toUpperCase()); //you're using the result here. 

字符串是不可改变的,但似乎不相关的这个问题

这是相关的,如果你知道它是不可变的,很显然b不能将更改为大写,并且必须因toUpperCase而创建新字符串,因此您必须使用该字符串。然而b,可向引用新的字符串,这不会影响a或其他任何东西仍然引用旧的字符串:

b = b.toUpperCase(); //b now is set to the new upper case string 
System.out.println("b = " + b); 
0

你需要改变这样的,因为stringsimmutable

public static void main(String[] args) { 
     // a and b are the same literal 
     String a = "Test"; 
     String b = "Test"; 

     // now I want to change all b's letter 
     // into uppercases, but fail. 
     b= b.toUpperCase(); 
     System.out.println("a = " + a + ", " + "b = " + b); 
     // print: a = Test, b = Test 

     String c = "Test1"; 
     // c=c.toUpperCase(); 
     System.out.println("c = " + c + " , c.toUpperCase() = " 
        + (c=c.toUpperCase())); 
     // print: c = Test1 , c.toUpperCase() = TEST1 

     // change letters of "Test" literal 
     // into uppercase and success 
     System.out.println("Test".toUpperCase()); 
     // print: TEST 
1

我的问题是:1.b不能改成大写,但c和“测试”可以。为什么?

我的回答是,当你打印c.toUpperCase(),可变c在所有没有改变。

您只需返回另一个字符串这是建基于对c内容为大写。

同样适用于字符串"test"


即使你这样做,你只指向c到一个新的字符串:

String c = "Test1"; 
c = c.toUpperCase(); 

事情是这样的:

//String c = "Test1"; 
+-------+ 
|"Test1"| <--- c 
+-------+ 

//c = c.toUpperCase(); 
+-------+ 
|"TEST1"| <--- c 
+-------+ 
+-------+ 
|"Test1"| <--- waiting to be collected by Garbage collector 
+-------+ 
0

,我建议你看看到Java API 。通过使用toUpperCase,你将得到一个新的String对象。如果要用新文本打印出变量,则应将新对象分配给变量。如果是c,则打印出对象的返回“新”内容。变量c将变成小写字母了。

1

让我们把你的代码一行一行地请阅读我的意见:

// a and b are the same literal 
/* FIRST POINT : 
    Here you assigned two times the same value "Test", 
    BUT IT'S 2 DIFFERENT OBJECTS IN MEMORY */ 
String a = "Test"; 
String b = "Test"; 
// now I want to change all b's letter 
// into uppercases, but fail. 
/* SECOND POINT : 
    Here you just apply a function (toUpperCase()) on "b" object. 
    This function returns a string object but 
    YOU ARE NOT DOING ANYTHING WITH IT 
    i.e. displaying it or reassigning it to another variable! 
    */ 
b.toUpperCase(); 
System.out.println("a = " + a + ", " + "b = " + b); 
// THAT'S WHY IT STILLS PRINT 
// print: a = Test, b = Test 

String c = "Test1"; 
System.out.println("c = " + c + " , c.toUpperCase() = " 
      + c.toUpperCase()); 
/* THIRD POINT : 
    Here you apply a function (toUpperCase()) on "c" object but this time 
    YOU ARE REUSING THE RETURN STRING :) 
    i.e. you are displaying it! 
    */ 
// print: c = Test1 , c.toUpperCase() = TEST1 

// change letters of "Test" literal 
// into uppercase and success 
/* LAST POINT : 
    Here you do the same as you did before on "c" object 
    YOU ARE REUSING THE RETURN STRING AGAIN :) 
    i.e. you are displaying it! 
    */ 
System.out.println("Test".toUpperCase()); 
// print: TEST 

最后但并非最不重要调用toUpperCase()/ toLowerCase()函数的字符串对象将永远不会重新分配对象的值。这些函数只返回一个字符串。

重新分配字符串值的方式是通常的方式:

String a = "Test"; 
a = a.toUpperCase(); 

请注意,正如许多人说,这将在内存中创建“TEST”的另一个对象,并指定为“a”和你旧字符串“测试”将成为垃圾收集器的候选者。

我希望现在更有意义。

干杯,

相关问题