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