1. 程式人生 > 其它 >python flask引數請求,全網最詳解

python flask引數請求,全網最詳解

String類

概念:String是不可變類,即一但一個String物件被建立,包含在這個物件的字元序列是不可改變的,直至該物件被銷燬。

1 //String的主要成員變數
2 private final char value[];
3 /**
4 value指向的是一個字串陣列,字串中的字元就是用這個value變數儲存起來的,並且用final修飾,說明value一旦賦予初始值之後,value指向的地址就不能再改變了,雖然value指向的陣列是可以改變的,但是String也沒有提供相應的方法讓我們去修改value指向的陣列的元素,所以說String是一個不可變類,String物件的不可變還有一點就是對String型別的所有改變內部儲存結構的操作都會new出一個新的String物件
5 */

String類是被final修飾的,不能有子類,裡面的一些方法也加上了final

例子:也就是說建立"abc"字串後,"abc" 自出生到最終死亡,不可變,不能變成"abcd",也不能變成"ab"

注意:"abc" 這是一個字串物件,字串在java中有優待,不需要new也是一個物件,屬於String型別。

在java中隨便使用雙引號括起來的都是String物件。

例如:"abc","def","hello world!",這是3個String物件

在JDK當中雙引號括起來的字串,例如:"abc" "def"都是直接儲存在“方法區”的“字串常量池”當中的。

註解:在JDK1.7時,把字串常量池移動到了堆記憶體中

為什麼SUN公司把字串儲存在一個“字串常量池”當中呢。因為字串在實際的開發中使用太頻繁。

為了執行效率,所以把字串放到了方法區的字串常量池當中

當使用Sring str = "abc";這種形式建立字串,那麼String就不會在堆記憶體中建立物件,"abc"儲存在字串常量池中,而str儲存的是"abc"在字串常量池中的地址

當使用String str = new String("abc");這種形式建立字串,需要在堆記憶體中建立字串物件,而在String物件在堆記憶體中儲存的是"abc"在字串常量池中的記憶體地址,而str儲存的是物件在堆記憶體中的地址

例子:

  1. 第一個例子

    1 String str1 = "abc";
    
    2 String str2 = "abc"; 3 System.out.println(str1 == str2);//true 4 //為true原因:在字串常量池中相同的字串只會儲存一份,不會重複,而str1和2都是同一個地址
  2. 第二個例子

    1 String str1 = "abc";
    2 String str2 = "abc";
    3 String str3 = "ab" + "c";
    4 System.out.println(str1 == str3);//true
    5 //為true原因:"ab"和"c"都是字面值常量,在編譯時直接編譯成"abc",而"abc"在字串常量池中存在了,就不會再建立,直接把地址賦值給str3
  3. 第三個例子

    1 String str1 = "abc";
    2 final String s1 = "ab";
    3 final String s2 = "c";  
    4 String str4 = s1 + s2;
    5 System.out.println(str1 == str4);//true
    6 //為true原因:s1 和s2都是常量,在編譯時直接編譯成"abc"
  4. 第四個例子

    1 String str1 = "abc";
    2 String s3 = "ab";
    3 String s4 = "c";
    4 String str5 = s3 + s4;
    5 System.out.println(str1 == str5);//false
    6 //為false的原因:s3、s4時變數,字串拼接時,如果有變數參與的情況下,String底層使用的是StringBuilder,所以記憶體地址不一樣了
    7 //String str5 = s3 + s4;拼接new StringBuilder(s3).append(s4).toString()

    注意:頻繁的字串拼接最好不要使用 +,因為java中的字串是不可變的,每一次拼接都會new StringBuilder拼接產生新字串。這樣會佔用大量的記憶體。造成記憶體空間的浪費。

    如果以後需要進行大量字串的拼接操作,建議使用JDK中自帶的:

    • java.lang.StringBuffer

    • java.lang.StringBuilder

  5. 第五個例子

    1 String s5 = new String("hello");
    2 String s6 = new String("hello");
    3 //上面兩行一共建立了3個物件:
    4 //字串常量池中有1個:"hello"
    5 //堆記憶體當中有兩個String物件。

通過例子,字串物件之間的比較不能使用“==”,"=="不保險。應該呼叫String類的equals方法,String類已經重寫了toString()和equals()方法

註解:使用equals()方法進行比較時,把已知道的放在前面,未知的放在equals()方法中,這樣可以避免空指標異常

String類的構造方法

1 String s = "abc";
2 String s = new String("abc");
3 String s = new String(byte陣列);//將整個陣列轉換為字串
4 String s = new String(byte陣列, 起始下標, 長度);//將陣列中的一部分轉換為字串
5 String s = new String(char陣列);
6 String s = new String(char陣列, 起始下標, 長度);
7 ...

valueOf()方法,引數是一個物件的時候,會自動呼叫該物件的toString()方法

沒有重寫toString()方法之前列印輸出的是物件記憶體地址

為什麼輸出一個引用的時候,會呼叫toString()方法?

通過原始碼可以看出println()這個方法,先呼叫了String中的valueOf()方法,然後valueOf()方法呼叫了toString()方法

註解:在輸出任何資料的時候println()都是先轉換成字串,再呼叫toString(),然後輸出,當println()裡的是物件,也是先轉換為字串,然後呼叫toString(),只不過呼叫的是物件的toString()方法,如果物件沒有重寫,就列印物件記憶體地址

StringBuffer類

含義:StringBuffer代表可變的字元序列,StringBuffer稱為字串緩衝區,實現了序列化介面

繼承了AbstractStringBuilder

工作原理:預先申請一塊記憶體,存放字元序列,如果字元序列滿了,會重新改變快取區的大小,以容納更多的字元序列。StringBuffer是可變物件,與String最大的不同在StringBuilder中是提供了響應的方法讓我們去修改value指向的陣列的元素,這也是StringBuffer的字串序列可變的原因。

JDK1.8,StringBuffer底層是一個char陣列,StringBuffer預設的初始化容量是16

StringBuffer是執行緒安全的,StringBuffer中的每個方法都加上了synchronized鎖

StringBuffer拼接字元使用的是append()方法,在字串的末尾追加,不會新建物件

append()在進行字串追加的時候,會呼叫有ensureCapacityInternal()方法判斷是否需要進行擴容

而ensureCapacityInternal()方法中擴容呼叫的是Arrayys陣列中copyOf()方法

如何優化StringBuffer的效能?

  • 在建立StringBuffer的時候儘可能給定一個初始化容量。

  • 最好減少底層陣列的擴容次數。預估計一下,給一個大一些初始化容量。

  • 關鍵點:給一個合適的初始化容量。可以提高程式的執行效率。

StringBuilder類

含義:StringBuilder代表可變的字元序列,稱為字串緩衝區,實現了序列化介面

繼承了AbstractStringBuilder

工作原理:和StringBuffer相同

StringBuilder不是執行緒安全的

JDK1.8,StringBuilder底層是一個char陣列,StringBuilder預設的初始化容量是16