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