1. string str1 = "abc";
system.out.println(str1 == "abc");
步驟:
1) 棧中開闢一塊空間存放引用str1,
2) string池中開闢一塊空間,存放string常量"abc",
3) 引用str1指向池中string常量"abc",
4) str1所指代的位址即常量"abc"所在位址,輸出為true
2. string str2 = new string("abc");
system.out.println(str2 == "abc");
步驟:
1) 棧中開闢一塊空間存放引用str2,
2) 堆中開闢一塊空間存放乙個新建的string物件"abc",
3) 引用str2指向堆中的新建的string物件"abc",
4) str2所指代的物件位址為堆中位址,而常量"abc"位址在池中,輸出為false
3. string str3 = new string("abc");
system.out.println(str3 == str2);
步驟:
1) 棧中開闢一塊空間存放引用str3,
2) 堆中開闢一塊新空間存放另外乙個(不同於str2所指)新建的string物件,
3) 引用str3指向另外新建的那個string物件
4) str3和str2指向堆中不同的string物件,位址也不相同,輸出為false
4. string str4 = "a" + "b";
system.out.println(str4 == "ab");
步驟:
1) 棧中開闢一塊空間存放引用str4,
2) 根據編譯器合併已知量的優化功能,池中開闢一塊空間,存放合併後的string常量"ab",
3) 引用str4指向池中常量"ab",
4) str4所指即池中常量"ab",輸出為true
5. final string s = "a";
string str5 = s + "b";
system.out.println(str5 == "ab");
步驟:
同4 6. string s1 = "a";
string s2 = "b";
string str6 = s1 + s2;
system.out.println(str6 == "ab");
步驟:
1) 棧中開闢一塊中間存放引用s1,s1指向池中string常量"a",
2) 棧中開闢一塊中間存放引用s2,s2指向池中string常量"b",
3) 棧中開闢一塊中間存放引用str5,
4) s1 + s2通過stringbuilder的最後一步tostring()方法還原乙個新的string物件"ab",因此堆中開闢一塊空間存放此物件,
5) 引用str6指向堆中(s1 + s2)所還原的新string物件,
6) str6指向的物件在堆中,而常量"ab"在池中,輸出為false
7. string str7 = "abc".substring(0, 2);
步驟:
1) 棧中開闢一塊空間存放引用str7,
2) substring()方法還原乙個新的string物件"ab"(不同於str6所指),堆中開闢一塊空間存放此物件,
3) 引用str7指向堆中的新string物件,
8. string str8 = "abc".touppercase();
步驟:
1) 棧中開闢一塊空間存放引用str6,
2) touppercase()方法還原乙個新的string物件"abc",池中並未開闢新的空間存放string常量"abc",
3) 引用str8指向堆中的新string物件
你真的了解Java嗎?
三目運算子規則 如果第二個和第三個運算元具有相同的型別,那麼它就是條件表示式的類 型。換句話說,你可以通過繞過混合型別的計算來避免 煩。如果乙個運算元的型別是 t,t 表示 byte short 或 char,而另乙個運算元是乙個 int 型別的常量表示式,它的值是可以用型別 t 表示的,那麼條件表...
你真的了解Java中的Instanceof嗎?
instanceof 是乙個簡單的二元操作符,它是用來判斷乙個物件是否是乙個類例項的 boolean b1 sting instanceof object b1為true因為string是object的子類 boolean b2 new string instanceof string b2為tru...
你真的了解Java中的Instanceof嗎?
instanceof 是乙個簡單的二元操作符,它是用來判斷乙個物件是否是乙個類例項的 boolean b1 sting instanceof object b1為true因為string是object的子類 boolean b2 new string instanceof string b2為tru...