- 字串和編碼
- 字串在
String內部是通過一個char[]陣串列示的,因此,可以按下面的寫法:String s2 = new String(new char[] {'H', 'e', 'l', 'l', 'o', '!'});
- Java字串的一個重要特點就是字串不可變,這種不可變性是通過內部的
private final char[]欄位,以及沒有任何修改char[]的方法實作的, - Java編譯器在編譯期,會自動把所有相同的字串當作一個物件放入常量池,
- 兩個字串比較,必須總是使用
equals()方法, - 要忽略大小寫比較,使用
equalsIgnoreCase()方法, String還提供了isEmpty()和isBlank()來判斷字串是否為空和空白字串,- 拼接字串使用靜態方法
join(),它用指定的字串連接字串陣列,String[] arr = {"A", "B", "C"}; String s = String.join("***", arr); // "A***B***C" - 字串提供了
formatted()方法和format()靜態方法,可以傳入其他引數,替換占位符,然后生成新的字串,1 public class Main { 2 public static void main(String[] args) { 3 String s = "Hi %s, your score is %d!"; 4 System.out.println(s.formatted("Alice", 80)); 5 System.out.println(String.format("Hi %s, your score is %.2f!", "Bob", 59.5)); 6 } 7 }
- 要把任意基本型別或參考型別轉換為字串,可以使用靜態方法
valueOf(),1 String.valueOf(123); // "123" 2 String.valueOf(45.67); // "45.67" 3 String.valueOf(true); // "true" 4 String.valueOf(new Object()); // 類似java.lang.Object@636be97c
new String(char[])創建新的String實體時,它并不會直接參考傳入的char[]陣列,而是會復制一份,所以,修改外部的char[]陣列不會影響String實體內部的char[]陣列,因為這是兩個不同的陣列,- 那我們經常使用的
UTF-8又是什么編碼呢?因為英文字符的Unicode編碼高位元組總是00,包含大量英文的文本會浪費空間,所以,出現了UTF-8編碼,它是一種變長編碼,用來把固定長度的Unicode編碼變成1~4位元組的變長編碼,通過UTF-8編碼,英文字符'A'的UTF-8編碼變為0x41,正好和ASCII碼一致,而中文'中'的UTF-8編碼為3位元組0xe4b8ad,
- 字串在
-
StringBuilder
- String雖然可以直接拼接字串,但是,在回圈中,每次回圈都會創建新的字串物件,然后扔掉舊的字串,
- 為了能高效拼接字串,Java標準庫提供了
StringBuilder,它是一個可變物件,可以預分配緩沖區,這樣,往StringBuilder中新增字符時,不會創建新的臨時物件, StringBuilder還可以進行鏈式操作,1 public class Main { 2 public static void main(String[] args) { 3 var sb = new StringBuilder(1024); 4 sb.append("Mr ") 5 .append("Bob") 6 .append("!") 7 .insert(0, "Hello, "); 8 System.out.println(sb.toString()); 9 } 10 }
- 查看
StringBuilder的原始碼,可以發現,進行鏈式操作的關鍵是,定義的append()方法會回傳this,這樣,就可以不斷呼叫自身的其他方法, - 對于普通的字串
+操作,并不需要我們將其改寫為StringBuilder,因為Java編譯器在編譯時就自動把多個連續的+操作編碼為StringConcatFactory的操作,在運行期,StringConcatFactory會自動把字串連接操作優化為陣列復制或者StringBuilder操作, -
public StringBuilder delete?(int start, int end)
- StringJoiner
- StringJoiner?(CharSequence delimiter)
- StringJoiner?(CharSequence delimiter, CharSequence prefix, CharSequence suffix)
- 包裝型別
- 自動裝箱(Auto Boxing)
- 所有的包裝型別都是不變類,
1 //原始碼 2 public final class Integer { 3 private final int value; 4 }
-
我們把能創建“新”物件的靜態方法稱為靜態工廠方法,
Integer.valueOf()就是靜態工廠方法,它盡可能地回傳快取的實體以節省記憶體,創建新物件時,優先選用靜態工廠方法而不是new運算子, - 程式設計的一個重要原則:資料的存盤和顯示要分離,
-
處理無符號整型
-
JavaBean
-
class的定義都符合這樣的規范:- 若干
private實體欄位; - 通過
public方法來讀寫實體欄位,// 讀方法: public Type getXyz() // 寫方法: public void setXyz(Type value)
boolean欄位比較特殊,它的讀方法一般命名為isXyz(),// 讀方法: public boolean isChild() // 寫方法: public void setChild(boolean value)
-
把一組對應的讀方法(
getter)和寫方法(setter)稱為屬性(property),例如,name屬性:- 對應的讀方法是
String getName() - 對應的寫方法是
setName(String) - 只有
getter的屬性稱為只讀屬性(read-only) - 只有
setter的屬性稱為只寫屬性(write-only列舉一個JavaBean的所有屬性,可以直接使用Java核心庫提供的Introspector,
- 對應的讀方法是
-
1 import java.beans.*; 2 3 public class Main { 4 public static void main(String[] args) throws Exception { 5 BeanInfo info = Introspector.getBeanInfo(Person.class); 6 for (PropertyDescriptor pd : info.getPropertyDescriptors()) { 7 System.out.println(pd.getName()); 8 System.out.println(" " + pd.getReadMethod()); 9 System.out.println(" " + pd.getWriteMethod()); 10 } 11 } 12 } 13 14 class Person { 15 private String name; 16 private int age; 17 18 public String getName() { 19 return name; 20 } 21 22 public void setName(String name) { 23 this.name = name; 24 } 25 26 public int getAge() { 27 return age; 28 } 29 30 public void setAge(int age) { 31 this.age = age; 32 } 33 }
輸出:
age
public int Person.getAge()
public void Person.setAge(int)
class
public final native java.lang.Class java.lang.Object.getClass()
null
name
public java.lang.String Person.getName()
public void Person.setName(java.lang.String)
- 若干
-
以上更新于 2020年12月25日 00:07:59,后續待更
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/239884.html
標籤:Java
上一篇:糾結哇!日志框架選型,Logback 還是 Log4j2?
下一篇:PHP設計模式之享元模式
