集合

学习集合的目标:

  1. 会使用集合存储数据
  2. 会遍历集合,把数据取出来
  3. 握每种集合的特性

集合和数组的区别

  1. 数组的长度是固定的。集合的长度是可变的。
  2. 数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致,在开发中一般当对象多的时候使用集合进行存储。

集合框架

JAVASE提供了满足各种需求的API,在使用这些API前,先了解其继承与接口操作架构,才能了解何时采用哪个类,以及类之间如何彼此合作,从而达到灵活应用。

集合按照其存储结构可以分为两,分别是单列集合 java.util.Collection双列集合java.util.Map,

Collection

Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素。

它有两个重要的子接口,分别是java.util.List和java.util.Set。

其中,

  • List的特点是元素有序、元素可重复。
  • Set的特点是元素无序,而且不可重复。

List接口的主要实现类有:

java.util.ArrayList
java.util.LinkedList

Set接口的主要实现类有:

java.util.HashSet
java.util.TreeSet

如图所示:

Collection常用功能

Collection是所有单列集合的父接口,因此在Collection中定义了单列集合(List和Set)通用的一些方法,这些方法可用于操作所有的单列集合。

方法如下:

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

迭代器

java.util.Iterator接口:迭代器(对集合进行遍历)

有两个常用的方法

  • boolean hasNext() 如果仍有元素可以迭代,则返回 true。

判断集合中还有没有下一个元素,有就返回true,没有就返回false。

  • E next() 返回迭代的下一个元素

取出集合中的下一个元素

Iterator迭代器,是一个接口,我们无法直接使用,需要使用Iterator接口的实现类对象,获取实现类的方式比较特殊

Collection接口中有一个方法,叫iterator(),这个方法返回的就是迭代器的实现类对象

  • Iterator<E> interator() 返回在此 collection的元素上进行迭代的迭代器。

迭代器的使用步骤(重点):

  1. 使用集合中的方法iterator()获取迭代器的实现类对象使用Iterator接口Iterator接口接受(多态)
  2. 使用Iterator接口中的方法hasNext判断还没有没有下一个元素
  3. 使用Iterator接口中的方法next取出集合中的下一个元素
//创建一个集合对象
Collection<String> coll = new ArrayList();
//向集合中添加元素
coll.add("cai");
coll.add("niao");
/*
1.使用集合中的方法iterator()获取迭代器的实现类对象,使用Iterator接口Iterator接口接收(多态) 注意:
Iterator<E>接口也是有泛型的,迭代器的泛型跟着集合走,集合是什么泛型,迭代器就是什么泛型 */
//多态 接口 实现类对象
Iterator<String> it = cool.interator
while(it.hasNext()){//判断集合有没有下一个元素,从-1开始
String e = it.next();//取出下一个元素并把指针后移一位
System.out.println(e);
}

增强for循环

增强for循环:底层使用的也是迭代器,使用for循环的格式,简化了迭代器的书写
是JDK1.5之后出现的新特性

  • Collection<E> extends Iterator<E>:所有的单列集合都可以使用增强for
  • public interface Iterable<T> 实现这个接口允许对象成为“foreach”语句目标。

增强for循环:用来遍历集合和数组

格式

for (集合/数组的数据类型 变量名 : 集合名/数组名){
  System.out.println(变量名);
}

泛型

泛型:是一种未知的数据类型,当我们不知道使用什么数据类型的时候,可以使用泛型

泛型也可以看出是一个变量,用来接受数据类型

  • E e : Element 元素
  • T t : Type 类型

ArrayList集合在定义的时候,不知道集合中都会存储什么类型的数据,所以类型使用泛型

  • E:未知的数据类型
public class ArrayList<E>{
public boolean add(E e){}
public E get(int index){}
} public class ArrayList<String>{
public boolean add(String e){}//会把数据类型作为参数传递,把String赋值给泛型
public String get(int index){}
}

创建集合对象,使用泛型
好处:

  1. 避免了类型转换的麻烦,存储的是什么类型,取出的就是什么类型
  2. 把运行期异常(代码运行之后会抛出的异常),提升到了编译期(写代码的时候会报错)

弊端:

  1. 泛型是什么类型,只能存储什么类型的数据

创建集合对象,不使用泛型
好处:

  1. 集合不使用泛型,默认的类型就是Object类型,可以存储任意类型的数据

弊端:

  1. 不安全,会引发异常

定义和使用泛型的类

定义含有泛型的方法:泛型定义在方法的修饰符和返回值类型之间

格式:

修饰符 <泛型> 返回值类型 方法名(参数列表(使用泛型)){
  方法体;
}

含有泛型的方法,在调用方法的时候确定泛型的数据类型
传递什么类型的参数,泛型就是什么类型

含有泛型的接口,第一种使用方式:定义接口的实现类,实现接口,指定接口的泛型

public interface Iterator<E>{
E next();
}

Scanner类实现了Iterator接口,并指定接口的泛型为String,所以重写的next方法泛型默认就是String

public final class Scanner implements Iterator<String>{
  publc String next(){}
}

含有泛型的接口第二种使用方式:接口使用什么泛型,实现类就使用什么泛型,类跟着接口走

就相当于定义一个含有泛型的类,创建对象的时候确定泛型的类型

public interface List<E>{
boolean add(E e);
E get (int index);
} public class ArrayList<E> implements List<E>{
public boolean add(E e){}
public E get(int index){}
}

泛型的通配符

泛型的通配符:

  • ?:代表任意的数据类型

使用方式:

  • 不能创建对象使用
  • 只能作为方法的参数使用

泛型的上限限定:? extends E 代表使用的泛型只能是E类型的子类/本身
泛型的下限限定:? super E 代表使用的泛型只能是E类型的父类/本身

//泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类
public static void getElement1(Collection<? extends Number> coll){}
//泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类
public static void getElement2(Collection<? super Number> coll){}

斗地主案例的代码实现(单列)

import java.util.ArrayList;
import java.util.Collection; /*
斗地主综合案例:
1.准备牌
2.洗牌
3.发配
4.看牌
*/ public class CaiNiao{
public static void main(String[] args){
//1.准备牌
//定义一个存储54张牌的ArrayList集合,泛型使用String
ArrayList<String> poker = new ArrayList<>();
//定义两个数组,一个数组存储牌的花色,一个数组存储牌的序号
String[] colors = {"♥","♦","♣","

集合单列--Colletion的更多相关文章

  1. Vector集合——单列集合的“祖宗”类

    是实现可增长的对象数组:所以底层也是数组: 与collection集合不同的是,vector是同步的,意味着是单线程的,意味着效率低,速度慢, 所以在jdk1.2版本之后被ArrayList集合所取代 ...

  2. 编程基础系列--之--浅谈List、Set、Map和泛型(一)——单列集合

    之前在学习Java时对于泛型,集合的理解一直模模糊糊,随着时间的推移,对泛型和集合有了一些浅显的认知,打算写出来巩固一下,也希望各位大佬能指出理解不当之处,万分感谢!!! 在Java语言中,集合分为两 ...

  3. 深入C#编程

    1.NET框架 1.1.NET框架结构 VB.NET C# F# lronruby others.... .NET FrameWork(FCL) 公共语言进行时(CLR) 操作系统 .NET框架具有两 ...

  4. S2 第二本书 深入.NET平台和C#编程 总结 by天命

    第一章 深入.NET框架 .NET框架 包含 CLR公共语言运行时 FCL框架类库 CLR(Common Language Runtime)公共语言运行时 CLS(Common Language Sp ...

  5. 一个.net的程序员如何转到java的?

    先说明,大佬请忽略我这篇文章, 我是一个做了5年的纯种C#开发人,  我在此仅记录一下我转java的过程.都知道, java是开源的,所以它的开发工具贼多,不像.net, 直接地表最强的IDE. 像现 ...

  6. fastJson在java后台转换json格式数据探究(二)--处理数组/List/Map

    作者:buster2014 推荐:长安散人 fastJson在java后台转换json格式数据探究(二)--处理数组/List/Map JSON字符串与Java对象的转换 1.将Java对象或Java ...

  7. Java 复习整理day07

    package com.it.demo05_innerclass; /* 案例: 演示内部类入门. 概述: 所谓的内部类指的是类里边还有一个类, 里边那个类叫: 内部类, 外边那个类, 叫外部类. 分 ...

  8. 30.Stream流

    5.Stream流 5.1体验Stream流[理解] 案例需求 按照下面的要求完成集合的创建和遍历 创建一个集合,存储多个字符串元素 把集合中所有以"张"开头的元素存储到一个新的集 ...

  9. C#之单列双列集合绑定数据

    ---恢复内容开始--- 1.单列集合绑定方式 davList.DataSource=new BindingList<类型名>(集合名); 2.双列集合绑定方式 BindingSource ...

随机推荐

  1. 利用 FluentScheduler 启动定时器计划任务

    FluentScheduler 是什么? Automated job scheduler with fluent interface. 这是作者在 Github 上的介绍,就是一个定时任务管理器.在 ...

  2. c语言基础之getopt()

    getopt() #include <unistd.h> int getopt(int argc, char * const argv[], const char *optstring); ...

  3. 201871010101-陈来弟《面向对象程序设计(java)》第二周学习总结

    201871010101-陈来弟<面向对象程序设计(java)>第二周学习总结 项目 内容 这个作业属于哪个课程 <任课教师博客主页链接>https://www.cnblogs ...

  4. Python学习笔记8 pip换源

    换pip源 安装好 python 后,有一个问题就是 pip 安装的默认下载地址在国外.要换一下,不然蜗牛速度,怎么追赶世界?(瞎扯一下,活跃气氛~) Ubuntu下,进入终端(ctrl + alt ...

  5. scapy构造数据包

    一.进入scapy交互界面 在终端下输入:scapy ,进入交互界面: 二.查看scapy已经实现的网络协议 ls() 列出scapy中已实现的网络协议 ls(协议类型) 查看某个协议头部字段格式 l ...

  6. DataOps Reading Notes

    质量.效率.成本.安全,是运维工作核心四要素. AIOps 技术会涉及到数据收集方面的基础监控,服务监控和业务监控,甚至会涉及到与持续交付流水线的数据和状态整合(比如在软件发布的阶段会自动关闭某些监控 ...

  7. MySQL基于 amoeba.xml的读写分离

    1.准备两台服务器  centos7 192.168.52.35 192.168.52.36 2.关闭防火墙 [root@localhost ~]# systemctl stop firewalld ...

  8. Layui 必填验证

    lay-verify="required"

  9. Redis有哪些数据结构

    String 这应该是应用最广泛的了,简单的 key-value 类型.value 不仅可以是 String,也可以是数字.还可以享受 Redis 的定时持久化(可以选择 RDB 模式或者 AOF 模 ...

  10. UDF——输出网格节点坐标

    需要在VS当中进行编译,具体内容可参看前面 <在Visual Studio中直接编译Fluent的UDF的总结(串行)> <在Visual Studio中直接编译Fluent的UDF ...