集合

学习集合的目标:

  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. nodeJs 报maximum call stack size exceeded js

    先看错误 查了下资料说是什么js堆栈异常,是递归造成的啥的,但我程序里没用到啥递归,整了老半天将collection-repeat换成ng-repeat然后就好啦,具体原因待探讨.

  2. lua 的匹配规则

    匹配规则 .(点): 与任何字符配对 %a: 与任何字母配对 %c: 与任何控制符配对(例如\n) %d: 与任何数字配对 %l: 与任何小写字母配对 %p: 与任何标点(punctuation)配对 ...

  3. centos7利用acme.sh获取Let's Encrypt的永久免费ssl证书并配置网站域名https访问

    acme.sh介绍:https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E github:https://github.com/Neil ...

  4. Redis的两种数据持久化方式比较

    RDB(Redis Database) 本质:基于时间点的快照 优点: 1.RDB格式文件体积小. 2.可以通过脚本执行bgsave(非阻塞)或者save(阻塞)命令自定义时间点进行备份. 3.可以保 ...

  5. 不要让事实妨碍好故事:Facebook精准广告产品与硅谷创业揭秘,4星奇书《混乱的猴子》

        “ 现在,和往常一样,一些有先见之明的学者看到了这一天会再次到来,他们把这次全新的媒体中世纪化过程命名为“第二次口口相传”(Secondary Orality)和“古登堡右括号”(the Gu ...

  6. linux之shell脚本学习(一)

    #!/bin/bash echo 'hello' your_name='longxiong' echo $your_name echo ${your_name} for i in `ls /opt`; ...

  7. django 基础进 COOKIE

    1 cookie session auth cookie概念:针对每一个服务器,保存在客户端浏览器的一个key-value结构数据,可以理解成一个字典结构 cookie语法:              ...

  8. django 权限设置-菜单显示

    问题:在用户登录后,如何只显示出用户权限的菜单呢?需要设置显示菜单权限 1.为了显示菜单,需要在models权限上添加is_menu(手动判断是否是查看)的icon(图标字符串) 在rbac中录入另一 ...

  9. actuator beans不展示

    <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring- ...

  10. hadoop java.nio.channels.ClosedChannelException

    今天在跑一个任务的时候,报错java.nio.channels.ClosedChannelException. INFO mapreduce.Job: Task Id : attempt_152101 ...