❶ java中集合是怎麼比較元素的
單例集合需要重寫equals()方法和hashCode方法,雙例集合可以實現介面重寫方法
❷ java,怎麼對比集合
應該沒有這個函數吧,不過這個可以自己實現。
List<String> al= new ArrayList<String>();
List<String> bl= new ArrayList<String>();
al.add("as");
然後用增強for循環用equal()方法進行比較
❸ java怎麼比較兩個list是否相同
首先這里需要確定一下集合相等的定義,我們應該是認為兩個集合的元素完全一致則相等。那麼判斷可以這樣做:
一判斷兩個list集合的元素個數是否相等。如果不相等則兩個list集合也不相等,判斷結束,如果相等則進入第二步判斷
二判斷list1的元素是否全部在list2中。遍歷list1,取出list1中的元素,依次去list2中比較是否list2也存在這個元素。如果有任何一個list1中的元素在list2中不存在,則兩個list集合不相等,如果全部存在則兩個list集合相等。
這里需要說明一點,因為第一步中已經判斷list1和list2的元素個數是相等的,所以第二步中如果list1的元素全部在list2中,則可以證明list1與list2相等。不需要再遍歷list2中的元素,去list1中判斷是否存在。
❹ JAVA中幾種集合(List、Set和Map)的區別
Java中的集合包括三大類,它們是Set、List和Map。它們都處於java.util包中,Set、List和Map都是介面。
Set中的對象不按特定方式排序,並且沒有重復對象。但它的有些實現類能對集合中的對象按特定方式排序,例如TreeSet類,它可以按照默認排序,也可以通過實現java.util.Comparator介面來自定義排序方式。
List中的對象按照索引位置排序,可以有重復對象,允許按照對象在集合中的索引位置檢索對象,如通過list.get(i)方式來獲得List集合中的元素。
Map中的每一個元素包含一個鍵對象和值對象,它們成對出現。鍵對象不能重復,值對象可以重復。
❺ JAVA裡面set,map,list的區別是什麼(盡量詳細)
一、List介面
List是一個繼承於Collection的介面,即List是集合中的一種。List是有序的隊列,List中的每一個元素都有一個索引;第一個元素的索引值是0,往後的元素的索引值依次+1。和Set不同,List中允許有重復的元素。實現List介面的集合主要有:ArrayList、LinkedList、Vector、Stack。
ArrayList
ArrayList是一個動態數組,也是我們最常用的集合。它允許任何符合規則的元素插入甚至包括null。每一個ArrayList都有一個初始容量:
private static final int DEFAULT_CAPACITY = 10;
隨著容器中的元素不斷增加,容器的大小也會隨著增加。在每次向容器中增加元素的同時都會進行容量檢查,當快溢出時,就會進行擴容操作。所以如果我們明確所插入元素的多少,最好指定一個初始容量值,避免過多的進行擴容操作而浪費時間、效率。
size、isEmpty、get、set、iterator 和 listIterator 操作都以固定時間運行。add 操作以分攤的固定時間運行,也就是說,添加 n 個元素需要 O(n) 時間(由於要考慮到擴容,所以這不只是添加元素會帶來分攤固定時間開銷那樣簡單)。
ArrayList擅長於隨機訪問。同時ArrayList是非同步的。
LinkedList
同樣實現List介面的LinkedList與ArrayList不同,ArrayList是一個動態數組,而LinkedList是一個雙向鏈表。所以它除了有ArrayList的基本操作方法外還額外提供了get,remove,insert方法在LinkedList的首部或尾部。
由於實現的方式不同,LinkedList不能隨機訪問,它所有的操作都是要按照雙重鏈表的需要執行。在列表中索引的操作將從開頭或結尾遍歷列表(從靠近指定索引的一端,節約一半時間)。這樣做的好處就是可以通過較低的代價在List中進行插入和刪除操作。
與ArrayList一樣,LinkedList也是非同步的。如果多個線程同時訪問一個List,則必須自己實現訪問同步。一種解決方法是在創建List時構造一個同步的List:
List list = Collections.synchronizedList(new LinkedList(…));
Vector
與ArrayList相似,但是Vector是同步的。所以說Vector是線程安全的動態數組。它的操作與ArrayList幾乎一樣。
Stack
Stack繼承自Vector,實現一個後進先出的堆棧。Stack提供5個額外的方法使得Vector得以被當作堆棧使用。基本的push和pop方法,還有peek方法得到棧頂的元素,empty方法測試堆棧是否為空,search方法檢測一個元素在堆棧中的位置。Stack剛創建後是空棧。
二、Set介面
Set是一個繼承於Collection的介面,Set是一種不包括重復元素的Collection。它維持它自己的內部排序,所以隨機訪問沒有任何意義。與List一樣,它同樣運行null的存在但是僅有一個。由於Set介面的特殊性,所有傳入Set集合中的元素都必須不同,關於API方面。Set的API和Collection完全一樣。實現了Set介面的集合有:HashSet、TreeSet、LinkedHashSet、EnumSet。
HashSet
HashSet堪稱查詢速度最快的集合,因為其內部是以HashCode來實現的。集合元素可以是null,但只能放入一個null。它內部元素的順序是由哈希碼來決定的,所以它不保證set的迭代順序;特別是它不保證該順序恆久不變。
TreeSet
TreeSet是二叉樹實現的,基於TreeMap,生成一個總是處於排序狀態的set,內部以TreeMap來實現,不允許放入null值。它是使用元素的自然順序對元素進行排序,或者根據創建Set時提供的 Comparator 進行排序,具體取決於使用的構造方法。
LinkedHashSet
LinkedHashSet集合同樣是根據元素的hashCode值來決定元素的存儲位置,但是它同時使用鏈表維護元素的次序。這樣使得元素看起 來像是以插入順序保存的,也就是說,當遍歷該集合時候,LinkedHashSet將會以元素的添加順序訪問集合的元素。LinkedHashSet在迭代訪問Set中的全部元素時,性能比HashSet好,但是插入時性能稍微遜色於HashSet。
三、Map介面
Map與List、Set介面不同,它是由一系列鍵值對組成的集合,提供了key到Value的映射。在Map中它保證了key與value之間的一一對應關系。也就是說一個key對應一個value,所以它不能存在相同的key值,當然value值可以相同。實現map的集合有:HashMap、HashTable、TreeMap、WeakHashMap。
HashMap
以哈希表數據結構實現,查找對象時通過哈希函數計算其位置,它是為快速查詢而設計的,其內部定義了一個hash表數組(Entry[] table),元素會通過哈希轉換函數將元素的哈希地址轉換成數組中存放的索引,如果有沖突,則使用散列鏈表的形式將所有相同哈希地址的元素串起來,可能通過查看HashMap.Entry的源碼它是一個單鏈表結構。
HashTable
也是以哈希表數據結構實現的,解決沖突時與HashMap也一樣也是採用了散列鏈表的形式。HashTable繼承Dictionary類,實現Map介面。其中Dictionary類是任何可將鍵映射到相應值的類(如 Hashtable)的抽象父類。每個鍵和每個值都是一個對象。在任何一個 Dictionary 對象中,每個鍵至多與一個值相關聯。Map是」key-value鍵值對」介面。 HashTable採用」拉鏈法」實現哈希表不過性能比HashMap要低。
TreeMap
有序散列表,實現SortedMap介面,底層通過紅黑樹實現。
WeakHashMap
談WeakHashMap前先看一下Java中的引用(強度依次遞減)
強引用:普遍對象聲明的引用,存在便不會GC
軟引用:有用但並非必須,發生內存溢出前,二次回收
弱引用:只能生存到下次GC之前,無論是否內存足夠
虛引用:唯一目的是在這個對象被GC時能收到一個系統通知
以弱鍵實現的基於哈希表的Map。在 WeakHashMap 中,當某個鍵不再正常使用時,將自動移除其條目。更精確地說,對於一個給定的鍵,其映射的存在並不阻止垃圾回收器對該鍵的丟棄,這就使該鍵成為可終止的,被終止,然後被回收。丟棄某個鍵時,其條目從映射中有效地移除,因此,該類的行為與其他的 Map 實現有所不同。null值和null鍵都被支持。該類具有與HashMap類相似的性能特徵,並具有相同的效能參數初始容量和載入因子。像大多數集合類一樣,該類是不同步的。
四、總結
1、List、Set都是繼承自Collection介面,Map則不是。
2、List特點:元素有放入順序,元素可重復 ,Set特點:元素無放入順序,元素不可重復,重復元素會覆蓋掉,(注意:元素雖然無放入順序,但是元素在set中的位置是有該元素的HashCode決定的,其位置其實是固定的,加入Set 的Object必須定義equals()方法 ,另外list支持for循環,也就是通過下標來遍歷,也可以用迭代器,但是set只能用迭代,因為他無序,無法用下標來取得想要的值。)
3、Set和List對比:
Set:檢索元素效率低下,刪除和插入效率高,插入和刪除不會引起元素位置改變。
List:和數組類似,List可以動態增長,查找元素效率高,插入刪除元素效率低,因為會引起其他元素位置改變。
4、Map適合儲存鍵值對的數據
5、線程安全集合類與非線程安全集合類 :
LinkedList、ArrayList、HashSet是非線程安全的,Vector是線程安全的;
HashMap是非線程安全的,HashTable是線程安全的;
StringBuilder是非線程安全的,StringBuffer是線程安全的。
❻ JAVA同集合中怎樣比較相鄰兩個元素 例如:集合a有1,5,7,9 2,4,5,9 ,2,3,5
關於這個問題很簡單,只需要一個循環遍歷就行,假如有n個元素,就會有n-1個結果啊,將相鄰的兩個數挨個比較,就是將一個數組(集合)挨個循環遍歷一遍就好了,然後把這結果用-1,0,1表示,用數組裝起來,就ok了。
代碼如下:
❼ JAVA裡面set,map,list的區別是什麼(盡量詳細)
java集合的主要分為三種類型:
Set(集)
List(列表)
Map(映射)
要深入理解集合首先要了解下我們熟悉的數組:
數組是大小固定的,並且同一個數組只能存放類型一樣的數據(基本類型/引用類型),而JAVA集合可以存儲和操作數目不固定的一組數據。 所有的JAVA集合都位於 java.util包中! JAVA集合只能存放引用類型的的數據,不能存放基本數據類型。
簡單說下集合和數組的區別:(參考文章:《Thinking In Algorithm》03.數據結構之數組)
Java所有「存儲及隨機訪問一連串對象」的做法,array是最有效率的一種。
1、
效率高,但容量固定且無法動態改變。
array還有一個缺點是,無法判斷其中實際存有多少元素,length只是告訴我們array的容量。
2、Java中有一個Arrays類,專門用來操作array。
arrays中擁有一組static函數,
equals():比較兩個array是否相等。array擁有相同元素個數,且所有對應元素兩兩相等。
fill():將值填入array中。
sort():用來對array進行排序。
binarySearch():在排好序的array中尋找元素。
System.array():array的復制。
若撰寫程序時不知道究竟需要多少對象,需要在空間不足時自動擴增容量,則需要使用容器類庫,array不適用。所以就要用到集合。
那我們開始討論java中的集合。
集合分類:
Collection:List、Set
Map:HashMap、HashTable
❽ JAVA同集合怎樣比較
# 根據描述數組元素從來沒有拆分過,所以代碼中直接當成字元串處理了
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
public class Test {
public static void main(String[] args) {
List list = Arrays.asList("1,5,7,9","2,4,5,9","2,3,5,7","2,3,5,7","2,6,7,9","4,6,8,9","2,3,5,7","2,6,7,9","2,6,7,9");
list.sort(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
return o1.toString().compareTo(o2.toString());
}
});
System.out.println(list);
final int[] m = {0};
list.stream().rece((a,b)->{
if(a.equals(b)){
m[0]++;
}else{
System.out.print("間隔"+m[0]+":"+a+"\t");
m[0]=0;
}
return b;
});
System.out.println("間隔"+m[0]+":"+list.get(list.size()-1));
}
}
❾ java 怎麼比較兩個list是否相同
首先這里需要確定一下集合相等的定義,我們應該是認為兩個集合的元素完全一致則相等。那麼判斷可以這樣做:
第一步:判斷兩個list集合的元素個數是否相等。如果不相等則兩個list集合也不相等,判斷結束,如果相等則進入第二步判斷
第二步:判斷list1的元素是否全部在list2中。遍歷list1,取出list1中的元素,依次去list2中比較是否list2也存在這個元素。如果有任何一個list1中的元素在list2中不存在,則兩個list集合不相等,如果全部存在則兩個list集合相等。
這里需要說明一點,因為第一步中已經判斷list1和list2的元素個數是相等的,所以第二步中如果list1的元素全部在list2中,則可以證明list1與list2相等。不需要再遍歷list2中的元素,去list1中判斷是否存在。
以下是上訴過程的Java代碼例子:
public boolean equalList(List list1, List list2) {
if (list1.size() != list2.size())
return false;
for (Object object : list1) {
if (!list2.contains(object))
return false;
}
return true;
}
以上過程適用於所有編程語言。另外不同編程語言還提供了一些其他方法,所以對於不同編程語言還可以有其他寫法。
比如Java中為list集合提供了containsAll方法。所以對於Java語言還可以這么寫:
public boolean equalList(List list1, List list2) {
if (list1.size() != list2.size())
return false;
if (list2.containsAll(list1))
return true;
return false;
}
還可以簡寫成這樣
public boolean equalList(List list1, List list2) {
return (list1.size() == list2.size()) && list1.containsAll(list2);
}
❿ java 如何遍歷集合內所有元素,然後兩兩做比較呢
for(inti=0;i<list.size();i++){
Listl=list.get(i);
for(Objecto:l){
if(oinstanceofUser){Useruser=(User)o;System.out.println(user);}if(oinstanceofDepartment){Departmentdep=(Department)o;System.out.println(dep);}
}
}