Java—集合02

1.Iterator迭代器

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

集合中把这种取元素的方式描述在Iterator接口中。

 常用的方法:

  判断集合中是否有下一个元素可以替代,如果可以替代则返回true:hasNext() / boolean;

  返回迭代的下一个元素并把指针向下移一位:naxt() / E;

  Collection接口描述了一个抽象方法iterator方法,所有Collection子类都实现了这个方法,并且有自己的迭代形式。

  代码演示迭代器:

//1,创建集合对象。

Collection<String> coll = new ArrayList<String>();

coll.add("abc1");

coll.add("abc2");

coll.add("abc3");

coll.add("abc4");

//2.获取容器的迭代器对象。通过iterator方法。

Iterator it = coll.iterator();

//3,使用具体的迭代器对象获取集合中的元素。参阅迭代器的方法

while(it.hasNext()){

System.out.println(it.next());

}

/*

迭代器for循环的形式的使用

for (Iterator it = coll.iterator(); it.hasNext(); ) {

System.out.println(it.next());

}

*/

在进行集合元素取出时,如果集合中已经没有元素了,还继续使用迭代器的next方法,将会发生java.util.NoSuchElementException没有集合元素的错误。

集合元素的向下转型

集合中存储其实都是对象的地址。

存储时提升了Object。取出时要使用元素的特有内容,必须向下转型。

代码演示:

Collection coll = new ArrayList();

coll.add("abc");

coll.add("aabbcc");

coll.add(1);

Iterator it = coll.iterator();

while (it.hasNext()) {

//由于元素被存放进集合后全部被提升为Object类型

//当需要使用子类对象特有方法时,需要向下转型

String str = (String) it.next();

System.out.println(str.length());

}

注意:如果集合中存放的是多个对象,这时进行向下转型会发生类型转换异常。

提示:Iterator接口也可以使用<>来控制迭代元素的类型的。代码演示如下:

Collection<String> coll = new ArrayList<String>();

coll.add("abc");

coll.add("aabbcc");

coll.add("cat");

Iterator<String> it = coll.iterator();

while (it.hasNext()) {

String str = it.next();

//当使用Iterator<String>控制元素类型后,就不需要强转了。获取到的元素直接就是String类型

System.out.println(str.length());

}

2.增强for循环

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

格式为:

for(元素的数据类型 变量 : Collection集合or数组){

}

代码演示:

它用于遍历Collection和数组。通常只进行遍历元素,不要在遍历的过程中对集合元素进行增删操作。

练习一:遍历数组int[] arr = new int[]{11,22,33};

for (int n : arr) {//变量n代表被遍历到的数组元素

System.out.println(n);

}

练习二:遍历集合

Collection<String> coll = new ArrayList<String>();

coll.add("a1");

coll.add("a2");

coll.add("a3");

coll.add("a4");

for(String str : coll){//变量Str代表被遍历到的集合元素

System.out.println(str);

}

与普通for循环的区别:

新for循环必须有被遍历的目标。目标只能是Collection或者是数组。

遍历数组时,如果仅为遍历,可以使用增强for如果要对数组的元素进行 操作,使用老式for循环可以通过角标操作。

3.泛型

由于集合中什么类型的元素都可以存储。导致取出时,如果出现强转就会引发运行时 ClassCastException。怎么来解决这个问题呢?使用集合时,必须明确集合中元素的类型。这种方式称为:泛型。

我们在集合中会大量使用到泛型,这里来完整地学习泛型知识。

泛型,用来灵活地将数据类型应用到不同的类、方法、接口当中。将数据类型作为参数进行传递。

定义格式:

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

代码演示:

API中的ArrayList集合:

class ArrayList<E>{

public boolean add(E e){ }

public E get(int index){ }

}

使用格式:创建对象时,确定泛型的类型

例如,ArrayList<String> list = new ArrayList<String>();

此时,变量E的值就是String类型

class ArrayList<String>{

public boolean add(String e){ }

public String get(int index){ }

}

例如,ArrayList<Integer> list = new ArrayList<Integer>();

此时,变量E的值就是Integer类型

class ArrayList<Integer>{

public boolean add(Integer e){ }

public Integer get(int index){ }

}

泛型接口定义格式:

       修饰符 interface接口名<代表泛型的变量> { }

代码演示:

API中的Iterator迭代器接口

public interface Iterator<E> {

public abstract E next();

}

使用格式:

1、定义类时确定泛型的类型

例如

public final class Scanner implements Iterator<String> {

public String next(){

}

}

泛型通配符

  泛型是在限定数据类型,当在集合或者其他地方使用到泛型后,那么这时一旦明确泛型的数据类型,那么在使用的时候只能给其传递和数据类型匹配的类型,否则就会报错。

定义方法时,根本无法确定具体集合中的元素类型是什么。为了解决这个"无法确定具体集合中的元素类型"问题,java中,为我们提供了泛型的通配符<?>。

代码演示:

public static void printCollection(Collection<?> list) {

Iterator<?> it = list.iterator();

while (it.hasNext()) {

System.out.println(it.next());

}

}

实现了可迭代任意元素类型集合的方法

使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。

泛型限定

如果想要对被打印的集合中的元素类型进行限制,只在指定的一些类型,进行打印。怎么做呢?

要解决这个问题,我们就要学习泛型的限定。

限定泛型的上限:

格式:? extends E

? 代表接收E类型或者E的子类型的元素

例如,泛型限定为:? extends Person

则 ? 代表接收Person类型或者Person子类型的元素

限定泛型的下限:

格式:? super E

? 代表接收E类型或者E的父类型的元素

例如,泛型限定为:? super Student

则 ? 代表接收Student类型或者Student父类型的元素

代码演示:

public static void printCollection(Collection<? extends Person> list) {

Iterator<? extends Person> it = list.iterator();

while (it.hasNext()) {

System.out.println(it.next());

}

}

原文地址:https://www.cnblogs.com/sunlangui/p/11510968.html

时间: 2024-08-02 03:38:16

Java—集合02的相关文章

Java集合02

1. Set集合 (1) Set集合的特点 无序,唯一 (2) HashSet集合 A:底层数据结构是哈希表(是一个元素为链表的数组) B:哈希表底层依赖两个方法:hashCode()和equals() 执行顺序: 首先比较哈希值是否相同 相同:继续执行equals()方法 返回true:元素重复了,不添加 返回false:直接把元素添加到集合 不同:就直接把元素添加到集合 C:如何保证元素唯一性的呢? 由hashCode()和equals()保证的 D:开发的时候,代码非常的简单,自动生成即可

Java 集合系列 02 Collection架构

java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例 首先,我们对Collection进行说明.下面先看看Collection的一些框架类的关系图: Collection是一个接口,它主要的两个分支是:List 和 Set. List和Set都是接口,它们继承于Collection.L

Java多线程系列--“JUC集合”02之 CopyOnWriteArrayList

概要 本章是"JUC系列"的CopyOnWriteArrayList篇.接下来,会先对CopyOnWriteArrayList进行基本介绍,然后再说明它的原理,接着通过代码去分析,最后通过示例更进一步的了解CopyOnWriteArrayList.内容包括:CopyOnWriteArrayList介绍CopyOnWriteArrayList原理和数据结构CopyOnWriteArrayList函数列表CopyOnWriteArrayList源码分析(JDK1.7.0_40版本)Copy

20180826(02)-Java集合框架

Java 集合框架 早在Java 2中之前,Java就提供了特设类.比如:Dictionary, Vector, Stack, 和Properties这些类用来存储和操作对象组. 虽然这些类都非常有用,但是它们缺少一个核心的,统一的主题.由于这个原因,使用Vector类的方式和使用Properties类的方式有着很大不同. 集合框架被设计成要满足以下几个目标. 1.该框架必须是高性能的.基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的. 2.该框架允许不同类型的集合,以类似的方式工作,

【Java集合源码剖析】HashMap源码剖析

转载请注明出处:http://blog.csdn.net/ns_code/article/details/36034955 HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长. HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap. HashMap 实现了Serializable接口,因此它支持序列化,

java集合之整体架构

Java集合框架总结 Java集合是java 提供的工具包,包含了常用的数据结构:集合.链表.队列.栈.数组.映射等.Java集合工具包位置是java.util.* Java集合主要可以划分为4个部分:List列表.Set集合.Map映射.工具类(Iterator迭代器.Enumeration枚举类.Arrays和Collections). Java集合工具包框架图(如下): 大致说明: 看上面的框架图,先抓住它的主干,即Collection和Map. 1. Collection是一个接口,是高

java集合18--Iterator和Enumeration比较

概要 这一章,我们对Iterator和Enumeration进行比较学习.内容包括: 第1部分 Iterator和Enumeration区别 第2部分 Iterator和Enumeration实例 转载请注明出处:http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid=3311275 第1部分 Iterator和Enumeration区别 在Java集合中,我们通常都通过 "Iterator(迭代器)" 或 &qu

Java集合源码学习笔记(三)LinkedList分析

前面学习了ArrayList的源码,数组是顺序存储结构,存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O(1),数组的特点是寻址容易,插入和删除困难.今天学习另外的一种常用数据结构LinkedList的实现,LinkedList使用链表作为存储结构,链表是线性存储结构,在内存上不是连续的一段空间,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N),链表的特点是寻址困难,插入和删除容易.所有的代码都基于JDK 1.6. >>关于LinkedLis

Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例

java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例 概要  和学习ArrayList一样,接下来呢,我们先对LinkedList有个整体认识,然后再学习它的源码:最后再通过实例来学会使用LinkedList.内容包括:第1部分 LinkedList介绍第2部分 LinkedList数