集合 初次學習集合過程中的學習筆記,學習頂層,使用底層.包括常用的API Collection介面 概述 集合 : 集合是Java中提供的一種容器,可以用來存儲多個數據. 與數組的區別: 數組的長度是固定的,集合的長度是可變的. 數組只能存儲同一種數據類型,集合可以存儲任意數據類型. 數組可以存儲基 ...
集合
初次學習集合過程中的學習筆記,學習頂層,使用底層.包括常用的API
Collection介面
概述
集合 : 集合是Java中提供的一種容器,可以用來存儲多個數據.
與數組的區別:
- 數組的長度是固定的,集合的長度是可變的.
- 數組只能存儲同一種數據類型,集合可以存儲任意數據類型.
數組可以存儲基本數據類型和引用數據類型,集合只能存儲引用數據類型.
集合的繼承結構
List特點 : 存儲有序(存取順序一致),有索引,可以存儲重覆的元素
Set特點 : 存儲無序(LinkedHashSet除外),沒有索引,不可以存儲重覆的元素
共性方法
- public boolean add(E e) : 把給定的對象添加到當前集合中,可以添加給定對象以及給定對象的子類。
- public void clear() :清空集合中所有的元素。
- public boolean remove(Object o) : 把給定的對象在當前集合中刪除。對象不存在,返回false.
- public boolean contains(Object o) : 判斷當前集合中是否包含給定的對象。
- public boolean isEmpty() : 判斷當前集合是否為空。
- public int size() : 返回集合中元素的個數。
- public Object[] toArray() : 把集合中的元素,存儲到數組中。
迭代器
迭代器用來遍歷集合,使用下麵的方法來創建迭代器:
- Iterator
迭代器中常用方法:
- boolean hasNext() 如果迭代具有更多元素,則返回 true 。
- E next() 返回迭代中的下一個元素。
如何遍歷集合? 如下:
// 創建集合
ArrayList<Student> stuList = new ArrayList<>();
// 創建學生對象
Student stu1 = new Student("趙麗穎",23);
stuList.add(stu1);
stuList.add(new Student("鄭爽",22));
stuList.add(new Student("楊冪",34));
stuList.add(new Student("迪麗熱巴",22));
// 使用迭代器進行遍歷
Iterator<Student> iterator = stuList.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println("=======================");
// 使用增強for迴圈的遍歷
for (Student student : stuList) {
System.out.println(student);
}
System.out.println("=======================");
// 使用數組進行遍歷,註意的是只能用Object數組進行接收
Object[] objs = stuList.toArray();
for (int i = 0; i < objs.length; i++) {
System.out.println(objs[i]);
}
增強for迴圈
增強for迴圈(也稱for each迴圈)是JDK1.5以後出來的一個高級for迴圈,遍歷集合內部原理其實是個Iterator迭代器,所以它只進行遍歷元素,不要在遍歷的過程中對集合元素進行增刪操作。遍曆數組內部原理其實是個普通for迴圈.
就是上面的第二種方式
新for迴圈必須有被遍歷的目標。目標只能是Collection或者是數組。新式for僅僅作為遍歷操作出現。
泛型
概念
廣泛的數據類型,將數據類型的確認推遲到使用的時候.
泛型只能是引用數據類型.
泛型類的定義
在定義類的時候,在類名後加上
class A<E>{
}
泛型類在創建對象的時候確定類型.
定義含有泛型的方法
格式如下:
修飾符 <泛型> 返回值 方法名(泛型參數列表){}
例子:
public <E> void method1(E e){
System.out.println(e);
}
使用的時候創建對象,調用方法,可以傳入各種數據類型.
定義泛型的介面
格式如下:
interface 介面名{}
泛型介面的子實現類有兩種方式:
- 帶泛型的 : class 類名 implements 介面名{}
- 不帶泛型的 : class 類名 implements 介面名
也就是說實現的子介面可以確定泛型的類型,也可以不確定,繼續使用泛型,這就是兩種方式.
泛型通配符
當使用泛型類或者介面時,傳遞的數據中,泛型類型不確定,可以通過通配符<?>表示。但是一旦使用泛型的通配符後,只能使用Object類中的共性方法,集合中元素自身方法無法使用.
不知道使用什麼類型來接收的時候,此時可以使用?,?表示未知通配符。
例子:
public static void main(String[] args) {
Collection<Intger> list1 = new ArrayList<Integer>();
getElement(list1);
Collection<String> list2 = new ArrayList<String>();
getElement(list2);
}
public static void getElement(Collection<?> coll){}
//?代表可以接收任意類型
高級用法:
- 泛型的上限:
格式: 類型名稱 <? extends 類 > 對象名稱
意義: 只能接收該類型及其子類
泛型的下限:
格式: 類型名稱 <? super 類 > 對象名稱
意義: 只能接收該類型及其父類型
舉個例子:public static void main(String[] args) {
Collection
來個更明顯的例子,四個類,如下:
public class People {
/**
* 姓名
*/
private String name;
/**
* 年齡
*/
private int age;
public People(String name, int age) {
this.name = name;
this.age = age;
}
public People() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Student extends People{
public Student(String name, int age) {
super(name, age);
}
public Student() {
}
}
public class BasicStudent extends Student{
public BasicStudent(String name, int age) {
super(name, age);
}
public BasicStudent() {
}
}
public class DemoTest2 {
public static void main(String[] args) {
ArrayList<People> arrList1 = new ArrayList<>();
// boolean add(E e) 確保此集合包含指定的元素(可選操作)。
// 說明add方法可以添加指定對象以及指定對象的子類
arrList1.add(new Student("迪麗熱巴",22));
arrList1.add(new BasicStudent("鄧倫",23));
ArrayList<Student> arrList2 = new ArrayList<>();
ArrayList<BasicStudent> arrList3 = new ArrayList<>();
ArrayList<People> arrList4 = new ArrayList<>();
// boolean addAll(Collection<? extends E> c) 將指定集合中的所有元素添加到此集合(可選操作)。
// 測試addAll方法
arrList2.add(new Student("迪麗熱巴",22));
arrList2.add(new Student("鄧倫",23));
arrList3.add(new BasicStudent("楊冪",34));
arrList3.add(new BasicStudent("鄭愷威",35));
arrList4.add(new People("楊洋",24));
arrList4.add(new People("鄭爽",23));
// 可以添加成功
arrList2.addAll(arrList3);
// 報錯,添加失敗,原因是addAll方法的參數中通配符有上界的限制,只能添加該類以及該類的子類,不能添加父類等其他類
// arrList2.addAll(arrList4);
System.out.println(arrList2);
}
}
最後再來個小案例,案例要求如下:
按照鬥地主的規則,完成洗牌發牌的動作。 具體規則:
使用54張牌打亂順序,三個玩家參與游戲,三人交替摸牌,每人17張牌,最後三張留作底牌。
/**
* 鬥地主的測試類
* 1.買牌
* 2.洗牌
* 3.發牌
* 4.看牌
*
* @author WZLOVE
* @create 2018-07-11 17:36
*/
public class DDZDemoTest {
public static void main(String[] args) {
// 買牌
ArrayList<String> poker = new ArrayList<>();
String[] arr1 = {"♠","♥","♣","♦"};
String[] arr2 = {"2","A","K","Q","J","10","9","8","7","6","5","4","3"};
for (String s : arr1) {
for (String s1 : arr2) {
poker.add(s + s1);
}
}
poker.add("大王");
poker.add("小王");
System.out.println(poker.size());
// 洗牌
Collections.shuffle(poker);
// 發牌
ArrayList<String> people1 = new ArrayList<>();
ArrayList<String> people2 = new ArrayList<>();
ArrayList<String> people3 = new ArrayList<>();
ArrayList<String> dipai = new ArrayList<>();
// 自己的思路
/*for (int i = 0; i < poker.size();) {
if(i >= 51){
dipai.add(poker.get(i++));
} else{
people1.add(poker.get(i++));
people2.add(poker.get(i++));
people3.add(poker.get(i++));
}
}*/
// 老師的思路
for (int i = 0; i < poker.size();i++) {
if(i >= 51){
dipai.add(poker.get(i));
} else if(i % 3 == 0) {
people1.add(poker.get(i));
}else if(i % 3 == 1) {
people2.add(poker.get(i));
}else if(i % 3 == 2){
people3.add(poker.get(i));
}
}
// 看牌
System.out.println(people1);
System.out.println(people2);
System.out.println(people3);
System.out.println(dipai);
}
}