字符串基礎

1、String的長度限制

(運行期)String 在內存中的最大長度理論上是int型變量的最大值,Integer.MAX_VALUE = 2^31-1 

(編譯期)String字面常量的最大長度爲CONSTANT_Utf8_info表決定=2^16-2  (null值佔兩個字節) 

使用String s = ""會受到編譯期長度限制

運行期長度是因爲public String(char value[], int offset, int count)中,count是int類型的

編譯期長度是因爲字符串會在常量池中存儲一份,其實是常量池的長度限制

2、創建String對象的不同方式有哪些

1、String str = new String("abc");
2、String str1 = "abc";

使用1方式創建字符串對象不存儲於字符串池中,但可以通過intern()方法將該字符串存儲在字符串池中,如果字符串池中已經有了同樣值的字符串,則返回引用。

使用2方式創建,JVM去字符串池找有沒有值相等的字符串,如果有,則返回找到的字符串引用,否則在字符串池中創建一個新的字符串對象。

3、String、StringBuffer 、StringBuilder區別

String是不可變類,當我們對String進行操作的時候,總是會創建新的字符串,操作String很耗資源。(由於不可變,所以是先線程安全的)

StringBuffer和StringBuilder是可變類,StringBuffer是線程安全的,StringBuilder是線程不安全的,所以多線程對同一字符串操作的時候,應該選用StringBuffer,而不需要處理多線程的情況,StringBuilder的效率比StringBuffer高。

4、==與equals區別

==對內存地址進行比較,equals是對字符串值以及類型進行比較

5、String是基本類型嗎

String不是基本類型,而且是final的

String str = new String("abc")創建了兩個對象,"abc"本身創建在常量池,通過new又創建在堆中

因爲String是final的,所以不能被繼承

String.trim()會去掉字符串首尾的空白字符

String可以通過getBytes轉換爲byte[],byte[]可以通過String的構造器轉換爲String

6、可以自定義java.lang.String類並使用嗎?

可以自定義java.lang.String類並編譯成功,但不能被加載使用

針對java.*開頭的類,jvm的實現中已經保證了必須由bootstrap來加載

7、String的intern()方法

當intern方法被調用,如果字符串池中含有一個字符串和當前調用方法的字符串值相等,那麼就會返回池中的字符串,如果池中沒有,則首先將當前字符串加入到池中,然後再返回引用。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章