java知識點整理

一、String類

  1. 字符串存儲在內存的常量池中,若一個字符串在內存中已經存在,則不會重新開闢空間
    例如:String s1 = “abc”; String s2 = “abc”;String s3 = new String(“abc”);
    s1 == s2, true s1 == s3, false

  2. 字符串常見的操作:
    a. 獲取
    a.1字符串的長度:int length();
    a.2獲取字符:char charAt(int index); 訪問到字符串中不存在的角標時返回StringIndexOutOfBound異常
    a.3根據字符獲取該字符在字符串中位置:int indexOf(int ch):返回ch在字符串中第一次出現的位置 int indexOf(int ch, int fromIndex);
    a.4 int lastIndexOf(int ch);
    b. 判斷
    b1 字符串是否包含某一個子串 boolean contains(str)
    b2 字符串中是否有內容 boolean isEmpty(): 判斷長度是否爲0
    b3 字符串是否以指定內容開頭 boolean startsWith(str)
    b4 字符串是否以指定內容結尾 boolean endsWith(str)
    b5 字符串的內容是否相同 boolean equals(str)。複寫了Object類中equals方法。
    b6 判斷內容是否相同,並忽略大小寫 boolean equalsIgnoreCase(str)
    c. 轉換
    c1 將字符數組轉成字符串
    構造函數:String(char[]) String(char[], offset, count)
    靜態方法:static String copyValueOf(char[]) static String copyValueOf(char[] data, int offset, int count) static String valueOf(char[]);
    c2 將字符串轉成字符數組
    c3 將字節數組轉成字符串
    c4 將字符串轉成字節數組
    c5 將基本數據類型轉成字符串

注:字符串和字節數組在轉換過程中,可以指定編碼表

d. 替換 String replace(oldchar, newchar)
e. 切割 String[] split(regex)

獲取字符串最大相同子串:

public static String getMaxSubString(Sring s1, String s2){
    for(int I = 0; I < s2.length(); i++){
        for(int j = 0, z = s2.length()-i; z < s2.length()+1; j++, z++){
            String tmp = s2.subString(j, z);
            if (s1.contains(tmp))
                return tmp;
        }
    }
    return null;
 }

二、StringBuffer和StringBuilder

StringBuffer: 字符串緩衝區
是一個容器,1. 長度可變化 2. 可以字節操作多個數據類型 3. 最終可通過toString()方法變成字符串

StringBuilder: 與StringBuffer一樣,但是在1.5版本後纔出現,但是StringBuilder線程不安全。因爲StringBuffer每次操作都需要判斷鎖,而StringBuilder沒有鎖,所以效率要高很多。單線程用StringBuilder,多線程用StringBuffer或者StringBuilder自己加鎖。

三、基本數據類型包裝類:

byte->Byte short->Short int->Integer long->Long boolean-Boolean double->Double char->Character
整數類型的最大值:Integer.MAX_VALUE

基本數據類型對象包裝類的最常見操作:
1. 基本數據類型轉字符串
基本數據類型+“”
基本數據類.toString(基本數據類型) 如:Integer.toString(34)
2. 字符串轉數據類型
int num = Integer.parseInt(“123”)
long x = Long.parseLong(“123”)
boolean b = Boolean.parseBoolean(“true”)

注:

 Integer m = 127; 
 Integer n = 127; 
 System.out.println(m==n)
 Output: true
Integer a = 128; Integer b = 128; 
System.out.println(a==b)
Output: false

在新特性中,若結果在byte範圍內的值,若該數值已經存在,則不會開闢新空間

基本數據類型包裝類都重寫了Object類中的equals()方法,都判斷內容是否相等。==是判斷是否爲同一對象。

四、集合框架

集合和數組區別:數組是固定的,集合是可變的
集合類特點:集合只用於存儲對象,集合長度是可變的,集合可存儲不同類型的對象

Collection接口抽取出來List接口和Set接口,List接口有三種具體實現方式ArrayList,LinkedList,Vector,set有HashSet和TreeSet
爲什麼會有這麼多容器? 因爲每一個容器對數據的存儲方式都有不同
這個存儲方式稱之爲數據結構

迭代器:集合取出元素的方式
Iterator it = al.iterator();
hasNext():判斷是否有可迭代元素 next():取出下一個元素 remove():移除迭代器返回的最後一個對象
因爲每一個容器底層的數據結構不同,所以存取的方式也不同,每個集合的存取方式不足以用一個方法來描述,因此將存取操作封裝到一個類中,而這個類就定義在集合的內部,因爲元素在集合中,想要操作集合元素,在集合內部操作比較方便。但是存取操作會存在很多共性,比如判斷是否有元素和取出元素,於是就把這些共性內容抽取出來,作爲一個接口就是iterator接口,由所有內部類去實現該接口,如何獲取集合的取出對象呢?對外提供了一個iterator()方法

Collection:
|–List:元素是有序的,元素可以重複,因爲該集合體繫有索引
|–ArrayList底層用數組數據結構實現。特點:查詢速度快,但增刪慢。線程不同步
|–LinkedList底層是鏈表數據結構。特點:增刪快,查詢慢
|–Vector底層是數組數據結構。1.0出現,元老級別,線程同步(被替代)
|–Set: 元素無序,元素不可重複
|–HashSet底層數據結構是哈希表
|–TreeSet可以對set集合中的元素進行排序,底層數據結構是二叉樹

List的特有方法,可以操作角標的方法
增,add(index,element) 刪remove(index) 改set(index,element) 查get(index) subList(from,to) listIterator()
若在迭代過程中準備添加或刪除元素,iterator迭代器無法完成,List集合中有一個特有的迭代器ListIterator,它是iterator的子接口,改接口只能通過List集合的listIterator方法獲取
ListIterator li = al.listIterator() 可以實現在集合遍歷過程中的增刪改查。

注意:在用迭代器去元素的時候,迭代器取一個元素就要先判斷元素是否存在。

將類傳入一個ArrayList al中,要判斷al中是否包含某個對象,需要在類中重寫equals方法,因爲Object類中的equals方法默認判斷兩個對象的地址是否相同。

HashSet如何保證元素唯一?
HashSet在存入元素的時候,先比較hashcode是否相同,如若不同,則直接存入;如若相同,則調用equals方法去比較內容是否相同。
HashSet如何存儲自定義對象?
複寫Object類中的hashcode方法,用類中的元素值的哈希值進行復寫,比如name.hashCode()+age*37,age*37是爲了保證唯一性。然後複寫Object類中的equals方法。
注意:ArrayList判斷元素是否存在和刪除元素依賴equals;HashSet判斷元素是否存在和刪除元素,先判斷hashcode是否相同,再依賴equals。

TreeSet存入自定義對象:自定義類要實現Comparable接口,實現裏面的CompareTo方法,該接口強制讓自定義類具備比較性。排序時,當主要條件相同時,一定要判斷次要條件。
TreeSet保證元素唯一性的依據是compareTo方法返回0.
TreeSet排序的第一種方式:讓元素具備比較性。元素需要實現Comparable接口,覆蓋compareTo方法。
第二種方式:當元素不具備比較性,或者具備的比較性不是所需要的。這時需要讓集合自身具備比較性。具體方式:定義比較器,將比較器對象作爲參數傳遞給TreeSet集合的構造函數。定義一個類,實現Comparator接口,覆蓋compare方法。
當兩種方式都存在時,以比較器爲主。
注意:一定要考慮到主要條件比較完還有次要條件需要比較。

五、泛型

好處:1. 將運行時期出現問題ClassCastException轉移到了編譯時期,方便於程序員解決問題,讓運行時期的問題減少,安全;2. 避免的強制轉換的麻煩。

泛型類:
1. 泛型類定義的泛型在整個類中有效,若被方法使用,那麼泛型類的對象明確要操作的具體類型後,所有要操作的類型就已經固定了。
2. 爲了讓不同的方法操作不同類型,而且類型不確定,則可以將泛型定義在方法上。
3. 可以在泛型類中定義泛型方法,但是在創建對象時指定的泛型類的類型,和泛型類相同類型的方法需要與指定泛型類類型相同。
4. 注意:靜態方法不能訪問類上定義的泛型,如果靜態方法操作的應用數據類型不確定,需要在靜態方法上定義泛型,public static 返回值 XXX(){}

泛型定義在接口上:

class InterImpl<T> implements Inter<T>{
        public void show(T t){}
}

泛型限定:(?是通配符,也即佔位符)
? extends E:可以接收E類型或E的子類型,上限。
? super E:可以接受E或者E的父類型,下限。
普通的泛型:

public static <T> void XXX(ArrayList<> al){}

或者

public static void XXX(ArrayList<?> al){}

若要限定操作某一類型的子類:

public static void XXX(ArrayList<? extends Person> al){}
發佈了27 篇原創文章 · 獲贊 45 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章