詳解java中的Collections類
一般來(lái)說(shuō)課本上的數(shù)據(jù)結(jié)構(gòu)包括數(shù)組、單鏈表、堆棧、樹(shù)、圖。我這里所指的數(shù)據(jù)結(jié)構(gòu),是一個(gè)怎么表示一個(gè)對(duì)象的問(wèn)題,有時(shí)候,單單一個(gè)變量聲明不堪大用,比如int,String,double甚至一維數(shù)組、二維數(shù)組無(wú)法完全表達(dá)你要表達(dá)的東西,而定義一個(gè)類Class有太過(guò)麻煩,這時(shí)候,你可以考慮一下用Java中的Collections類。使用Collections類,必須在文件頭聲明import java.util.*;
一、動(dòng)態(tài)、有序、可變大小的一維數(shù)組Vector與ArrayList
Collections類里面包括動(dòng)態(tài)、有序、可變大小的一維數(shù)組Vector與ArrayList。
Vector與ArrayList,兩者唯一的差別是:vector自帶線程互斥,多個(gè)線程對(duì)其讀寫(xiě)會(huì)拋出異常,而arraylist則允許多個(gè)線程讀寫(xiě),其他部分是一模一樣的,換句話說(shuō),如果是單線程在讀寫(xiě),使用Vector與ArrayList沒(méi)有任何區(qū)別,但現(xiàn)在編程基本都用ArrayList,使用Vector有點(diǎn)非主流了。
1、Vector的使用如下:
public static void Vectortest() { // Vector<Double>表示這個(gè)vector只能存放double // Vector<String>表示這個(gè)vector只能存String // 雖然Vector<Object> vector=new Vector<Object>();等價(jià)于Vector vector=new // Vector();但是,eclipse中這樣寫(xiě)會(huì)警告,表示你這個(gè)Vector不規(guī)范,╮(╯▽╰)╭ Vector<Object> vector = new Vector<Object>(); vector.add(1.6); vector.add(2.06); vector.add(1); System.out.println("單純的add表示從結(jié)尾加入元素:" + vector); System.out.println("size()能求出vector的所含元素的個(gè)數(shù):" + vector.size()); vector.remove(1); System.out.println("remove(1)表示刪去第1個(gè)元素,由于計(jì)數(shù)從0開(kāi)始,也就是2.06這個(gè)元素:" + vector); vector.remove(vector.lastElement()); System.out.println("刪去最后一個(gè)元素的vector為:" + vector); vector.add(0, 1.8888); System.out.println("在第0個(gè)位置加入1.8888這個(gè)元素:" + vector); vector.set(0, "a"); System.out.println("把第0個(gè)位置這個(gè)元素改為a:" + vector); }
這段方法如果在主函數(shù)調(diào)用:
System.out.println("======Vector數(shù)據(jù)結(jié)構(gòu)的測(cè)試開(kāi)始======"); Vectortest(); System.out.println("======Vector數(shù)據(jù)結(jié)構(gòu)的測(cè)試結(jié)束======");
運(yùn)行結(jié)果如下:
======Vector數(shù)據(jù)結(jié)構(gòu)的測(cè)試開(kāi)始======
單純的add表示從結(jié)尾加入元素:[1.6, 2.06, 1]
size()能求出vector的所含元素的個(gè)數(shù):3
remove(1)表示刪去第1個(gè)元素,由于計(jì)數(shù)從0開(kāi)始,也就是2.06這個(gè)元素:[1.6, 1]
刪去最后一個(gè)元素的vector為:[1.6]
在第0個(gè)位置加入1.8888這個(gè)元素:[1.8888, 1.6]
把第0個(gè)位置這個(gè)元素改為a:[a, 1.6]
======Vector數(shù)據(jù)結(jié)構(gòu)的測(cè)試結(jié)束======
2、ArrayList
public static void ArrayListtest() { ArrayList<Double> arraylist = new ArrayList<Double>(); arraylist.add(1.0); arraylist.add(4.0); arraylist.add(5.0); arraylist.add(2.3); System.out.println("單純的add表示從結(jié)尾加入元素:" + arraylist); System.out.println("size()能求出所含元素的個(gè)數(shù):" + arraylist.size()); arraylist.remove(1); System.out.println("remove(1)表示刪去第1個(gè)元素,由于計(jì)數(shù)從0開(kāi)始,也就是4這個(gè)元素:" + arraylist); arraylist.remove(arraylist.size() - 1); System.out.println("刪去最后一個(gè)元素的arraylist為:" + arraylist); arraylist.add(0, 1.8888); System.out.println("在第0個(gè)位置加入1.8888這個(gè)元素:" + arraylist); arraylist.set(0, 9.0); System.out.println("把第0個(gè)位置這個(gè)元素改為a:" + arraylist); Collections.sort(arraylist); System.out.println("如果arraylist不是抽象類型,則支持排序" + arraylist); }
這里可以看到ArrayList刪除最后一個(gè)元素的方式與Vector有所不同,主要是ArrayList沒(méi)有l(wèi)astElement()這個(gè)方法來(lái)取出最后一個(gè)元素remove()掉,只能用arraylist.size() - 1來(lái)確定最后一個(gè)元素的位置。如果在主函數(shù)這樣調(diào)用這段方法:
System.out.println("======ArrayList數(shù)據(jù)結(jié)構(gòu)的測(cè)試開(kāi)始======"); ArrayListtest(); System.out.println("======ArrayList數(shù)據(jù)結(jié)構(gòu)的測(cè)試結(jié)束======");
則得到如下的運(yùn)行結(jié)果:
======ArrayList數(shù)據(jù)結(jié)構(gòu)的測(cè)試開(kāi)始======
單純的add表示從結(jié)尾加入元素:[1.0, 4.0, 5.0, 2.3]
size()能求出所含元素的個(gè)數(shù):4
remove(1)表示刪去第1個(gè)元素,由于計(jì)數(shù)從0開(kāi)始,也就是4這個(gè)元素:[1.0, 5.0, 2.3]
刪去最后一個(gè)元素的arraylist為:[1.0, 5.0]
在第0個(gè)位置加入1.8888這個(gè)元素:[1.8888, 1.0, 5.0]
把第0個(gè)位置這個(gè)元素改為a:[9.0, 1.0, 5.0]
如果arraylist不是抽象類型,則支持排序[1.0, 5.0, 9.0]
======ArrayList數(shù)據(jù)結(jié)構(gòu)的測(cè)試結(jié)束======
從上面的兩個(gè)例子,可以看到Vector與ArrayList比一個(gè)普通的數(shù)組,也就是課本上所教的一維數(shù)組int array[] = { 8, 7, 100, 88, 6, 4, 5, 33, 7 };強(qiáng)大很多,可以在任意位置插入元素,也可以不用遍歷數(shù)組就能夠用一個(gè)方法刪除指定位置的元素,當(dāng)然為你考試你還是要知道這個(gè)數(shù)組是怎么遍歷的。其實(shí),ArrayList與普通的一維數(shù)組完全可以實(shí)現(xiàn)互轉(zhuǎn),而且利用ArrayList還能夠直接對(duì)array進(jìn)行排序,而不用再對(duì)array寫(xiě)一個(gè)冒泡排序之類的,直接用Collections.sort();就能夠排序數(shù)組,然后再用Collections.reverse();就能實(shí)現(xiàn)逆排序,當(dāng)然還是那句,為你考試你還是要知道這個(gè)數(shù)組是怎么排序的。
比如如下的方法,實(shí)現(xiàn)了對(duì)一維數(shù)組int array[] = { 8, 7, 100, 88, 6, 4, 5, 33, 7 };的排序與逆排序,先把數(shù)組轉(zhuǎn)化成ArrayList再用Collections.sort();與Collections.reverse();排序,最后再把ArrayList內(nèi)容轉(zhuǎn)化回一維數(shù)組:
public static void arrayListSort() { int array[] = { 8, 7, 100, 88, 6, 4, 5, 33, 7 }; ArrayList<Integer> arraylist = new ArrayList<Integer>(); for (int i = 0; i < array.length; i++) System.out.print(array[i] + ","); for (int i = 0; i < array.length; i++) arraylist.add(array[i]); Collections.sort(arraylist); for (int i = 0; i < array.length; i++) array[i] = arraylist.get(i); System.out.print("排序后的數(shù)組:"); for (int i = 0; i < array.length; i++) System.out.print(array[i] + ","); Collections.reverse(arraylist); for (int i = 0; i < array.length; i++) array[i] = arraylist.get(i); System.out.print("逆排序后的數(shù)組:"); for (int i = 0; i < array.length; i++) System.out.print(array[i] + ","); //排序之后把a(bǔ)rraylist銷毀 arraylist = null; //這句是建議Java馬上回收垃圾,當(dāng)然這句有沒(méi)有都行,Java在運(yùn)行的過(guò)程中會(huì)自動(dòng)清除垃圾的 System.gc(); }
在主函數(shù)中這樣調(diào)用方法:
System.out.println("======Java數(shù)組排序開(kāi)始======"); arrayListSort(); System.out.println("======Java數(shù)組排序結(jié)束======");
就能夠得到如下的運(yùn)行結(jié)果:
======Java數(shù)組排序開(kāi)始======
8,7,100,88,6,4,5,33,7,排序后的數(shù)組:4,5,6,7,7,8,33,88,100,逆排序后的數(shù)組:100,88,33,8,7,7,6,5,4,
======Java數(shù)組排序結(jié)束======
另外,之前說(shuō)的《Java中List的使用方法簡(jiǎn)單介紹》(點(diǎn)擊打開(kāi)鏈接)也是同樣的道理
二、集合HashSet
另外,還有集合HashSet,HashSet與數(shù)學(xué)上的集合概念一模一樣。由一個(gè)或多個(gè)元素所構(gòu)成的叫做集合。HashSet具有:
1.確定性,集合中的元素必須是確定的,這個(gè)是廢話,必須確定,難道我還可以在里面放一個(gè)不確定的東西進(jìn)去嗎?
2.互異性,集合中的元素互不相同。例如:集合A={1,a},則a不能等于1,也就是如果你把兩個(gè)1放進(jìn)HashSet會(huì)自動(dòng)變?yōu)橐粋€(gè)1
3.無(wú)序性,集合中的元素沒(méi)有先后之分。因此HashSet也不得進(jìn)行排序操作
例如如下的一段方法:
public static void HashSettest() { HashSet<Object> hashset = new HashSet<Object>(); hashset.add(1); hashset.add(1); hashset.add(5); hashset.add(2.3); System.out.println("單純的add表示從結(jié)尾加入元素:" + hashset); System.out.println("size()能求出所含元素的個(gè)數(shù):" + hashset.size()); hashset.remove(1); System.out.println("remove(1)表示刪去'1'這個(gè)元素:" + hashset); hashset.remove("asd"); System.out.println("如果沒(méi)有'asd'這個(gè)元素則remove什么都不做:" + hashset); hashset.add(1.8888); System.out.println("加入1.8888這個(gè)元素:" + hashset); }
在主函數(shù)中,調(diào)用這個(gè)方法:
System.out.println("======HashSet數(shù)據(jù)結(jié)構(gòu)的測(cè)試開(kāi)始======"); HashSettest(); System.out.println("======HashSet數(shù)據(jù)結(jié)構(gòu)的測(cè)試結(jié)束======");
結(jié)果如下:
======HashSet數(shù)據(jù)結(jié)構(gòu)的測(cè)試開(kāi)始======
單純的add表示從結(jié)尾加入元素:[1, 5, 2.3]
size()能求出所含元素的個(gè)數(shù):3
remove(1)表示刪去'1'這個(gè)元素:[5, 2.3]
如果沒(méi)有'asd'這個(gè)元素則remove什么都不做:[5, 2.3]
加入1.8888這個(gè)元素:[5, 1.8888, 2.3]
======HashSet數(shù)據(jù)結(jié)構(gòu)的測(cè)試結(jié)束======
HashSet有add()方法與remove()方法,add()所加的元素沒(méi)有順序,每次用System.out.println()打印的結(jié)果可能順序不一樣,也不能向上面Vector與ArrayList一樣,只要所存的元素不是Object,就能使用Collections.sort(arraylist);來(lái)排序
三、二元組HashMap
這里的使用方法和上面的數(shù)據(jù)基本相同,也很簡(jiǎn)單,就是put方法來(lái)對(duì)象進(jìn)去map,而get能夠取走map中的對(duì)象,但是試圖把二元組HashMap用成三元組是錯(cuò)誤的,如果一個(gè)對(duì)象中含有元素過(guò)多,那你應(yīng)該考慮用類。而不是還在迷戀Java中介乎于普通變量與Class類之間的Collections類。
比如如下方法就展示了試圖把HashMap改成三元組的錯(cuò)誤操作:
public static void Maptest(){ System.out.println("======Map錯(cuò)誤的使用開(kāi)始======"); HashMap<String,String> map=new HashMap<String, String>(); HashMap<String,HashMap<String, String>> bigmap=new HashMap<String, HashMap<String, String>>(); map.put("key1","1"); map.put("key2","2"); bigmap.put("test1",map); map.clear(); map.put("key1","3"); map.put("key2","4"); bigmap.put("test2",map); System.out.println(bigmap); System.out.println(bigmap.get("test1").get("key1")); System.out.println(bigmap.get("test1").get("key2")); System.out.println(bigmap.get("test2").get("key1")); System.out.println(bigmap.get("test2").get("key2")); System.out.println("======Map錯(cuò)誤的使用結(jié)束======"); System.out.println("======Map正確的使用開(kāi)始======"); map.clear(); bigmap=null; map.put("key1","1"); map.put("key2","2"); map.put("key3","3"); System.out.println(map); System.out.println("======Map正確的使用結(jié)束======"); }
在主函數(shù)調(diào)用這段代碼,得到下面的運(yùn)行結(jié)果:
======Map數(shù)據(jù)結(jié)構(gòu)的測(cè)試開(kāi)始======
======Map錯(cuò)誤的使用開(kāi)始======
{test1={key2=4, key1=3}, test2={key2=4, key1=3}}
3
4
3
4
======Map錯(cuò)誤的使用結(jié)束======
======Map正確的使用開(kāi)始======
{key3=3, key2=2, key1=1}
======Map正確的使用結(jié)束======
======Map數(shù)據(jù)結(jié)構(gòu)的測(cè)試結(jié)束======
這段程序本來(lái)用意是很明顯,試圖構(gòu)造出一個(gè){test1,key1,1},{test1,key2,2},{test2,key3,3},{test2,key4,4}
然而,每個(gè)bigmap中還是存得都是那個(gè)map,你一旦把map清空,原來(lái)test1中的那個(gè)map也同樣被清空, 有人試圖創(chuàng)造多個(gè)map1,map2,...那你還不如用一個(gè)簡(jiǎn)單的類,看起來(lái)更加明確,而且類中以后還能寫(xiě)方法,被繼承
四、備注
在創(chuàng)造一個(gè)新的Vector,Arraylist好,HashSet也好,HashMap也好,完全可以寫(xiě)成:
Collection<String> a= new ArrayList<String>();
List<String> a= new Vector<String>();之類
因?yàn)槔^承于Collection接口的有ArrayList、Vector、Linkedlist、HashSet、TreeSet,繼承于MAP接口的有HashMap、Hashtable,這是Java中類的繼承、多態(tài)、封裝之類的問(wèn)題,當(dāng)然為了你的同伴看得更加清晰,這里就不要玩什么花哨命名了,寫(xiě)一個(gè)清楚的ArrayList<Integer> arraylist = new ArrayList<Integer>();沒(méi)人敢說(shuō)你不懂Java中的類。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java?swing實(shí)現(xiàn)應(yīng)用程序?qū)?shù)據(jù)庫(kù)的訪問(wèn)問(wèn)題
這篇文章主要介紹了Java?swing實(shí)現(xiàn)應(yīng)用程序?qū)?shù)據(jù)庫(kù)的訪問(wèn),本次實(shí)驗(yàn)需要做一個(gè)GUI界面和一個(gè)連接查詢功能,在論壇上借鑒了其他大佬獲取網(wǎng)站內(nèi)容的部分代碼,然后自己做了一個(gè)及其簡(jiǎn)陋的swing界面,算是把這個(gè)實(shí)驗(yàn)完成了,需要的朋友可以參考下2022-09-09關(guān)于@Autowired注解和靜態(tài)方法及new的關(guān)系
這篇文章主要介紹了關(guān)于@Autowired注解和靜態(tài)方法及new的關(guān)系,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02java ArrayBlockingQueue阻塞隊(duì)列的實(shí)現(xiàn)示例
ArrayBlockingQueue是一個(gè)基于數(shù)組實(shí)現(xiàn)的阻塞隊(duì)列,本文就來(lái)介紹一下java ArrayBlockingQueue阻塞隊(duì)列的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02如何將SpringBoot項(xiàng)目打成?war?包并部署到Tomcat
這篇文章主要介紹了如何將SpringBoot項(xiàng)目?打成?war?包?并?部署到?Tomcat,當(dāng)前環(huán)境是windows,tomcat版本是8.5采用的springboot版本是2.2.3,本文結(jié)合實(shí)例代碼給大家詳細(xì)講解需要的朋友可以參考下2022-11-11