集合:Collection 單例集合的根接口
List
如果是實(shí)現(xiàn)了List接口的集合類,具備的特點(diǎn):有序,可重復(fù)
ArrayList 底層是使用了Object數(shù)組實(shí)現(xiàn)的 特點(diǎn):查詢速度快 增刪慢
LinkedList 底層使用了鏈表數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的 特點(diǎn):查詢速度慢 增刪快
Vector 底層使用了Object數(shù)組實(shí)現(xiàn)的 實(shí)現(xiàn)原理與ArrayList 是一致的 但是線程是安全的 操作效率低
Set
如果是實(shí)現(xiàn)了Set接口的實(shí)現(xiàn)類 具備的特點(diǎn):無(wú)序,不可重復(fù)
HashSet 底層是使用了哈希表實(shí)現(xiàn)的 特點(diǎn)存取速度快
HashSet注意事項(xiàng): 往HashSet中添加元素時(shí),首先會(huì)調(diào)用hashcode方法得到元素的哈希碼值,然后把哈希碼經(jīng)過(guò)運(yùn)算得到該元素在hash表中的位置
情況1:如果算出的位置目前還沒(méi)有存在任何的元素,那么該元素會(huì)直接添加到哈希表中
情況2:如果算法的位置已經(jīng)存在其他的元素,那么還會(huì)調(diào)用元素的equals方法與這個(gè)位置上的元素再比較一次;
如果equals方法返回的值為T(mén)rue,那么該元素被視為重復(fù)元素,不允許添加,
如果返回false,那么該元素也會(huì)被添加(存疑:是否重新計(jì)算hashcode值)
代碼實(shí)現(xiàn)
import java.util.HashSet;
import java.util.Set;
public class Connection1 {
public static void main(String[] args) {
Set set = new HashSet();
A a1 = new A();
B b1 = new B();
set.add(a1); // 1
set.add(b1); // 2 // 由于1和2的hashcode相同,而且equals直接相等,因此認(rèn)為兩個(gè)對(duì)象相同,2就不被允許存儲(chǔ)
System.out.println(a1.hashCode());
System.out.println(b1.hashCode());
System.out.println(set);
B b2 = new B();
B b3 = new B();
set.add(new B());
System.out.println(set);
}
}
class A{
@Override
public int hashCode() {
return 1;
}
}
class B{
public static int count = 0;
int a = 0;
public B(){
count++;
a = count;
}
@Override
public int hashCode() {
return a;
}
@Override
public boolean equals(Object obj) {
return true;
}
}
輸出結(jié)果:
1
1
[com.ysy.A@1]
[com.ysy.A@1, com.ysy.B@4]
package com.ysy;
import java.util.HashSet;
import java.util.Set;
public class Connection2 {
public static void main(String[] args) {
Set set = new HashSet();
B1 b1 = new B1();
B1 b2 = new B1();
set.add(b1);
set.add(b2);
System.out.println(set);
System.out.println(b1); // com.ysy.B1@1
System.out.println(b2); // com.ysy.B1@1
System.out.println(b1 == b2); // false
System.out.println(b1.hashCode()); // 1
System.out.println(b2.hashCode()); // 1
}
}
class B1{
int a = 0;
public B1(){
a = 1;
}
@Override
public int hashCode() {
return a;
}
}
輸出結(jié)果:
[com.ysy.B1@1, com.ysy.B1@1]
com.ysy.B1@1
com.ysy.B1@1
false
1
1
遺留問(wèn)題:內(nèi)存地址相同,hashcode值相等,但不屬于同一個(gè)對(duì)象(可能原因:com.ysy.B1@1不是地址,或則equals比較的不是地址)
TreeSet 底層是使用了紅黑樹(shù)(二叉樹(shù))數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的。特點(diǎn):對(duì)集合中的元素進(jìn)行排序
TreeSet注意事項(xiàng):
1. 往TreeSet中添加元素的時(shí)候 如果元素巨鱉自然順序的特點(diǎn),那么TreeSet會(huì)根據(jù)元素的自然順序特性排序
2. 往TreeSet中添加元素的時(shí)候 如果元素巨鱉自然順序的特點(diǎn),那么元素所屬的類就必須要實(shí)現(xiàn)Compareble接口,將比較方法定義在CompareTo方法中
3. 往TreeSet中添加元素的時(shí)候 如果元素巨鱉自然順序的特點(diǎn),且元素所屬的類沒(méi)有實(shí)現(xiàn)Compareble接口,那么創(chuàng)建TreeSet對(duì)象時(shí),必須要傳入比較器對(duì)象
比較器的定義格式: class 類名 implements Comparator{}
Map 雙列集合的根接口
Map 存儲(chǔ)的數(shù)據(jù)都是以鍵值對(duì)的形式存在的,鍵不可重復(fù),值可重復(fù)
HashMap 底層也是使用了哈希表實(shí)現(xiàn)的
TreeMap 底層是使用了紅黑樹(shù)(二叉樹(shù))數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的