集合、泛型

第一章:集合1

1. 什么是集合

  • 定义:在Java中,集合是一种可以存储多个数据的容器。

  • 代码:

           ArrayList<String> list = new ArrayList<>();
           list.add("张三");
           list.add("王五");
           list.add("赵六");
           System.out.println(list); // [张三, 王五, 赵六]

2. 集合和数组的区别

  • 区别:数组的长度是固定的,集合的长度是可变的

  • 代码:

           String[]strs = new String[2];
           strs[0] = "张三";
           strs[1] = "李四";
           // strs[2] = "赵六"; // 运行时报错java.lang.ArrayIndexOutOfBoundsException
       ​
           ArrayList<String> list = new ArrayList<>();
           System.out.println(list.size());
           list.add("张三");
           list.add("王五");
           list.add("赵六");
           System.out.println(list.size());  

3. 集合框架Collection

  • 集合按照其存储结构可以分为两大类,本篇先学习Collection

  • Collection集合介绍

    • 单列集合类的根接口

    • 有两个子接口

      • java.util.List;特点是:内容可重复,有序

      • java.util.Set; 特点是:内容不可重复,无序

    • 定义了单例集合最共性的方法。

  • 图解Collection框架结构

  • Collection中通用方法

    • 方法:

      • 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(): 把集合中的元素,存储到数组中。

    • 代码:

            List<String> list = new ArrayList<>();
            // 添加元素
            list.add("张三");
            list.add("李四");
            System.out.println(list);
            // 移除元素
            list.remove("张三");
            System.out.println(list);
            // 判断集合中是否包含某个元素
            boolean isHas = list.contains("张三");
            System.out.println(isHas); // false
            // 判断当前集合是否为空
            boolean isEmpty = list.isEmpty();
            System.out.println(isEmpty);
            // 清空元素
            list.clear();
            System.out.println(list);
            // 集合的长度
            System.out.println(list.size());
            // 集合中的元素存储到一个数组中
            Object[]s =  list.toArray();

4. 遍历集合

  • Iterator方式

    • 介绍

      ​ Iterator,是一个迭代器接口。Collection中的成员方法iterator()被调用后,会返回一个Iterator对象。利用这个对象可以实现遍历集合。

      ​ 如何遍历呢?在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代。

    • Iterator对象的成员方法:

      • hasNext(); 检测集合中是否存在下一个元素

      • next(); 找到并获取下一个元素

    • 迭代器的原理

      ​ 在调用Iterator的next方法之前,迭代器的索引位于第一个元素之前,不指向任何元素,当第一次调用迭代器的next方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回,当再次调用next方法时,迭代器的索引会指向第二个元素并将该元素返回,依此类推,直到hasNext方法返回false,表示到达了集合的末尾,终止对元素的遍历。

    • 代码:

             List<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(str);
             }
  • 增强for

    • 介绍

      ​ 增强for循环(也称for each循环)是JDK1.5以后出来的一个高级for循环,专门用来遍历数组和集合的。它的内部原理其实是个Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作。

    • 使用格式

        for(元素的数据类型  变量 : Collection集合or数组){       //写操作代码  }
    • 代码:

        for (String name:list) {    System.out.println(name);  }

第二章:泛型

1. 什么是泛型

​ 泛型,未知的类型,可以在类或方法中预支地使用未知的类型。

2. 泛型的好处

​ 可以避免类型转换的麻烦。

3. 定义和使用含有泛型的类

  • 格式修饰符 class 类名<代表泛型的变量> { }

  • 使用泛型:在创建对象的使用。也就是在创建对象时确定泛型的类型。

  • 代码:

       public class ArrayList<E> {
           public boolean add(E e){ }
           ...
       }
       ​
       public class MainDemo{
         public static void main(String[] args) {
           ArrayList<String> list = new ArrayList<>();
           list.add("张三");
         }
       }

4. 定义和使用含有泛型的方法

  • 格式:修饰符 <代表泛型的变量> 返回值类型 方法名(参数){ }

  • 代码:

       public static void main(String[] args) {
          methon1("张三");
       }
       public static  <M> void methon1(M m){
          System.out.println(m);
       }

5. 定义和使用含有泛型的接口

  • 格式:修饰符 interface接口名<代表泛型的变量>

  • 代码:

       public interface TestInterface<T> {
         public abstract void show(T t);
       }
       ​
       public class<T> TestImpl implements TestInterface<T> {
         @Override
         public T void show(T o) {
           System.out.println(o);
         }
       }
       ​
       public class Main01 {
         public static void main(String[] args) {
           TestImpl<String> t = new TestImpl<>();
           t.show("我的信息");
       ​
         }
    
       }

6. 泛型通配符

  • 介绍

    不知道使用什么类型来接收的时候,此时可以使用?,?表示未知通配符。

    此时只能接受数据,不能往该集合中存储数据。

  • 代码:

      public static void main(String[] args) {
           ArrayList<String> list1 = new ArrayList<>();
           list1.add("张三");
           list1.add("李四");
           ArrayList<Integer> list2 = new ArrayList<>();
           list2.add(1);
           list2.add(2);
           print(list1);
           print(list2);
         }
         // 定义一个方法打印集合,不确定未来集合中的元素类型,<>中不能写入Object中,因为泛型中不存在继承关系。
         public static void print(ArrayList<?> list){
           System.out.println(list);
         }

7. 泛型通配符受限使用

  • 受限1类型名称 <? extends 类 > 对象名称

    • 只能接收该类型或该类型的子类

  • 受限2类型名称 <? super 类 > 对象名称

    • 只能接收该类型或该类型的父类

  • 代码

       public static void main(String[] args) {
           Collection<Integer> list1 = new ArrayList<Integer>();
           Collection<String> list2 = new ArrayList<String>();
           Collection<Number> list3 = new ArrayList<Number>();
           Collection<Object> list4 = new ArrayList<Object>();
    
           getElement(list1);
           getElement(list2);//报错
           getElement(list3);
           getElement(list4);//报错
    
           getElement2(list1);//报错
           getElement2(list2);//报错
           getElement2(list3);
           getElement2(list4);
    
       }
       // 泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类
       public static void getElement1(Collection<? extends Number> coll){}
       // 泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类
       public static void getElement2(Collection<? super Number> coll){}

第三章:综合案例斗地主

  • 需求:

    • 实现发牌功能,并且展示底牌。

  • 代码:

       package it.leilei.cn.demo05;
       ​
       import java.util.ArrayList;
       import java.util.Collection;
       import java.util.Collections;
       ​
       public class Main01 {
         public static void main(String[] args) {
           // 1. 准备牌
           // 牌的花色
           String[]colors = {"♥","♠","♣","♦"};
           // 牌的数字
           String[]nums = {"2","A","K","Q","J","10","9","8","7","6","5","4","3"};
           // 2. 组装装牌
           ArrayList<String> poker = new ArrayList<>();
           for (String num:nums) {
             for (String color:colors) {
               poker.add(num + color);
             }
           }
           poker.add("大王");
           poker.add("小王");
       ​
           // 3. 发牌
           ArrayList<String> list1 = new ArrayList<>();
           ArrayList<String> list2 = new ArrayList<>();
           ArrayList<String> list3 = new ArrayList<>();
           ArrayList<String> diPai = new ArrayList<>();
       ​
           // 打乱牌
           Collections.shuffle(poker);
       ​
           for (int i = 0,len = poker.size(); i < len;i++) {
             if(i>=51) {
               diPai.add(poker.get(i));
             }else if(i%3==0) {
               list1.add(poker.get(i));
             }else if(i%3==1) {
               list2.add(poker.get(i));
             }else if(i%3==2) {
               list3.add(poker.get(i));
             }
           }
       ​
           System.out.println("周星驰:" + list1);
           System.out.println("刘德华:" + list2);
           System.out.println("周润发:" + list3);
           System.out.println("底牌:" + diPai);
       ​
         }
       }

Java基础01-集合1、泛型的更多相关文章

  1. Java基础之集合与泛型

    话不多说,直接上图 1.Collection集合小结 注意: 凡是使用哈希表保存对象的容器,保存的对象在容器中都是唯一的,唯一性是通过被保存对象的hashCode和equals方法共同确定: 凡是使用 ...

  2. java基础-Map集合

    java基础-Map集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Map集合概述 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它 ...

  3. Java基础之 集合体系结构(Collection、List、ArrayList、LinkedList、Vector)

    Java基础之 集合体系结构详细笔记(Collection.List.ArrayList.LinkedList.Vector) 集合是JavaSE的重要组成部分,其与数据结构的知识密切相联,集合体系就 ...

  4. java基础 01

    java基础01 1. /** * JDK: (Java Development ToolKit) java开发工具包.JDK是整个java的核心! * 包括了java运行环境 JRE(Java Ru ...

  5. Java基础之多态和泛型浅析

    Java基础之多态和泛型浅析 一.前言: 楼主看了许多资料后,算是对多态和泛型有了一些浅显的理解,这里做一简单总结 二.什么是多态? 多态(Polymorphism)按字面的意思就是“多种状态”.在面 ...

  6. 第6节:Java基础 - 三大集合(上)

    第6节:Java基础 - 三大集合(上) 本小节是Java基础篇章的第四小节,主要介绍Java中的常用集合知识点,涉及到的内容包括Java中的三大集合的引出,以及HashMap,Hashtable和C ...

  7. 备战金三银四!一线互联网公司java岗面试题整理:Java基础+多线程+集合+JVM合集!

    前言 回首来看2020年,真的是印象中过的最快的一年了,真的是时间过的飞快,还没反应过来年就夸完了,相信大家也已经开始上班了!俗话说新年新气象,马上就要到了一年之中最重要的金三银四,之前一直有粉丝要求 ...

  8. java基础技术集合面试【笔记】

    java基础技术集合面试[笔记] Hashmap: 基于哈希表的 Map 接口的实现,此实现提供所有可选的映射操作,并允许使用 null 值和 null 键(除了不同步和允许使用 null 之外,Ha ...

  9. java基础(18):集合、Iterator迭代器、增强for循环、泛型

    1. 集合 1.1 集合介绍 集合,集合是java中提供的一种容器,可以用来存储多个数据. 在前面的学习中,我们知道数据多了,可以使用数组存放或者使用ArrayList集合进行存放数据.那么,集合和数 ...

  10. Java基础--说集合框架

    版权所有,转载注明出处. 1,Java中,集合是什么?为什么会出现? 根据数学的定义,集合是一个元素或多个元素的构成,即集合一个装有元素的容器. Java中已经有数组这一装有元素的容器,为什么还要新建 ...

随机推荐

  1. 问题:程序编译通过,但是执行时报错:coredump

    问题描述: 在一个客户现场搭建环境时,遇到了一个棘手的问题,C代码编译通过后,无法正常运行,启动会出现“coredump”错误. 运行环境为新搭建的AIX6.1,数据库为Oracle11.2.0.2. ...

  2. 生产环境项目问题记录系列(二):Docker打包镜像Nuget包因权限问题还原失败

    docker打包镜像遇到一个因为nuget权限验证问题导致镜像打包失败的问题,公司Nuget包用的是tfs管理的,tfs有权限验证,结果导致nuget还原失败,原有的NuGet.config文件如下: ...

  3. more,less,head,tail

    当用cat,tac命令查看文件时,文件的所有内容都会被刷出来,因为缓存有限,被刷过去的内容可能就留不住了.用cat查看个小文件还可以,查看大文件时就用到下面的命令. more (选项)(参数)    ...

  4. 跨域及JSONP原理

    什么是跨域:a.com 域名下的js无法操作b.com或是c.a.com域名下的对象 为什么浏览器要引入跨域问题? 跨域问题来源于浏览器的同源策略,为啥要有这个策略呢? 为了安全.假设现在有a.com ...

  5. asp.net core 3.0 更新简记

    asp.net core 3.0 更新简记 asp.net core 3.0 更新简记 Intro 最近把活动室预约项目从 asp.net core 2.2 更新到了 asp.net core 3.0 ...

  6. spring-boot-devtools 热部署

    一.简单介绍 spring-boot-devtools是一个为开发者服务的一个模块,其中最重要的功能就是修改代码后自动启动springboot服务,速度比手动停止后再启动要快,节省出来的并不是手工操作 ...

  7. Scala 学习笔记之集合(6)

    object CollectionDemo7 { def main(args: Array[String]): Unit = { //数组使用 val arr = Array("red&qu ...

  8. MongoDB 学习笔记之 $push,$each,$slice组合使用

    $push使用: 使用$push给数组添加2个新成员 db.ArrayTest.updateOne({ "name" : "Bill"},{$push: {&q ...

  9. Python爬虫零基础入门(系列)

    一.前言上一篇演示了如何使用requests模块向网站发送http请求,获取到网页的HTML数据.这篇来演示如何使用BeautifulSoup模块来从HTML文本中提取我们想要的数据. update ...

  10. raspbian修改swap分区为硬盘上的分区

    一直以为raspbian的swap分区和平常装系统时候的swap分区是一样的,最近用u盘插在树莓派上运行后发现这个交换分区和我想象中不一样. 百度后发现它是一个文件挂上去的.直接搞把! pi@rasp ...