java 中Collection存儲器詳解及簡單實例
本篇僅為了鞏固一下基礎,回憶一下存儲的這兩個常用的東東…
一、Collection
1.存儲對象可以考慮:①數(shù)組②結合
2.數(shù)組存儲對象的特點:Student[] stu = new Student[20]; stu[0] = new Stutdent();……
弊端:①一旦創(chuàng)建,其長度不可變
②真實的數(shù)組存放的對象的個數(shù)是不可知的
3.集合
Collection接口
丨------List接口:存儲有序,可以重復的元素
丨-------ArrayList(主要的實現(xiàn)類,首選)
丨-------LinkedList(頻繁的插入,刪除)
丨-------Vector(古老的實現(xiàn)類,線程安全)
丨------Set接口:存儲無序,不可重復的元素,Set中常用的方法都是Collection下定義的
丨-------HashSet(主要實現(xiàn)類)
丨-------LinkedHashSet
丨-------TreeSet
例: (這里主要是說Set接口)
1)HashSet
Set存儲的元素是無序的,是不可重復的!
1.無序性:無序性 != 隨機性。真正的無序性,指的是元素在底層存儲的位置是無序的。(根據(jù)hash值來存)
2.不可重復性:當向Set中添加進相同的元素的時候,后面的這個不能添加進去。
//說明:要求添加進Set中的元素所在的類,一定要重寫equals()和hashcode()方法。進而保證set中元素的不可重復性!
set中的元素時如何存儲的呢?使用了哈希算法。
當向set中添加元素時,首先調用此對象所在類的hashCode()方法,計算此對象的hash值,此哈希值決定了此對象在set中的存儲位置,若此位置之前沒有對象存儲,則此對象直接存到這個位置。(就好比一個教室,按號入座一樣),若已有對象存儲,在通過equals()方法比較這兩個對象的是否相同,如果相同后一個對象不能再添加進來。
萬一返回false呢?都存儲。(不建議如此)
//>要求:hashcode()方法要與equals()方法一致。
事例代碼如下:
public class TestSet{ @Test public void testHashSet(){ Set set = new HashSet(); set.add(123); set.add(456); set.add(new String("AA")); set.add(new String("AA"));//若此時在這里加上相同元素,則加不進去。 set.add("BB"); set.add(null); System.out.println(set.size()); System.out.println(set); } }
2)LinkedHashSet()
/* *LinkedHashSet:使用鏈表維護了一個添加進集合中的順序,導致當我們遍歷LinkedHashSet集合元素是按照 *添加進去的順序遍歷的!但是存儲是無序的! *LinkedHashSet得插入性能略低于HashSet,但在迭代訪問Set里的全部元素時有很好的性能。 *LinkedHashSet不允許集合元素重復。 */ public class TestLinkedHashSet{ @Test public void testLinkedHashSet(){ Set set = new LinkedHashSet(); set.add(123); set.add(456); set.add(new String("AA")); set.add(new String("AA")); set.add("BB"); set.add(null); System.out.println(set.size()); System.out.println(set); //迭代器去遍歷 Iterator iterator = set.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next()); } } } 輸出為:123,456,AA,BB,null
3)TreeSet
/* *1.向TreeSet中添加的元素必須是同一個類的 *2.可以按照添加進集合中的元素的指定的順序遍歷,像String,包裝類等默認按照從小到大的順序遍歷 *3.當向TressSet中添加自定義類的對象時,有兩種排序方法:①自然排序②定制排序 *4.自然排序:要求自定義類實現(xiàn)java.lang.Comparable接口并重寫其compareTo(Object obj) 在此方法中,指明按照自定義類額哪個屬性進行排序。 *5.向TreeSet中添加元素時,首先按照compareTo()進行比較,一旦返回0,雖然僅是兩個對象的子屬性值相同, 但是程序會認為這兩個對象是相同的,進而后一個對象就不能添加進來。 *>compartTo()與hashCode();以及equals()三者保持一致! */ False: public class TestTreeSet{ //這樣添加會報出一個CastException,會出現(xiàn)異常 @Test public void testTreeSet(){ Set set = new TreeSet(); set.add(123); set.add(456); set.add(new String("AA")); set.add(new String("AA")); set.add("BB"); } } True: public class TestTreeSet{ @Test public void testTreeSet(){ Set set = new TreeSet(); // set.add(new String("AA")); // set.add(new String("AA"));//相同的元素沒有進去 // set.add("JJ"); // set.add("GG"); // set.add("MM"); //String沒有報錯是以為String類型實現(xiàn)了Comparable接口,已經重寫好了排序的方法 //當Person類沒有實現(xiàn)Comparable接口時,當向TreeSet中添加Person對象時,報 //ClassCastException set.add(new Person("CC",23)); set.add(new Person("MM",21)); set.add(new Person("GG",25)); set.add(new Person("JJ",24)); set.add(new Person("KK",20));//新加一個KK,但是age相同 set.add(new Person("DD",20)); for(Object str : set){ System.out.println(str); } } } 輸出為AA,GG,JJ,MM
//當向TreeSet中添加Person類的對象時,依據(jù)此方法,確定按照哪個屬性排列。 //需要重寫compareTo方法 //Person(name,age,get/set方法,空構造器,toString,equals,hashCode) @Override public int compareTo(Object o){ if(o instanceof Person){ Person p = (Person)o; // return this.name.compareTo(p.name); 從小往大排 // return -this.name.compareTo(p.name); 從大往小排 int i = this.age.compareTo(p.age); if(i == 0){ return this.name.compareTo(p.name); }else{ return i ; } } return 0; } //定制排序 //Customer(name,id,get/set方法,空構造器,toString,equals,hashCode) public class TestTreeSet{ @Test public void testTreeSet2(){ //1.創(chuàng)建一個實現(xiàn)了Comparator接口的類對象 Comparator com = new Comparator(){ // @Override public int compare(Object o1,Object o2){ if(o1 instanceof Customer && o2 instanceof Customer){ Customer c1 = (Customer)o1; Customer c2 = (Customer)o2; int i = c1.getId().compareTo(c2.getId()); if(i == 0){ return c1.getName().compareTo(c2.getName()); } return i; } return 0; } }; //2.將此對象作為形參傳遞給TreeSet的構造器中 TreeSet set = new TreeSet(com); //3.向TreeSet中添加Comparator接口中的compare方法中涉及的類的對象 set.add(new Customer("AA",1003)); set.add(new Customer("BB",1002)); set.add(new Customer("GG",1004)); set.add(new Customer("CC",1001)); set.add(new Customer("DD",1001)); for(Object str : set){ System.out.println(str); } } }
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關文章
Springboot 實現(xiàn)跨域訪問無需使用jsonp的實現(xiàn)代碼
這篇文章主要介紹了Springboot 實現(xiàn)跨域訪問 無需使用jsonp的實現(xiàn)代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-09-09springboot使用log4j2異步日志提升性能的實現(xiàn)方式
這篇文章主要介紹了springboot使用log4j2異步日志提升性能,異步日志實現(xiàn)方式:將日志存入一個單獨的隊列中,有一個單獨的線程從隊列中獲取日志并寫入磁盤文件,需要的朋友可以參考下2022-05-05CentOS?7.9服務器Java部署環(huán)境配置的過程詳解
這篇文章主要介紹了CentOS?7.9服務器Java部署環(huán)境配置,主要包括ftp服務器搭建過程、jdk安裝方法以及mysql安裝過程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07spring boot activiti工作流的搭建與簡單使用
這篇文章主要給大家介紹了關于spring boot activiti工作流的搭建與簡單使用的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-08-08基于JPA實體類監(jiān)聽器@EntityListeners注解的使用實例
這篇文章主要介紹了JPA實體類監(jiān)聽器@EntityListeners注解的使用實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08