二、Collection、泛型
一、Collection集合
1.1 概述
集合:长度可变的,存放对象
数组:长度不可变,存放基本类型
1.2 框架
API:类和接口
学习集合的目标:
- 会使用集合存储数据
- 会遍历集合,把数据取出来
- 掌握各种集合的特性
Collection接口
- 定义的所有单例集合中的共性方法
- 所有单例集合可以使用共性的方法
- 没有带索引的方法
-
List接口
- 有序的集合(存储和取出元素顺序相同)
- 允许存储重复的元素
- 有索引,可以使用普通的for循环遍历
- Vector集合
- ArrayList集合
- LinkedList集合
-
Set接口
- 不允许存储重复元素
- 没有索引(不能使用普通的for循环遍历)
- TreeSet集合 无序
- HashSet集合 无序
- LinkedHashSet集合 有序
集合框架的学习方式:
- 学习顶层:学习顶层接口/抽象类中共性的方法,所有子类都可以使用
- 使用底层:底层不是接口就是抽象类,无法创建对象使用,需要使用底层的子类创建对象使用
1.3 Collection常用功能
java.util.Connection
所有单列集合的最顶层接口,里面定义了所有单列集合共性的方法
- public boolean add(E e)
- public void clear()
- public boolean remove(E e)
- public boolean contains(E e)
- public boolean isEmpty()
- public int size()
- public Object[] toArray()
Collection<String> coll =new ArrayList<>();
coll.add("张三");
coll.add("李四");
Object[] array = coll.toArray();
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
System.out.println(coll.size());
System.out.println(coll);
coll.remove("张三");
System.out.println(coll);
System.out.println(coll.contains("李四"));
System.out.println(coll.isEmpty());
coll.clear();
System.out.println(coll);
System.out.println(coll.isEmpty());
二、Iterator迭代器
2.1 常用方法
java.util.Iterator
有两个常用的方法
-
boolean hasnext() 判断集合中是否还有下一个元素
-
E next()取出集合中的下一个元素
Iterator迭代器,是一个接口,无法直接使用,通过Collection接口中的一个方法 iterator(),返回
迭代器的使用步骤:
- 使用集合中的方法iterator()获取迭代器的实现对象,使用Iterator接口接收(多态)
- 使用Iterator接口中的方法hasNext判断是否有下一个元素
- 使用Iterator接口中的方法next取出集合中的下一个元素
Collection<String> coll = new ArrayList<>();
coll.add("A");
coll.add("B");
coll.add("C");
coll.add("D");
Iterator<String> iterator = coll.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
2.2 增强for循环
底层也是迭代器,使用for循环的格式简化了迭代器的书写
for(集合/数组的数据类型 变量名:集合名){
sout(变量名);
}
三、泛型
3.1 泛型概述
泛型是一种未知的数据类型,当我们不知道使用什么数据类型的时候,可以使用泛型
泛型也可以看成是一个变量,用来接收数据类型
E e :Element元素
T t :Type 类型
3.2 使用泛型的好处
创建集合对象,不使用泛型:
好处:
集合不使用泛型,默认Object,可以存储任意类型的数据
弊端:
不安全,会引发异常
ArrayList<Object> arrayList = new ArrayList<>();
arrayList.add("abc");
arrayList.add(1);
Iterator<Object> iterator = arrayList.iterator();
while (iterator.hasNext()){
Object next = iterator.next();
String s = (String) next;
System.out.println(s.length());
}
----结果----
3
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at com.dy.Demo01Iterator.main(Demo01Iterator.java:15)
创建集合对象,使用泛型:
好处:
- 避免了类型转换的麻烦,存储是什么类型,取出就是什么类型
- 把运行期异常(代码运行后抛出的异常),提升到了编译期(写代码的时候)
弊端:
泛型是什么类型,就只能存什么类型
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("abc");
Iterator<String> iterator = arrayList.iterator();
while (iterator.hasNext()){
String next = iterator.next();
System.out.println(next.length());
}
3.3 泛型的定义与使用
含有泛型的类
定义一个含有泛型的类,模拟ArrayList集合
泛型是一个未知的数据类型,我们不确定使用什么数据类型的时候,可以使用泛型
泛型可以接收任意数据类型,Integer,String。。。
创建对象的时候确定数据类型
public class GenericClass<E> {
private E name;
public E getName() {
return name;
}
public void setName(E name) {
this.name = name;
}
}
含有泛型的方法
定义含有泛型的方法:泛型定义在修饰符合返回类型之间
public
}
public class GenericMethod {
public <E> void method01(E e){
System.out.println(e);
}
public static <E> void method02(E e){
System.out.println(e);
}
}
含有泛型的接口
接口
package com.dy;
public interface GenericInterface<E> {
public abstract void methoid(E e);
}
接口实现类1:
package com.dy;
/*
定义含有泛型的接口,第一种使用方式:定义接口的实现类,实现接口,指定接口的泛型
*/
public class GenericInterfaceImpl1 implements GenericInterface<String>{
@Override
public void methoid(String s) {
System.out.println(s);
}
}
接口实现类2:
package com.dy;
/*
含有泛型接口的第二种使用方式:接口使用什么泛型,实现类就使用什么泛型,类跟着接口走
*/
public class GenericInterfaceImpl2<E> implements GenericInterface<E>{
@Override
public void methoid(E e) {
System.out.println(e);
}
}
主函数:
package com.dy;
public class Demo01GenericClass {
public static void main(String[] args) {
GenericInterfaceImpl1 impl1 = new GenericInterfaceImpl1();
impl1.methoid("adc");
GenericInterfaceImpl2<Integer> impl2 = new GenericInterfaceImpl2<>();
impl2.methoid(1);
}
}
3.4 泛型的通配符
泛型的使用
不知道使用什么类型来接收的时候,可以使用通配符
泛型的通配符:
?:代表任意的数据类型
使用方式:
不能创建对象使用
只能作为方法的参数使用
public class Demo02Generic {
public static void main(String[] args) {
ArrayList<String> list01 = new ArrayList<>();
list01.add("a");
list01.add("b");
ArrayList<Integer> list02 = new ArrayList<>();
list02.add(1);
list02.add(2);
printArray(list01);
printArray(list02);
}
public static void printArray(ArrayList<?> list){
Iterator<?> iterator = list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
泛型的上限和下限
四、斗地主示例
斗地主综合案例
- 1.准备牌
- 2.洗牌
- 3.发牌
- 4.看牌
package com.dy;
import java.util.ArrayList;
import java.util.Collections;
/**
* 斗地主综合案例
* 1.准备牌
* 2.洗牌
* 3.发牌
* 4.看牌
*/
public class douDiZhu {
public static void main(String[] args) {
//1.准备牌
ArrayList<String> poker = new ArrayList<>();
poker.add("大王");
poker.add("小王");
String[] colors = {"♠","♥","♣","♦"};
String[] numbers = {"2","A","K","Q","J","10","9","8","7","6","5","4","3"};
for (String number : numbers) {
for (String color : colors) {
poker.add(color+number);
}
}
System.out.println(poker);
//2.洗牌
Collections.shuffle(poker);
System.out.println(poker);
//3.发牌
ArrayList<String> play01 = new ArrayList<>();
ArrayList<String> play02 = new ArrayList<>();
ArrayList<String> play03 = new ArrayList<>();
ArrayList<String> dipai = new ArrayList<>();
System.out.println(poker.size());
for (int i = 0; i < poker.size(); i++) {
if (i>=51){
dipai.add(poker.get(i));
}else if(i%3==0){
play01.add(poker.get(i));
}else if(i%3==1){
play02.add(poker.get(i));
}else if(i%3==2){
play03.add(poker.get(i));
}
}
System.out.println("play01:"+play01);
System.out.println("play02:"+play02);
System.out.println("play03:"+play03);
System.out.println("dipai:"+dipai);
}
}
浙公网安备 33010602011771号