JAVA进阶知识点总结 2-Collection、迭代器、增强for循环、泛型、斗地主案例

集合和数组的区别

在这里插入图片描述

Collection集合

在这里插入图片描述

Iterator 迭代器

在这里插入图片描述

增强for循环(foreach)

在这里插入图片描述

泛型

在这里插入图片描述

01.第一章:Collection集合_集合概述

1).Java类库中提供了很多集合类,它们的功能都和ArrayList一样–存储大量的对象。
集合类就是一个“容器”,可以存储、管理大量的对象。(集合类中只能存储引用类型,不能存储基本类型)
2).Java中提供的很多的集合类,它们内部采用了不同的“数据结构”来存储,会导致对内部元素增删改查
的效率所不同。
例如:我们学过的ArrayList,它内部采用的是“数组”结构。内部如果数据长度不够,会自动进行扩容。
3).什么是“数据结构”–指存储数据的方式
常见的数据结构:
1).数组
2).链表
3).哈希表
4).栈
5).队列
6).树
7).图

4).Java中集合类的体系结构:
在这里插入图片描述

学习:Collection接口中声明的抽象方法;
使用:子类
02.第一章:Collection集合_Collection接口中的常用功能
添加:
1).public boolean add(E e):把给定的对象添加到当前集合中 。
关于返回值:
对于:List通常返回true;
对于:Set如果存储重复元素,会返回:false
示例代码:

   public static void main(String[] args) {
        Collection<String> list = new HashSet<>();
        System.out.println(list.add("王思聪"));
        System.out.println(list.add("杨幂"));
        System.out.println(list.add("王健林"));
        System.out.println(list.add("马云"));
        System.out.println(list.add("马云"));//false
        System.out.println(list);
    }

删除:
2).public void clear() :清空集合中所有的元素。
3).public boolean remove(E e) : 把给定的对象在当前集合中删除。内部是基于被存储对象
的equals()方法的。
remove的返回值:
如果删除成功返回:true
如果删除失败返回:false
示例代码:

public static void main(String[] args) {
    Collection<String> list = new ArrayList<>();
    System.out.println(list.add("王思聪"));
    System.out.println(list.add("杨幂"));
    System.out.println(list.add("王健林"));
    System.out.println(list.add("马云"));
    System.out.println(list.add("马云"));

//        list.clear();

    System.out.println("删除王思聪:" + list.remove("王思聪"));
    System.out.println("删除成龙:" + list.remove("成龙"));
    System.out.println("删除马云:" + list.remove("马云"));
    System.out.println(list);
}

判断:
4).public boolean contains(E e):判断当前集合中是否包含给定的对象。判断的方式同
remove一样,也是基于存储对象的equals()方法。
5).public boolean isEmpty() : 判断当前集合是否为空。
示例代码:
System.out.println(“是否包含:马云” + list.contains(“马云”));
list.clear();
System.out.println(“集合是否为空:” + list.isEmpty());

获取:
6).public int size() : 返回集合中元素的个数。
7).public Object[] toArray() : 把集合中的元素, 存储到数组中。将集合转换为数组
示例代码:

System.out.println("集合大小:" + list.size());
System.out.println("toArray():");
Object[] objArray = list.toArray();
for (int i = 0;i < objArray.length ; i++) {
    System.out.println(objArray[i]);
}

03.第二章:迭代器_迭代器Iterator接口的使用

1).Collection中可以通过获取一个“迭代器”对象,来遍历集合。
(注意:Collection中没有get(i)的方法,因为Set接口是无序的,所以只有List接口才有get(i)方法)
2)."迭代器"的使用:

public static void main(String[] args) {
    Collection<String> list = new ArrayList<>();
    list.add("王思聪");
    list.add("杨幂");
    list.add("王健林");
    Iterator<String> it = list.iterator();//多态
    while (it.hasNext()) {
        System.out.println(it.next());
    }
}

04.第二章:迭代器_迭代器的实现原理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

05.第二章:迭代器_使用时的常见错误

1).常见错误一:一次hasNext(),然后多次的next()

public static void main(String[] args) {
    Collection<String> list = new ArrayList<>();
    list.add("王思聪");
    list.add("杨幂");
    list.add("王健林");

    Iterator<String> it = list.iterator();//多态
    while (it.hasNext()) {
	   String str = it.next();
        System.out.println(it.next());
    }
}

1).编译错误
2).运行时异常
3).运行打印:王思聪、杨幂、王健林
4).运行打印:王思聪、王健林
5).运行时打印:杨幂、运行时异常(正确答案)
1).常见错误二:并发修改异常

public static void main(String[] args) {
        Collection<String> list = new ArrayList<>();
        list.add("王思聪");
        list.add("杨幂");
        list.add("王健林");
        Iterator<String> it = list.iterator();//多态
        while (it.hasNext()) {
            String s = it.next();
            if (s.equals("王健林")) {
//                list.remove(s);//使用"集合对象"去删除元素,会导致并发修改异常
                it.remove();//使用"迭代器"对象去删除,就OK了
            }
            System.out.println(s);
        }
        System.out.println(list);
    }

迭代器内部原理:
在这里插入图片描述

06.第二章:迭代器_增强for

1).增强for:它是一个“新的语法”–进行循环、遍历的,类似于“普通for”循环;
它可以遍历数组和集合;
2).语法:
for(数组/集合中元素的数据类型 变量名 : 数组/集合对象){
//直接使用“变量名”即可
}
3).示例:遍历数组:

int[] intArray = {1,2,3,4};
		for(int n : intArray){
			System.out.println(n);
		}

4).示例:遍历集合:注意:编译后,就是“迭代器”,注意并发修改异常
//遍历集合

ArrayList<String> list = new ArrayList<>();
list.add("王思聪");
list.add("杨幂");
list.add("王健林");
for (String s : list) {
    System.out.println(s);
    if (s.equals("王健林")) {
      list.remove(s);//会导致并发修改异常
    }
    }

07.第三章:泛型_泛型概述及好处

1).泛型:
ArrayList list = new ArrayList();
2).使用泛型的好处:
当集合使用泛型后,可以规定这个集合中只能存储某一种类型的对象引用。
使用时比较安全。
泛型可以将安全性的验证提前到“编译期”。

08.第三章:泛型_定义和使用含有泛型的类

1 定义泛型类:在这里插入图片描述
2 定义泛型方法:
在这里插入图片描述

3 定义泛型接口
在这里插入图片描述
在这里插入图片描述

public class MyArrayList<E,A,B,C> {
    public void add(E e) {
    }

    public A get() {
        return null;
    }

    public void show(B b, C c) {
        
    }
}

注意:
:可以是一个字符,可以是多个字符;可以大写、可以小写
可以同时定义多个泛型名称。

09.第三章:泛型_含有泛型的方法

在这里插入图片描述
1).在“定义方法时”也可以同时定义“泛型”:
2).定义泛型方法:
public class MyArrayList {
//定义一个方法,要求可以接收任意的,但必须是相同类型的五个参数

  public <E> void show(E s1,E e2,E e3,E e4,E e5) {
        
    }
}

测试类:

public static void main(String[] args) {
    MyArrayList list = new MyArrayList();
    list.<Integer>show(10,2,3,4,20);

    list.<String>show("a", "b", "c", "d", "e");

}

10.第三章:泛型_含有泛型的接口

1).同泛型类一样:
interface IA{
public void show(E e);
}
//1.子类丢弃泛型
class Zi implements IA{
@Override
public void show(Object o) {

}
}
//2.子类可以指定某一种具体的类型
class Zi2 implements IA{
@Override
public void show(String s) {

}
}
//3.子类可以继承这个泛型
class Zi3 implements IA{
@Override
public void show(E e) {

}
}

11.第三章:泛型_泛型通配符

1).<?>:指具有任何泛型
需求:要求定义一个方法,这个方法可以接收具有任何泛型的List集合

public static void main(String[] args) {
    List<String> strList = new ArrayList<>();
    fun(strList);

   List<Integer> intList = new ArrayList<>();
    fun(intList);

}

//需求:要求定义一个方法,这个方法可以接收具有任何泛型的Li![在这里插入图片描述](https://img-blog.csdnimg.cn/20200218180931657.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FkYW1DYWZl,size_16,color_FFFFFF,t_70)st集合的形参
public static void fun(List<?> list) {

}

2).<? extends E>:表示可以是E或者E的子类泛型–设置“上限”
class Person{}
class Student extends Person{}
class JavaStudent extends Student{}
需求:定义一个方法,可以接收Student和JavaStudent泛型的List的形参

public static void main(String[] args) {
    List<Person> list0 = new ArrayList<>();
    List<Student> list1 = new ArrayList();
    List<JavaStudent> list2 = new ArrayList<>();
    fun2(list0);//错误
    fun2(list1);
    fun2(list2);
            
            
}

public static void fun2(List<? extends Student> list) {
    
}

3).<? super E>:表示可以是E或者E的父类泛型–限定“下限”
class Person{}
class Student extends Person{}
class JavaStudent extends Student{}
需求:定义一个方法,可以接收Person和Student泛型的List的形参

public static void main(String[] args) {
    List<Person> list0 = new ArrayList<>();
    List<Student> list1 = new ArrayList();
    List<JavaStudent> list2 = new ArrayList<>();
    fun2(list0);
    fun2(list1);
    fun2(list2);//错误
 }

public static void fun2(List<? super Student> list) {
    
}

12.第四章:综合案例_模拟斗地主洗牌发牌

在这里插入图片描述
1).要使用的一个新类:java.util.Collections(工具类)对集合操作的工具类:
2).方法:
public static void shuffle​(List<?> list):打乱集合中元素的顺序;
3).示例代码:
public static void main(String[] args) {
//1.封装一副牌

 String[] colors = {"♥", "♠", "♦", "♣"};
    String[] numbers = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
    ArrayList<String> pokerList = new ArrayList<>();
    for (String c : colors) {
        for (String n : numbers) {
            pokerList.add(c + n);
        }
    }
    pokerList.add("小王");
    pokerList.add("大王");

//2.洗牌
Collections.shuffle(pokerList);

//3.发牌

 ArrayList<String> user1List = new ArrayList<>();
    ArrayList<String> user2List = new ArrayList<>();
    ArrayList<String> user3List = new ArrayList<>();
    ArrayList<String> dipaiList = new ArrayList<>();
    for (int i = 0; i < pokerList.size(); i++) {
        if (i >= pokerList.size() - 3) {
            dipaiList.add(pokerList.get(i));
        }else {
            if (i % 3 == 0) {
                user1List.add(pokerList.get(i));
            } else if (i % 3 == 1) {
                user2List.add(pokerList.get(i));
            } else if (i % 3 == 2) {
                user3List.add(pokerList.get(i));
            }
        }

    }

//4.看牌

    System.out.println("普京:" + user1List);
    System.out.println("特朗普:" + user2List);
    System.out.println("金三胖:" + user3List);
    System.out.println("底牌:" + dipaiList);
}

===============================================================================
学习目标总结:
01.能够说出集合与数组的区别
1).集合:长度可变;
2).数组:长度不可变;
02.说出Collection集合中常用的API(添加,删除,清空等)
1).public boolean add(E e):
删除:
2).public void clear()
3).public boolean remove(E e):
判断:
4).public boolean contains(E e)
5).public boolean isEmpty()
获取:
6).public int size():
7).public Object[] toArray()

03.能够使用迭代器遍历集合
Collection list = new ArrayList<>();

Iterator it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
04.能够使用foreach遍历集合
Collection list = new ArrayList<>();

for(String s : list){
System.out.println(s);
}
05.能够理解泛型上下限
1).上限:<? extends 类>:类/此类的子类
2).下限:<? super 类> : 类/此类的父类
06.能够阐述泛型通配符(?,extends,super)的作用
1).<? extends 类> 可以是类/此类的子类
2).下限:<? super 类> : 类/此类的父类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值