所以我今天下午才开始学习Java。这样做的最佳方式是什么?我做错了什么?目前,我没有输出:(
import java.util.Scanner;
class ClassA {
public static void main(String[] args) {
Scanner MyScan = new Scanner(System.in);
System.out.print("Enter Word: ");
String UI = MyScan.nextLine();
UI.toLowerCase();
String s;
String word = "";
for (int i = 0; i <= UI.length()-1; i++) {
s = UI.substring(i, i+1);
if (i % 2 == 1) {
s.toUpperCase();
}
word.concat(s);
}
System.out.print(word);
MyScan.close();
}
}
答案 0 :(得分:0)
String
是不可变的。这意味着无论您在String
上调用哪些修改操作,都需要将其结果分配给原始值,以便实际修改它。
因此,在您的情况下,您应该输入word = word.concat(s)
而不是简单地word.concat(s)
。 word.concat(s)
创建一个新实例,除非您将其分配给word
,否则其值将保持不变。
答案 1 :(得分:0)
您需要分配大小写转换和串联的值来创建字符串的新实例,因为字符串在java中是不可变的。如图所示更改以下行。
UI = UI.toLowerCase();
s = s.toUpperCase();
word = word.concat(s);
答案 2 :(得分:0)
这是一个替代实现 - 它使用StringBuffer进行连接,并将每个字符作为字符而不是字符串处理 `
public static String everyOtherLowerCase(String input) {
input = input.toLowerCase();
StringBuffer result = new StringBuffer("");
for(int x=0; x<input.length(); x++) {
Character c = input.charAt(x);
if(x % 2 == 0) result.append(c);
else result.append(Character.toUpperCase(c));
}
return result.toString();
}
`
正如其他人所指出的,字符串是不可改变的;出于性能原因,最好附加到StringBuffer而不是不断地重新创建和重新分配String对象。这是java中非常常见的性能错误步骤。
答案 3 :(得分:0)
其他答案都是正确的,但我会更加清楚。
字符串不可变意味着您无法更改它们。但是可以创建一个新的String并将其分配给同一个变量。 String
的所有方法都没有改变内容。他们中的许多人都返回了新的String
。所以:
String s = "Hello";
s.replace("H","J");
...创建一个新的“Jello”String
,然后抛弃它。
String s1 = "Hello";
String s2 = s.replace("H","J");
...创建一个新的“Jello”String
,并将其分配给s2
。
String s1 = "Hello";
s1 = s1.replace("H","J");
...创建一个新的“Jello”String
,将其分配给s1
,丢弃先前分配给String
的旧s1
(“Hello”)
当您 想要在适当位置修改字符序列时,类StringBuilder
存在。
StringBuilder sb = new StringBuilder("Hello");
sb.replace(0,1,"J");
...使sb
包含“Jello”而不是“Hello”。
这些知识可以为您提供修复程序所需的知识。