1 可變參數
概念:方法參數列表中的參數個數不確定,就表示可變參數。
可變參數的本質:數組。
注意事項:方法的參數列表中只能有一個可變參數,並且可變參數只能在參數列表的末尾。
語法格式:(數據類型...變量名)
public class ParameterDemo {
public static void main(String[] args) {
add(10,20,30,40); //允許
int[] arr={10,20,30,40};
add(arr);//允許
Integer[] arr2={10,20,30,40};
//add(arr2); //報錯,int[]和Integer[]不能相互轉換
}
public static int add(int... nums){
int sum=0;
for (int num : nums) {
sum+=num;
}
return sum;
}
}
可變參數的使用;
/*
集合和數組之間的相互轉換
數組--->集合 Arrays
static <T> List<T> asList(T... a) :返回由指定數組支持的固定大小的列表。
集合--->數組 Collection
Object[] toArray() :返回一個包含此集合中所有元素的數組。
<T> T[] toArray(T[] a) :返回一個包含此集合中所有元素的數組; 返回的數組的運行時類型是指定數組的運行時類型。
*/
public class ArgsDemo2 {
public static void main(String[] args) {
//數組--->集合
Integer[] arr={10,20,30,40,50};
List<Integer> list = Arrays.asList(arr);
System.out.println(list);
//集合--->數組
List<String> lts=List.of("hello","world","java");
//方式1:Object[] toArray() :返回一個包含此集合中所有元素的數組
Object[] arrs1 = lts.toArray();
System.out.println(Arrays.toString(arrs1));
//方式2: <T> T[] toArray(T[] a) :需要傳遞一個數組對象,集合中數據是什麼類型就創建一個該類型的空數組傳進去
/*String[] arrs2=new String[lts.size()];
lts.toArray(arrs2);*/
//簡化寫法
String[] arrs2 = lts.toArray(new String[lts.size()]);
System.out.println(Arrays.toString(arrs2));
}
}
2 Map集合
map集合是一個雙列集合,每次存儲一對值,分爲key-value。
特點:key相同,value會被替換。也就是說key是唯一的。
map集合的使用,常用方法:(重點)
增/添加/改
V put(K key, V value):添加獲取替換值,如果添加的key不存在,那麼返回值就是null。如果key存在,那麼新的value會替換原來的value值,返回值是被替換的值。
刪/移除
V remove(K key):根據key移除一對元素。返回值就是對應的value值
查/獲取
V get(K key):根據key獲取value。
K keySet():獲取所有的key
Map.Entry<K,V> entrySet():獲取所有的鍵值對對象
遍歷:(重要*****)
方式1:鍵找值的方式,實現思路:
1 獲取所有的key
2 遍歷所有的key
3 在遍歷過程中根據key獲取對應的value值,打印結果
方式2:鍵值對的方式,實現思路:
Map.Entry<K,V> : Entry是Map的一個內部接口(看成是內部類結構)。Entry也有泛型,泛型和Map集合的泛型一樣。
Entry的作用:在我們調用Map集合的put方法存值的時候,其實內部會創建一個Entry實現類對象,將我們存進去的值封裝到Entry實現類對象中。
簡單說:Map集合的內部會將每一對值封裝成一個個Entry對象,Entry對象也叫做鍵值對對象。
1 獲取所有的鍵值對對象:Map.Entry<K,V> entrySet();
2 遍歷所有的鍵值對對象,獲取每一個鍵值對對象
3 調用鍵值對對象的getKey()和getValue()方法獲取鍵和值,打印結果。
Map集合key唯一的條件:
key表示的對象要重寫hashCode()和equals()方法。
3 Collections集合工具類
1 Collection和Collections的區別?
Collection是單列集合的頂層接口,Collections是操作集合的工具類。
2 Collections的常用方法:
static void shuffle(List<?> list):隨機打亂集合中元素的順序。
static <T extends Comparable<? super T>> void sort(List<T> list):
對list集合中的元素進行自然排序,list集合中的元素必須要實現Comparable接口
static <T> void sort(List<T> list, Comparator<? super T> c):對list集合中的元素使用Comparator比較器進行排序
4 鬥地主案例
基礎版思路分析
1、準備牌:
1、定義一個List集合作爲牌盒
2、定義兩個數組,存儲花色和牌號
3、遍歷數組,將花色和牌號進行組合,將組合好的牌存的牌盒list集合中
2、洗牌:
Collections.shuffle(牌盒集合)
3、發牌
1、定義三個List集合表示三個玩家和一個集合表示底牌
2、遍歷牌盒的list集合,共有54張牌在list集合中
3、如果索引大於50,那麼就發給底牌集合
4、將索引對3取餘,如果餘數是0,那麼就發給玩家1;如果餘數是1,就發給玩家2;如果餘數是2,就發給玩家3
if(i>50){
//發給底牌
}else if(i%3==0){
//發給玩家1
}else if(I%3==1){
//發給玩家2
} else if(I%3==2){
//發給玩家3
}
4、看牌:打印玩家姓名和玩家集合對象
加強版思路分析:
1、準備牌
1、定一個Map集合最爲牌盒
2、定義兩個數組,存儲花色和牌號
3、定義一個牌的序號起始值爲0,每存一張牌,序號就++;
4、遍歷數組,將花色和牌號進行組合,將組合好的牌存的牌盒map集合中
2、洗牌
1.獲取Map集合的所有key
Set<Integer> keys=poker.keySet();
2.將set集合轉換成list,使用list的構造方法即可
3.打亂順序
Collections.shuffle(list)
3、發牌
1、定義三個TreeSet集合表示三個玩家和一個集合表示底牌
2、遍歷裝有序號的list集合,共有54個序號在list集合中
3、如果索引大於50,那麼就發給底牌集合
4、將索引對3取餘,如果餘數是0,那麼就發給玩家1;如果餘數是1,就發給玩家2;如果餘數是2,就發給玩家3
if(i>50){
//發給底牌
}else if(i%3==0){
//發給玩家1
}else if(I%3==1){
//發給玩家2
} else if(I%3==2){
//發給玩家3
}
4、看牌
定義一個方法:遍歷玩家的TreeSet集合,根據序號從Map集合中獲取對應的牌,打印到控制檯
作業1:查API文檔實現數組和集合之間的相互轉換