当我编写以下代码时
int a = "Java";
java编译器显示以下错误:
无法从String转换为int
因此常量Java
被视为派生自的对象
String
上课。
- ""
之间包含的每个字符列表是否都被视为派生自String类的对象?
当我尝试连接两个字符串时,我使用了两个字符串 以下示例:
String ch1 = "Java " ;
String ch2 = "is cool";
String ch3 = ch1 + ch2;
在我找到的编译类上使用命令javap -c
之后
编译器使用StringBuilder
的实例来附加
两个字符串。
但另一个例子是:
String ch = "Java " + "is cool";
虽然两个常量“Java”和“很酷”都是从String
派生的两个对象
class,编译器不使用StringBuilder
的实例
追加两个字符串。
- 那么第二个例子中使用的方法是什么?
答案 0 :(得分:1)
' +'每次连接时都会创建一个新的String对象,除非在编译时进行连接。
虽然这不是一个声誉良好的来源,但从我的教科书中记得,这听起来是正确的。基本上,将此应用于您的代码:
String ch = "Java " + "is cool";
将在编译时处理,因为您已经定义了两个常量并将它们连接在一起,这意味着结果实际上也是一个常量,因此可以这样处理并在编译时计算。有趣的是看你是否编译了那些代码然后反编译以查看该语句将如何读取,我想象它可能会读取:
String ch = "Java is cool";
至于其他声明:
String ch1 = "Java " ;
String ch2 = "is cool";
String ch3 = ch1 + ch2;
由于ch3是从ch1和ch2计算出来的,所以它是在运行时完成的,因为ch1和ch2是变量而不是常量。
关于你的第一个问题,我找不到任何参考文献,但是从我记得的是""暗示一个字符串,就像''暗示一个角色。我并不完全确定你在尝试使用该语句做什么,但我想你可以将你的字符串转换为char数组,然后将其转换为int数组。
答案 1 :(得分:0)
不确定你的第二个问题是什么,但是对于你的第一个问题: “Java”是一个字符串,您尝试将其存储为int类型。它不是整数。变量a必须是string类型。
String a = "Java ";
答案 2 :(得分:0)
在第一个示例中,您创建了2个字符串变量,ch1和ch2,可用于代码的其他部分,因此...当您初始化ch3时,内存中的新字符串将使用两个变量的内容创建(此处是StringBuilder做的工作)。这是必需的,因为你可以改变ch2的值,ch3不会改变。
在第二个例子中,两个字符串都是final,并且从未在代码中再次使用过,所以Java只是创建了一个独特的字符串“Java很酷”。
我不知道我是否解释得很好。
答案 3 :(得分:0)
当您执行以下行
时String ch1 = "Java " ;
String ch2 = "is cool";
String ch3 = ch1 + ch2;
ch1和ch2都是文字的,编译器会使用StringBuilder创建String实例。在早期(当编译器不够聪明时)我们会通过concat操作浪费每次执行的内存
但是当你使用这个
时String ch = "Java " + "is cool";
编译器明白String Literal“Java”+“很酷”无法随时修改。因此编译器会将其转换为
String ch = "Java is cool";
作为字节代码。并且只有一个字符串文字会创建运行时。