在JAVA中,提供多種不同的結構來組織對象,Set(集合)是其中的一種,本身是一個接口,其迭代時的順序取決於其具體實現。
典型的實現包括:
HashSet:哈希表是通過使用稱為散列法的機制來存儲信息的,元素並沒有以某種特定順序來存放;
LinkedHashSet:以元素插入的順序來維護集合的鏈接表,允許以插入的順序在集合中迭代;
TreeSet:提供一個使用樹結構存儲Set接口的實現,對象以升序順序存儲,訪問和遍歷的時間很快。
set有多種,hashset,treeset和linkedhashset比較常見,hashset最常用。linkedhashset是有序的,hashset是無序的。linkedhashset是以鏈表形式存放數據的,hashset是用hash散列存放數據的。list也分好幾種,主要有arraylist和linkedlist,都是有序的,其中arraylist類比數組,linkedlist類比鏈表。arraylist是線程不同步的,也就是說多個線程同時操作一個list那么List中存放數據的一致性就不能保證。vector是線程同步的,也就是說線程安全的。搜索
本回答被提問者采納
set集合 是不保證集合中元素的順序的
list 集合 才會有順序 List的特征是其元素以線性方式存儲
set它不允許出現重復元素 且允許包含值為null的元素,但最多只能有一個null元素
Set 和List 都繼承了Conllection
//對 set 的遍歷 //1.迭代遍歷: Set<String> set = new HashSet<String>(); Iterator<String> it = set.iterator(); while (it.hasNext()) { String str = it.next(); System.out.println(str); } //2.for循環遍歷: for (String str : set) { System.out.println(str); } //優點還體現在泛型 假如 set中存放的是Object Set<Object> set = new HashSet<Object>(); //for循環遍歷: for (Object obj: set) { if(obj instanceof Integer){ int aa= (Integer)obj; }else if(obj instanceof String){ String aa = (String)obj } ........ }
java中Set集合是一個不包含重復元素的Collection,首先我們先看看遍歷方法
注意:這里Set集合中放入的是String類型,假如我們放入一個自己定義的類實例的時候,比如Person類實例,這時候我們要自己重新hashcode和equal方法,用自己的關鍵字段來重寫,因為當使用HashSet時,hashCode()方法就會得到調用,判斷已經存儲在集合中的對象的hash code值是否與增加的對象的hash code值一致;如果不一致,直接加進去;如果一致,再進行equals方法的比較,equals方法如果返回true,表示對象已經加進去了,就不會再增加新的對象,否則加進去。
下面分析一下Set集合的另外一個重要實現類TreeSet,
TreeSet使用元素的自然順序對元素進行排序,或者根據創建 set 時提供的 Comparator
進行排序,具體取決於使用的構造方法。
通俗一點講,就是可以按照排序后的列表顯示,也可以按照指定的規則排序
輸出:[a, b, c, d, e, f]
按照排序后輸出
那么如果我們想讓他倒序輸出呢?當然方法很多。這里我采用指定一個規則讓他倒序輸出
輸出:e d c b a A
如果Set集合中放入的是我們自己定義的一個類類型呢?
注意:一定要定義一個排序規則類實現Comparator接口,與上面的方法類似
package com.sort; import java.util.Comparator; import java.util.Iterator; import java.util.Set; import java.util.TreeSet; public class TreeSetTest2 { public static void main(String[] args) { Set<Person> set = new TreeSet<Person>(new PersonComparator()); Person p1 = new Person(10); Person p2 = new Person(20); Person p3 = new Person(30); Person p4 = new Person(40); set.add(p1); set.add(p2); set.add(p3); set.add(p4); for(Iterator<Person> iterator = set.iterator();iterator.hasNext();){ System.out.print(iterator.next().score+" "); } } } class Person{ int score; public Person(int score){ this.score = score; } public String toString(){ return String.valueOf(this.score); } } class PersonComparator implements Comparator<Person>{ @Override public int compare(Person o1, Person o2) { return o1.score - o2.score; } }
輸出:10 20 30 40
如果按照一個人的分數的倒序排列,只需要更改compare方法中的o2.score-o1.score
