日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

4、集合

發(fā)布時(shí)間:2024/4/14 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 4、集合 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
數(shù)組: 1、只能存儲(chǔ)同一類(lèi)型的數(shù)據(jù)(注意Object類(lèi)型的數(shù)組能存儲(chǔ)任意類(lèi)型的數(shù)據(jù)) 2、初始化之后長(zhǎng)度固定 3、數(shù)組中元素之間的內(nèi)存地址連續(xù) 集合:存儲(chǔ)數(shù)據(jù)對(duì)象的容器 優(yōu)勢(shì): 1、可以存儲(chǔ)任意類(lèi)型對(duì)象的數(shù)據(jù) 2、集合的長(zhǎng)度可變

一、單列集合

導(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方法,,參考ArrayList

3、可變參數(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é)

以上是生活随笔為你收集整理的4、集合的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。