JCF:java集合框架
-
Collection:單值類型集合
1.List
類型 底層實現 ArrayList(數組元素個數) 數組 LinkedList() 鏈表 Vector(數組元素個數,步長) 數組 Stack() 數組模擬棧 2.Set
類型 底層實現 HashSet(分組組數,加載因子) 哈希表 TreeSet(比較器對象) 紅黑樹 @HashSet
特點:無序 唯一
數據結構:哈希表 -》 哈希嗎值 -》 hashCode()創建對象: HashSet<泛型> set = new HashSet<>(); 添加元素: set.add(元素); Collections.addAll(set,元素,元素,元素....); set1.addAll(set2); 判斷集合裏面是否包含: set.contains(元素) 得到集合大小: set.size() 刪除元素: set.remove(元素); foreach + 迭代器 HashSet驗證唯一: HashSet的唯一:hashCode() + equals() hashCode():得到對象的哈希碼值 -》 決定去到哪一個小組 equals():挨個每個屬性比較 看看到底是不是同一個對象 java中視爲相等的兩個對象哈希碼值一定要一樣 x.equals(y) == true x.hashCpde() == y.hashCode()
import java.util.*; public class Exec1{ public static void main(String[] args){ ArrayList<String> list = new ArrayList<>(); Collections.addAll(list,"張三","李四","李四","張三","王五"); //將集合裏面的重複元素去除 //張三 李四 王五 ArrayList<String> temp = new ArrayList<>(); for(String name : list){ if(!temp.contains(name)){ temp.add(name); } } System.out.println(temp); } }
import java.util.*; public class Exec1{ public static void main(String[] args){ HashSet<User> mry = new HashSet<>(); User u1 = new User("張麗","普通用戶",1200); User u2 = new User("汪美麗","普通用戶",2900); User u3 = new User("趙小雪","普通用戶",300); User u4 = new User("張欣","普通用戶",590); User u5 = new User("羅浩","普通用戶",1900); User u6 = new User("羅浩","普通用戶",1900); //將所有用戶放進美容院集合裏面 Collections.addAll(mry,u1,u2,u3,u4,u5,u6); /* u6 添加失敗 覆蓋 hashCode() 和 equals() 方法 */ //System.out.println(mry.size()); //將所有積分>1200分的用戶等級修改成超級vip //修改等級 -》 參與生成哈希碼值 -》 刪除 + 修改 + 添加 //ArrayList LinkedList HashSet LinkedList<User> list = new LinkedList<>(); for(Iterator<User> car = mry.iterator();car.hasNext();){ User uu = car.next(); if(uu.jiFen > 1200){ car.remove(); uu.dengJi = "超級VIP"; list.add(uu); } } //mry -> 普通用戶 //list -》 超級vip mry.addAll(list); System.out.println(mry); //打印set集合對象的時候 顯示: //[對象1:等級,對象2:等級....] //分別統計普通用戶 和超級vip佔用的比例 int x = 0; int y = 0; for(User uu : mry){ if(uu.dengJi.equals("普通用戶")){ x++; }else{ y++; } } System.out.println("普通用戶比例:" + x * 100 / mry.size() + "%"); System.out.println("超級VIP比例:" + y * 100 / mry.size() + "%"); } } class User{ String name; String dengJi;//等級 -》 普通用戶 超級vip int jiFen;//積分 public User(String name,String dengJi,int jiFen){ this.name = name; this.dengJi = dengJi; this.jiFen = jiFen; } //只要兩個對象所有屬性都視爲相等對象 @Override public int hashCode(){ return name.hashCode() + dengJi.hashCode() + jiFen; } @Override public boolean equals(Object obj){ //if if if return this.name.equals(((User)obj).name) && this.dengJi.equals(((User)obj).dengJi) && this.jiFen == ((User)obj).jiFen; } @Override public String toString(){ return name + ":" + dengJi; } }
@TreeSet
一次添加一個元素: set.add(obj)
一次添加多個元素: Collections.addAll(set,o1,o2,o3);
元素個數: set.size();
刪除元素: set.remove(obj);
清空整個集合: set.clear();
遍歷:
1.foreach
2.Iterator 迭代器
3.forEach() TreeSet特有的方法:
first() last() 得到第一個/最後一個元素 pollFirst() pollLast() 得到並刪除第一個/最後一個元素
如何利用比較器 脫離開一個類不做修改的情況下 指定這個類的排序規則
Comparator
public int compare(T t1,T t2){
…;
}
import java.util.*;
public class Homework{
public static void main(String[] args){
Set<Student> cjd = new TreeSet<>(new StudentComparator());
Student s1 = new Student("明明",80,60,90);
Student s2 = new Student("紅紅",60,90,80);
Student s3 = new Student("涼涼",90,90,91);
Student s4 = new Student("小王",60,60,58);
Collections.addAll(cjd,s1,s2,s3,s4);
//02.請遍歷所有元素 查看名次表
{
cjd.forEach(System.out::println);
}
System.out.println("=====================================");
//03.據說紅紅英語考試作弊 英語成績清零
{
Set<Student> temp = new TreeSet<>(new StudentComparator());
for(Iterator<Student> car = cjd.iterator(); car.hasNext(); ){
Student stu = car.next();
if("紅紅".equals(stu.name)){
car.remove();//1.TestTreeSet5
stu.english = 0;//2.
temp.add(stu);//3.TestTreeSet6
}
}
cjd.addAll(temp);
cjd.forEach(System.out::println);
}
//04.小王同學英語成績有閱卷錯誤 成績應該+10
{
}
//05.請打印所有平均分高於85的同學~
{
for(Student stu : cjd){
if(stu.chinese + stu.math + stu.english > 255){
System.out.println(stu);
}
}
}
}
}
/*
01.要求 : 脫離開Student類制定Student類的比較規則
該規則要求:
優先按照學生三科成績的平均分降序排列
如果分數相同 則按照名字排列
如果分數和名字都相同 -> 也不能捨棄元素
*/
class StudentComparator implements Comparator<Student>{
@Override
public int compare(Student s1,Student s2){
int sum1 = s1.chinese + s1.math + s1.english;
int sum2 = s2.chinese + s2.math + s2.english;
if(sum1 != sum2)
return sum2 - sum1;//分高的在前 降序
if(!s1.name.equals(s2.name))
return s1.name.compareTo(s2.name);
return 1; //
}
}
class Student{
String name;
int chinese;
int math;
int english;
public Student(String name,int chinese,int math,int english){
this.name = name;
this.chinese = chinese;
this.math = math;
this.english = english;
}
@Override
public String toString(){
return name + ": " + chinese + " , " + math + " , " + english;
}
}
Comparable 和 Comparator 有什麼區別?
這兩個接口都是用於制定排序比較的規則的
Comparable 形容詞 有能力比較的
一個類如果實現了這個接口 代表這個類型對象 是可以進行比較的 可以直接放入TreeSet完成排序
Comparator 名詞 比較專用的工具
一個類如果實現了這個接口 代表這個類型的對象 是用於比較另一個類型的工具而已
它的對象應該在創建TreeSet的時候 作爲參數傳給TreeSet
它們包結構就不一樣:
Comparable java.lang.Comparable
Comparator java.util.Comparator
它們當中的抽象方法不同:
Comparable public int compareTo(1)
Comparator public int compare(1,2)
-
Map:鍵值對類型集合
類型 底層實現 HashMap/
Hashtable (分組組數,加載因子)哈希表 TreeMap(比較器對象) 紅黑樹 Map的基本用法
如何創建Map集合 泛型限定主鍵和值兩個類型: Map<K,V> map = new HashMap<>(); 如何添加元素 不再使用add() 而是put() map.put(k1,v1) *:注意 有map.putAll(另一個Map) 但是沒有Collections.putAll(); 如何得到元素個數: System.out.println(map.size()); 如何通過主鍵對象得到對應的值對象: System.out.println(map.get(k)); 判斷是否包含指定的主鍵: System.out.println(map.containsKey(k)); 判斷是否包含指定的值: System.out.println(map.containsValue(v)); 如何刪除一個鍵值對: map.remove(k); 如何清空整個鍵值對集合: map.clear();
集合該如何完成遍歷~
keySet() : 得到所有主鍵對象組成的Set集合 map.get(k) => 得到值
values() : 得到所有的值對象組成的Collection集合 不能反向找k
entrySet() : 得到所有鍵值對對象(Map.Entry)組成的Set集合
import java.util.*;
public class Exec1{
public static void main(String[] args){
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("[蜀] 關雲長", 90);
map.put("[蜀] 諸葛孔明" ,38);
map.put("[魏] 張文遠" ,88);
map.put("[魏] 夏侯妙才",80);
map.put("[羣] 呂奉先" ,100);
map.put("[吳] 周公瑾" ,85);
map.put("[吳] 魯子敬" ,32);
map.put("[魏] 郭奉孝" ,20);
//請問我們總共收錄了多少個英雄的信息?
System.out.println(map.size());
//主鍵 -》 Set<主鍵類型> set = map.keySet();
//值 -》 Collection<值類型> cs = map.values();
//主鍵+值 -》 Set<Map.Entry<主鍵,值>> set = map.entrySet();
//請問 總共有多少個英雄名字像鬼子?
int count1 = 0;
Set<String> set1 = map.keySet();
for(String name : set1){
if(name.length() > 7){
count1++;
}
}
System.out.println("有"+count1+"個鬼子");
//請問 總共有多少個吳國的武將
int count2 = 0;
Set<String> set2 = map.keySet();
for(String name : set2){
if(name.contains("[蜀]")){
count2++;
}
}
System.out.println("有"+count2+"個蜀國的武將");
//請問 所有英雄的平均武力值是多少
int sum = 0;
Collection<Integer> cs = map.values();
for(Integer power: cs){
sum += power;
}
System.out.println("平均值:"+sum / map.size());
int s=0;
Collection<Integer> cs1 = map.values();
for(Integer power: cs){
if(power>80){
s++;
}
}
System.out.println("大於80:"+ s);
}
}