HashSet:不會排序,在集合內,隨機找一空位填上,執行速度較快
TreeSet:會排序,在集合內,找最後空位填上,執行速度較慢
以上,若相同元素都會被覆蓋掉,Set接口Set不允許包含相同的元素,如果試圖把兩個相同元素加入同一個集合中,add方法返回false。
Set判斷兩個對象相同不是使用==運算符,而是根據equals方法。
EX:
Set<Integer> set = new HashSet<>(); //不會排序
for(int i = 0;i < 100 ;i++)
set.add(i);
for(Integer i : set)
System.out.print(" " +i);
System.out.println("");
Set<Integer> set2 = new TreeSet<>(); //會排序
for(int i = 0;i<100;i++)
set2.add(i);
for(Integer i : set2)
System.out.print(" " +i);
Out:
.....93 92 95 94 89 88 91 90 98 99 96 97
.....88 89 90 91 92 93 94 95 96 97 98 99
EX:
Set<Integer> set = new HashSet<>();
long start = System.currentTimeMillis();
for(int i = 0;i< 10_0000;i++)
set.add(i);
System.out.println((System.currentTimeMillis() - start ));
Set<Integer> set2 = new TreeSet<>();
long start2 = System.currentTimeMillis();
for(int i = 0;i< 10_0000;i++)
set2.add(i);
System.out.println(System.currentTimeMillis() - start2 );
Out:
22 //花費時間較少
38 //花費時間較多
PS: 使用大寫字母A,B,C,D,......X,Y,Z定義的,就是泛型,把T換成A也一樣,這裡T只是名字上的意義而已
● ? : 表示不確定的java類型
● T(type) : 表示具體的一個java類別
● K V (key value) : 分別表示java鍵值中的key value
● E(Element) : 表示元件
※建立可排序的物件Comparable<T>:
public class Employee implements Comparable<Employee>{
private int ID;
private String Name;
@Override //不Overide會compiler fail
public int compareTo(Sales o) {
//return this.getID() - o.getID(); //以ID排序,小到大
return this.getName().compareTo(o.getName()); //以Name排序
}
@Override //Overide Object裡面的方法
public String toString() {
return "ID:" + this.getID() + " Name:" + this.getName();
}
public Employee(){}
public Employee(int ID,String Name){
this.ID = ID;
this.Name = Name;
}
public int getID(){return ID;}
public String getName(){return Name;}
}
//----------------------------------------------------
import java.util.Set;
import java.util.TreeSet;
public class Main{
public static void main(String[] args){
Set<Employee> set = new TreeSet<>(); //若以HashSet並不會排序
set.add(new Employee(1,"xxx"));
set.add(new Employee(2,"xx"));
set.add(new Employee(3,"xxxx"));
set.add(new Employee(4,"x"));
System.out.println(set);
}
}
Out:
[ID:4 Name:x, ID:2 Name:xx, ID:1 Name:xxx, ID:3 Name:xxxx]
※ TreeSet: 若相同key不會被覆蓋,若相同內容值會被覆蓋
※HashSet: 若相同key不會被覆蓋,若相同內容值不會被覆蓋
Map map = new HashMap(); //相同內容不會被覆蓋,TreeMap也一樣
map.put(1,"Michael");
map.put(2,"Michael");
System.out.println(map);
Map map1 = new HashMap(); //相同key會被覆蓋最後一筆,TreeMap也一樣
map1.put(1,"Michae");
map1.put(1,"Michael");
System.out.println(map1);
Out:
{1=Michael, 2=Michael}
{1=Michael}
堆疊寫法:
Deque<String> stack = new ArrayDeque<>();
stack.push("one");
stack.push("two");
stack.push("three");
int size = stack.size() -1;
while (size >= 0){
System.out.println(stack.pop());
size --;
}
Out:
three
two
one