String s1 = "learn";
String s1 = s1+"Java";
现在s1指向"learnJava"
字符串对吗?
String s2 = "learnJava";
if(s1 == s2)
是假的。为什么?
s2
应指向与StringConstantPool(s1)中已存在的"learnJava"
相同的l_one = Label(window, text= lambda: self.entry_1.get())
l_one.grid(column = 0, row = 0)
。
答案 0 :(得分:11)
s2应指向与StringConstantPool中已存在的“learnJava”相同的内容。
Nope - 除非您致电begin
,否则字符串池仅用于常量字符串。
因此字符串池包含func == (lhs:StatusEvent, rhs:StatusEvent) -> Bool {
return lhs.begin == rhs.begin
}
func < (lhs:StatusEvent, rhs:StatusEvent) -> Bool {
return lhs.begin < rhs.begin
}
struct StatusEvent : Comparable {
var begin : Int = 0
}
var arr = [StatusEvent(begin:3), StatusEvent(begin:2)]
let se = StatusEvent(begin:1)
if find(arr,se) == nil { // not already present
arr.append(se)
arr.sort(<)
}
,intern
和"learn"
...但"Java"
引用字符串池中的字符串而不是 ,因为连接是在执行时执行的。
如果你有一个编译时常量表达式,它会有所不同:
"learnJava"
或者如果你想保持执行时间连接:
s1
一般情况下,只是不要将字符串与String s1 = "learn" + "Java"; // Constant expression
String s2 = "learnJava";
System.out.println(s1 == s2); // true, guaranteed
进行比较......这几乎总是一个坏主意。
答案 1 :(得分:0)
这也是我遇到的问题
一个字母:'a'是一个原始的
角色:新角色('a')是一个对象
字符串:“a”是对象
“learnJava”!=“learnJava”的原因是它们是不同的对象
因此,为了检查两个字符串是否相等,您必须这样做:
String s1 = "learnJava";
String s2 = "learnJava";
s1.equals(s2) > true