Java集合Set(三)
***************************Set*********************************************
類似數學中的集合
叠代順序相關 排序相關的
Set(接口)
HashSet(實現類) 1.去重 2.沒有叠代順序 SortedSet(接口)
LinkedHashSet(實現類) 有叠代順序的HashSet NavigableSet(接口)
TreeSet(實現類)
集合的兩個設計原則
1. Ordered 叠代順序(輸出順序、遍歷順序)
2. Sorted 排序順序
*************************************HashSet***************************************
唯一性、無序性、確定性
唯一性: 不能重復
特點:
1. 去重
2. 沒有叠代順序
不是說順序是隨機的,每次運行順序都是固定的..沒有叠代順序的意思是它的輸出順序和添加順序不一致的
順序: 是和對象的hashCode相關的一個算法,求出這個int類型的數值 作為數組的一個下標 存到數組中的
實質都是數組
****************************LinkedHashSet*************************
有叠代順序的HashSet
它的輸出順序和添加順序是一致的
先打進來的客戶 先給它打出去 要使用LinkedHashSet
**************************HashSet是如何去重的?(面試題)*****************************
使用hashCode()和equals()去重
如果兩個對象 hashCode() 相等 、equals()比較結果是true 兩個對象意義上是同一個對象 第二個會被去掉
hashCode()和equals()只要有一個不相等 就不是同一個對象 第二個會被添加進去
****************************請說出往HashSet中添加元素時的具體執行過程******************
set.add(dvd1);//添加第一個元素 首先調用第一個對象的hashCode()算法 得到一個hashCode
並且把這個hashCode 的值 放到一個數組中
int[] hashCodeArr = {10,10,10}
如果有重復的hashCode繼續比較equals,拿著當前添加的對象和集合中的所有元素挨個比較equals.
如果沒有重復的hashCode,就不會調用equals.
set.add(dvd1);
set.add(dvd2);
set.add(dvd3);
set.add(dvd4);
控制臺顯示效果如下:
hashCode
hashCode
equals
hashCode
equals
equals
hashCode
equals
equals
equals
*********************************TreeSet**************************************
排序相關的Set,直接把想要排序的元素添加到TreeSet中 就自動幫你排序好了 底層用的是 紅黑樹
*********************************自然排序**************************************
package com.chapter12.set;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Set;
import java.util.TreeSet;
/**
* 公司:藍橋軟件學院 作者:zhangzy 時間:2017年7月18日 上午10:46:03 功能:演示自然排序
*/
public class 演示自然排序 {
public static void main(String[] args) {
// 1.對數字排序
/*
* Set<Integer> set = new TreeSet<Integer>();
*
* set.add(3);
*
* set.add(1);
*
* set.add(5);
*
* for(int i:set){ System.out.println(i); }
*/
// 2.對字符串排序
// 排序字符串 按照ascii碼排序
//先取第一個字符 先按第一個字符的ascii碼排序
//如果第一個字符相同 依次取第2個
/*Set<String> set = new TreeSet<String>();
set.add("bba");
set.add("baa");
set.add("aaa");
for (String s : set) {
System.out.println(s);
}*/
//3. 對日期和時間進行排序 時間早的 小 在左邊
String s1 = new String("2017-07-19 00:00:00");
String s2 = new String("2017-07-18 00:00:00");
String s3 = new String("2017-07-21 00:00:00");
String s4 = new String("2017-07-20 00:00:00");
Set<Date> set = new TreeSet<Date>();
//字符串--------->Date對象
//yyyy year 年
//MM month 月
//dd day 日期
//hh hour
//mm minute
//ss second
/*SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
try {
Date date1 = sdf.parse(s1);
Date date2 = sdf.parse(s2);
Date date3 = sdf.parse(s3);
Date date4 = sdf.parse(s4);
set.add(date1);
set.add(date2);
set.add(date3);
set.add(date4);
for(Date date:set){
System.out.println(date);
}
} catch (ParseException e) {
e.printStackTrace();
}*/
//Date------------>String對象
//需求: 創建當前時間
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String currentTime = sdf.format(date);
System.out.println(currentTime);
}
}
*****************************使用TreeSet實現DVD排序****************************
先按DVD的名稱排序、名稱相同的按價格排序
演示代碼:
package com.chapter12;
public class DVD implements Comparable{
private int no;
private String name;
private int price;
@Override
public int compareTo(Object obj){
//1.先按DVD的名稱排序
DVD otherDVD = (DVD)obj;
int nameResult = this.name.compareTo(otherDVD.getName());
if(nameResult==0){//名稱相同
//2.按照價格排序
int priceResult = new Integer(this.price).compareTo(otherDVD.getPrice());
return priceResult;
}else{
return -nameResult;
}
}
public static void main(String[] args) {
DVD dvd1 = new DVD(1,"神偷奶爸3",50);
DVD dvd2 = new DVD(2,"神偷奶爸3",50);
System.out.println(dvd1==dvd2);//false
System.out.println(dvd1.equals(dvd2));//true
System.out.println(dvd1.hashCode());
System.out.println(dvd2.hashCode());
}
}
測試代碼:
package com.chapter12.set;
import java.util.Set;
import java.util.TreeSet;
import com.chapter12.DVD;
/**
* 公司:藍橋軟件學院
* 作者:zhangzy
* 時間:2017年7月18日 下午2:09:08
* 功能: 往TreeSet中添加的對象 有要求 對象所屬的類 一定要實現Comparable接口才能夠添加到TreeSet中進行排序
* DVD類如果沒有實現Comparable接口 編譯是可以通過的 運行時報錯 com.chapter12.DVD cannot be cast to java.lang.Comparable
*/
public class 演示DVD排序 {
public static void main(String[] args) {
DVD dvd1 = new DVD(1,"bbb",50);
DVD dvd2 = new DVD(2,"aaa",50);
DVD dvd3 = new DVD(3,"aaa",40);
DVD dvd4 = new DVD(4,"aaa",60);
DVD dvd5 = new DVD(5,"ccc",60);
Set<DVD> set = new TreeSet<DVD>();
set.add(dvd1);
set.add(dvd2);
set.add(dvd3);
set.add(dvd4);
set.add(dvd5);
for(DVD dvd:set){
System.out.println(dvd);
}
}
}
*****************************TreeSet是使用compareTo()方法去重****************************
1.兩個對象compareTo()比較結果如果是0,認為兩個對象意義上是同一個對象,第二個會被去掉
2.兩個的對象equals()比較結果是true,兩個對象compareTo()比較結果一定要是0
因為兩個對象equals()比較結果是true,說明它倆意義上是同一個對象,這樣第二個應該被去掉,為了保證第二個對象
被去掉,所以它們的compareTo()比較結果一定要是0
3.重寫 equals()使用的條件,compareTo()也要用
這樣compareTo()的比較條件 被equals()卡死了,equals()用什麽條件,compareTo()也要用什麽條件
******************************第二個比較接口-------Comparator*****************************
需求: 想按DVD的編號排序
第一步: 先寫一個排序規則類 實現Comparator接口
//第一步: 定義一個排序規則類
public class SortedDVDByNo implements Comparator<DVD>{
@Override
public int compare(DVD dvd1, DVD dvd2) {
Integer thisNO = dvd1.getNo();
Integer anotherNo = dvd2.getNo();
int noResult = thisNO.compareTo(anotherNo);
return noResult;
}
}
第二步:
package com.chapter12.set;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import com.chapter12.DVD;
/**
* 公司:藍橋軟件學院
* 作者:zhangzy
* 時間:2017年7月18日 下午2:54:20
* 功能:使用排序工具類進行排序
*/
public class TestCollections {
public static void main(String[] args) {
List<DVD> list = new ArrayList<DVD>();
DVD dvd1 = new DVD(3,"bbb",50);
DVD dvd2 = new DVD(1,"aaa",50);
DVD dvd3 = new DVD(2,"aaa",40);
list.add(dvd1);
list.add(dvd2);
list.add(dvd3);
//Collections.sort(list, new SortedDVDByNo());
Collections.sort(list);
for(DVD dvd:list){
System.out.println(dvd);
}
}
}
*****************************************兩個排序工具類************************************
Object
--Collections(排序集合的 只能用來排序List)
--Arrays(排序數組的)
演示代碼:
package com.chapter12.set;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import com.chapter12.DVD;
/**
* 公司:藍橋軟件學院
* 作者:zhangzy
* 時間:2017年7月18日 下午2:54:20
* 功能:使用排序工具類進行排序
*/
public class TestArrays {
public static void main(String[] args) {
DVD[] dvdArr = new DVD[3];
DVD dvd1 = new DVD(3,"bbb",50);
DVD dvd2 = new DVD(1,"aaa",50);
DVD dvd3 = new DVD(2,"aaa",40);
dvdArr[0] = dvd1;
dvdArr[1] = dvd2;
dvdArr[2] = dvd3;
Arrays.sort(dvdArr,new SortedDVDByNo());
for(DVD dvd:dvdArr){
System.out.println(dvd);
}
}
}
Java集合Set(三)