Java基础之String深入解析
生活随笔
收集整理的這篇文章主要介紹了
Java基础之String深入解析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Java基礎之String深入解析
以下是本文目錄大綱
1. 生成地方和地址指向,intern()方法
先看代碼
String s1 = new String("abc");String s2 = "abc";String s3 = new String("abc");System.out.println(s1 == s2);System.out.println(s1 == s3);System.out.println(s2 == s3);問題:
先看程序運行的結果
false false false解析:
- String s1 = new String("abc");
"abc" 會在字符串常量池里面生成一個字符串abc
new String("abc"); 會在堆里面生成 abc的對象 - String s2 = "abc";
由于"abc"在字符串常量池里,所以可以直接引用 - String s3 = new String("abc");
“abc” 先在常量池里找,找到了就不在常量池里生成了,但是
new String("abc");會在堆里面再生成一個對象abc
畫圖如下:
結論:
1. 生成3個abc對象,一個在字符串常量池里,兩個在堆里
2. 結果如上
擴展加強
先看代碼
String s1 = new String("abc");String s2 = "abc";String s3 = new String("abc");System.out.println(s1 == s1.intern());System.out.println(s2 == s2.intern());System.out.println(s1.intern() ==s2.intern());備注:當使用intern()方法時,查詢字符串常量池是否存在當前字符串,若不存在則將當前字符串復制到字符串常量池中,并返回字符串常量池中的引用。
問題:
解析:
- s1.intern()返回常量池里中abc對象,s1是堆對象abc,所以false
- 同理,s2,s2.intern()都指向字符串常量池中的對象abc,所以true
- s1.intern()和s2.intern()都指向字符串常量池中的對象abc,所以true
畫圖如下:
結論:
false true true2. String可否被繼承?
先看代碼
String s4 = "java";String s5 = "ja";String s6 = "va";System.out.println(s4 == "java");System.out.println(s4 == (s5 + s6));System.out.println(s4 == "ja" + s6);System.out.println((s5+s6)== "ja" + s6);解析:
- s4 == "java",都是常量池里的對象,返回true
- (s5+s6)會在堆里面生成 “java”,所以s4 == (s5 + s6)返回false
- 同理"ja" + s6也會在堆里面生成 “java”,所以(s5+s6)== "ja" + s6返回false
- (s5+s6) == "ja" + s6 等號兩邊引用的對象雖然相同,但是生成的對象是不一樣的,所以返回false
畫圖如下:
總結
以上是生活随笔為你收集整理的Java基础之String深入解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java基础之equals和==的区别深
- 下一篇: java美元兑换,(Java实现) 美元