4、集合
數組: 1、只能存儲同一類型的數據(注意Object類型的數組能存儲任意類型的數據) 2、初始化之后長度固定 3、數組中元素之間的內存地址連續 集合:存儲數據對象的容器 優勢: 1、可以存儲任意類型對象的數據 2、集合的長度可變
一、單列集合
導包的時候是util包 -------| Collection ?單例集合的根接口 -----------| List ?子接口,實現了的類有序、可重復 -----------| Set ?子接口,實現了的類無序、不可重復1、Collection中的方法:
(1)增加 add(E e); addAll(Collection<? extends E> c);(2)刪除
clear(); remove(Object o); removeAll(Collection<?> c); // 刪除交集元素 retainAll(Collection<?> c); // 保留交集元素,刪除其余元素 (3)查看 size()(4)判斷
contains(Object o); // contains內部依賴于equals方法進行比較,調用的是實參的equals方法,一般也重寫hashcode() containsAll(Collection<?> c); equals(Object o); hashCode(); isEmpty();java規范:一般重寫了equals方法也需要重寫hashCode方法
(5)迭代
iterator(); // 抓取集合中的元素 toArray(); // 返回集合元素組成的數組 Object[] arr = c.toArray(); Arrays.toString(arr ) Object[] arr = c.toArray(); // 從object數組中取出的元素只能使用object聲明變量接收,需要其他的類型則需要強轉?
2、迭代器(常用,適用于各種集合的遍歷)
Iterator迭代器的作用:用于遍歷集合中的元素 迭代器的方法: 1、hasNext():是否有元素可以遍歷 2、next():取出下一個元素 3、remove():移除最后一次返回的元素 Iterator i = c .iterator(); // 能夠用Iterator 接口接受對象,是多態,c .iterator()返回的是Iterator 接口的實現類對象,故i可以調用方法,若是返回值寫死為接口實現類對象而不是接口,非常不靈活,當返回值是其實現類時無法實現?
3、List?
特有方法特點:操作方法都具備索引值,無排序方法。 (1)添加 add(int index, E element); addAll(int index, Collection<? extends E> c) // 把集合添加到另一結合的末尾(2)獲取
get(int index); // 根據索引值獲取元素,可用于遍歷集合的元素 indexOf(Object o); // 指定元素第一次出現在集合中的索引值 lastIndexOf(Object o); // 指定元素最后一次出現在集合中的索引值 subList(int fromIndex, int toIndex); // 截取集合中的元素(3)修改
set(int index, E element); // 替換指定索引的元素(4)迭代
listIterator(int index);?
??ListIterator特有的方法
hasPrevious(); // 是否有上一個元素 previous(); // 當前指針向上移動一個單位,再取出當前指針指向的元素;next是先取出元素,然后再移動指針 add(E e); // 插入到當前指針指向的位置上 set(E e); // 替代迭代器最后一次返回的元素 注意: 在迭代器遍歷集合的過程中(從創建到結束使用),不允許使用集合對象改變集合中元素的個數,只能用迭代器進行操作(否則ConcurrentModification異常;迭代器add元素時會加一跳過當前元素)3.1、ArrayList?(--> List)
ArrayList底層維護了一個Object數組,使用無參構造函數,數組默認長度是10,長度不夠時, 自動增加0.5倍 特點:查詢速度快(元素之間內存地址連續),增刪速度慢(增加時每次檢查數組長度,不夠時要把舊數組復制到新數組中;刪除時后面元素要往前挪) 查詢多,增刪少的時候用ArrayList(圖書館)3.2、LinkedList (-->?List)
使用鏈表數據結構,查詢慢(元素之間內存地址不連續),增刪快 特有方法(用得少) (1)方法 addFirst(E e); addLast(E e); // 和add一樣 getFirst(); getLast(); removeFirst(); removeLast();(2)數據結構
1.棧(1.6):用LinkedList 實現堆棧數據結構的存儲方式 push(E e); // 插入列表開始 pop();2.隊列:用LinkedList模擬隊列數據結構的存儲方式
offer(E e); // 添加到隊尾 poll(); // 刪除隊首3.返回逆序的迭代器對象
descendingIterator(); // 逆序遍歷集合?
3.3、Vector (--> List)
底層維護了一個Object數組,實現與ArrayList一樣,但是線程安全,操作效率低,被ArrayList取代 ArrayList與Vector的區別: 相同點: 都是底層維護了一個Object數組 不同點: 1、ArrayList線程是不同步的,操作效率高;Vector是線程同步的,操作效率低 2、ArrayList是JDK1.2出現的額;Vector是JDK1.0出現的4、Set
無序:添加元素的順序和元素出來的順序不一致,無索引出來的順序隨機 遍歷只能使用迭代器iterator HashSet -->?Set 特點:底層使用了哈希表來支持,存取速度快 可用于存儲用戶名和密碼 實現原理: 往HashSet中添加元素時,會調用元素的hashCode方法得到元素的hash值,然后通過元素的哈希值(相當于內存地址)等經過移位等運算,就可以計算出元素在哈希表中的位置。 情況一:如果算出元素存儲的位置上沒有元素,那么該元素直接存儲; 情況二:如果算出該元素的存儲位置上已經有其他的元素了,那么就會再調用equals方法與該位置的元素再比較一次,如果equals方法返回true,那么就不允許添加(hashCode() --> equals ()) 哈希表是桶式結構 HashCode默認情況下是內存地址,但String類已經重寫了Object的hashCode方法了(將字符串放入字符數組,遍歷字符數組通過元素算出 ) TreeSet --> Set 如果元素具備具備自然順序的特性,就按元素的自然順序的特性進行排序存儲 注意事項:(1、元素所屬類實現Comparable接口 和compareTo 方法;2、創建TreeSet 傳入Comparator 接口的實現類作為實參) 1、添加元素時,如果元素本身具備自然順序就按自然順序排序 2、添加元素時,不具備自然順序,該元素的所屬的類必須實現Comparable接口,把比較規則定義在compareTo方法上 3、compareTo 返回的是0則是重復元素,不允許添加 4、添加元素時,不具備自然特性且沒有實現Comparable接口,那么創建TreeSet時必須傳入一個Comparator比較器參數 5、元素所屬的類實現了Comparable接口, 且在創建TreeSet對象的時候也傳入了比較器,比較器優先 實現原理:底層是用紅黑樹(二叉樹)的數據結構顯示,左小右大,當連續三個只有一側節點時,二叉樹會自動調整節點 自定義比較器類:實現Comparator接口,把元素的比較方法定義在compare方法中即可 推薦使用Comparator,提高復用性 String實現了Comparable接口,可以排序 字符串比較規則: 1、對應位置上有不同的字符出現,比較對應位置上的字符 2、對應位置上都一樣,比較字符串長度 Set無get方法,List才有,遍歷TreeSet的時候要使用迭代器?二、雙列集合
----------| Map 如果實現了Map接口的集合類,具備的特點:存儲的數據以鍵值對的形式存在,鍵不可重復,值可以重復 ----------------| HashMap 底層依賴哈希表實現 ----------------| TreeMap? 底層依賴紅黑樹(二叉樹)實現,會對鍵進行排序 ----------------| HashTable?底層依賴哈希表實現,線程安全,操作效率低,JDK1.0?1、Map接口方法
(1)添加 put(K key, V value); // 存在該鍵,就返回對應的值,不存在就返回空(2)獲取
get(Object key); size(); // 獲取集合中的鍵值對個數(3)判斷
containsKey(Object key); containsValue(Object value); isEmpty();(4)刪除
remove(Object key); // 根據鍵刪除map中的數據,返回該鍵對應的值 clear();(5)迭代
keySet(); // 把Map集合中的所有鍵都保存到一個set集合對象并返回 values(); // 把所有的值存儲到一個Collection集合中返回 entrySet(); // 把鍵值對保存到set中返回?
2.1、HashMap --> Map
存儲原理: 往HashMap中添加元素的時候,首先會調用鍵的hashCode方法得到元素的哈希值,然后經過運算就可以算出還元素在哈希表中的存儲位置 情況一:如果該位置上還沒有元素,就可以直接添加到哈希表中 情況二:要是有元素,會調用equals方法與這個位置上的元素進行比較,返回false允許添加,返回true不能添加?2.2、TreeMap --> Map
基于紅黑樹(二叉樹)實現,必須排序 1、添加元素時,鍵具備自然順序就按自然順序排序 2、不具備自然順序,鍵所屬的類必須實現Comparable接口,把鍵的比較規則定義在CompareTo方法上 3、不具備自然順序,且沒有實現Comparable接口,在創建TreeMap對象的時候傳入比較器 4、兩個元素鍵一樣,值覆蓋三、集合工具類(Collections )
Collection和Collections的區別: Collection是單列集合的根接口,Collections是集合工具類1、Collections集合工具類常用方法:
(1)對list集合進行排序 sort(list); // 具備自然順序的元素sort(list, comparator); // 不具備自然順序的元素(2)對list進行二分查找,前提是該集合一定有序
int binarySearch(list, key);int binarySearch(list, key, comparator);(3)對集合取最大或者最小值
max(Collection); max(Collection, comparator);(4)對list進行反轉
reverse(list);(5)可以將不同的集合變成同步的集合
Set synchronizedSet(Set<T> s); Map synchornizedMap(Map<K, V> m); List synchronizedList(List<T> list);?
四、數組工具類(Arrays)
(1)將數組變為字符串 toString(int[]);(2)賦值數組
copyOf();(3)賦值部分數組
copyOfRange();(4)比較兩個數組對應位置的元素是否相同
equals(int[], int[]);(5)將數組變為集合
List asList(T[]);?
五、正則表達式
操作字符串的規則 網絡爬蟲1、預定義字符
任何預定義字符沒有加上數量詞之前都只能匹配一個字符 .:任意字符(與行結束符可能匹配也可能不匹配),要匹配.字符,用\\. \d:數字[0-9], \D:非數字:[^0-9] \w:單詞字符:[a-z A-Z _ 0-9] \W:非單詞字符:[^\w] \s:空白字符:[\t \n \x 0B \f \r] \S:非空白字符:[^\s]2、數量詞
X?:一次或者一次都沒有 X*:零次或者多次 X+:至少出現一次 X{n}:恰好出現n此 X{n, }:至少n次 X{n, m}:至少出現,次,不超過m次3、范圍詞
沒有數量詞,只能匹配一個 [abc]: a、b、c其中一個 [^abc]:任何字符,除a、b、c [a-z A-Z]:a-z或A-Z兩頭都算 [a-d[m-p]]:a到d或m-p,并集 [a-z&&[def]]:d、e、f,交集 操作字符串的應用: 匹配:matches() 切割:spilt(),按字符內容切割,切割完的內容要放入數組中 替換:replaceAll(),要在正則的外部引用組的內容,用“$組號” 查找:需要使用的對象Pattern(正則對象),Matcher(匹配器對象)? Pattern是正則表達式的編譯表示形式 匹配器使用的方法 1、find() 通知匹配器匹配字符串,查找符合規則的子串 2、group() 獲取符合規則的子串,使用之前要用find先查找 正則需要復用,需要對正則進行分組,分組的目的就是提高正則的復用性,組號不能指定,從1開始 (.)\\1 \1:引用第一組匹配的內容 單詞邊界匹配器 \b 單詞邊界器只是代表了單詞的開始或者結束部分,不匹配任何字符 hello\\b world 有事聯系我? 1234567@163.com?有事聯系我? 1234567@qq.com.cn? -->? [a-zA-Z1-9]\\w{5,17}@[a-zA-Z0-9]{2,}(\\.(com|cn|net)){1,2}?六、JDK1.5的新特性
1、靜態導入
作用:簡化書寫 import static 包名.類名.靜態的成員 import static java.util.Collections.sort; // 簡化Collections.sort()為sort()) import static java.lang.System. out; // 簡化為out靜態導入可以作用于一個類的所有靜態成員
import static java.util.Collections.* // 整體導入 注意事項: 1、靜態導入的成員與本類的成員存在同名的情況下,默認使用本類的靜態成員,如果指定使用靜態導入的成員,需要在靜態成員之前加上類名2、增強for循環
作用:簡化迭代器的書寫格式,底層還是用迭代器(出錯還是迭代器的java.util.ConcurrentModificationException) 適用范圍:實現了Iterable接口的對象或是數組對象 格式:for(數據類型 變量名:遍歷的目標) 注意事項: 1、底層使用迭代器,有JVM完成,遍歷元素的過程中不能操作集合對個數進行修改 2、迭代器遍歷元素時可以刪除集合元素,增強for循環遍歷集合元素時不能調用迭代器增刪元素 3、普通for循環可以沒有遍歷的目標,增強for循環一定要有遍歷的目標 增強for循環不能直接遍歷map(沒有實現Iterable接口),要通過entrySet方式將Entry存入set之后,通過遍歷set實現 自定義類要想使用增強for循環,必須實現Iterable接口 實現hasNext和next方法,,參考ArrayList3、可變參數(JDK1.5)
int main(數據類型... 變量名) 注意事項: 1、形參用了可變參數,調用方法時,可以傳參,也可以不傳 2、可變參數是一個數組 3、可變參數必須位于形參中的最后一個,一個方法只能有一個可變參數4、自動裝箱、拆箱
包裝類型對應8種基本類型 byte ? ? ? --> Byte ? ? ? ? -----------> ?? 1 short ? ? ?--> Short ? ? ? -----------> ? ?2? int ? ? ? ?? --> Interger ? -----------> ? ?4 long ? ? ? --> Byte ? ? ? ? -----------> ? ?8 float ? ? ? --> Float ? ? ? ?-----------> ? ?4 double ? --> Double ? ? -----------> ? ?8 char ? ? ? --> Character?-----------> ? ?2(可以存儲一個中文漢字) 1個字節等于8位 好處:自動裝箱:自動把java基本類型數據轉換成對象類型數據
Integer類內部維護了緩沖區(IntegerCache),緩沖區存儲的-128~127范圍的數據在數組中,如果在此范圍中,直接從緩沖區中獲取 Integer a1 =12; Integer a2 = 12; a1==a2 ?// true,比較地址?5、枚舉(JDK1.5)
某些方法接收的數據必須是在固定范圍內的,解決方法之一就是自定義一個類,私有化構造函數,在自定義類中創建本類的對象JDK1.5之后,它需要的數據不是任意的,必須在一定范圍之內的值,可以用枚舉來解決(方向、性別、星期、月份、季節......)
enum 類名 { }反編譯:?
1、枚舉值是一個特殊的類 2、默認public static final修飾 3、枚舉值的數據類型是枚舉值所屬類的的數據類型,枚舉值指向了本類的數據對象 4、枚舉類的構造方法默認是private的 5、枚舉類能自定義自己的成員變量和成員方法 6、枚舉類可以自定義構造函數,但是構造函數的修飾符必須是private,要是有參的構造函數,必須在開始傳入參數8、枚舉值必須放在最第一句
switch適用的數據類型 byte/char/short/int/string/枚舉 case之后跟的枚舉值只需要枚舉值,不需要枚舉值是哪個枚舉類的(在switch條件中已經確定了枚舉類型,case中防止亂傳別的枚舉值)??
轉載于:https://www.cnblogs.com/1989guojie/p/6107655.html
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
- 上一篇: 一加3 CM13 12306 不能用
- 下一篇: iOS瀑布流实现(Swift)