前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第四阶段-Java集合框架:【第一章 集合框架概述和集合的遍历】

第四阶段-Java集合框架:【第一章 集合框架概述和集合的遍历】

作者头像
BWH_Steven
发布2019-08-09 15:48:42
4070
发布2019-08-09 15:48:42
举报
文章被收录于专栏:理想二旬不止理想二旬不止

集合框架概述和集合的遍历

(一) 集合框架的概述

(1) 集合的由来

如果一个程序只包含固定数量的且其生命周期都是已知的对象,那么这是一个非常简单的程序。 通常,程序总是根据运行时才知道的某些条件去创建新对象。在此之前,不会知道你所需要对象的数量,甚至不知道确切的类型。为了解决这个普遍的编程问题,需要在任意时刻和任意位置创建任意数量的对象。所以,就不能依靠创建命名的引用来持有每一个对象,因为你不知道实际上会需要多少这样的引用 ——Thinking in Java

我们来简单的解释一下:

首先要知道我们所学习的Java语言是一个完全面向对象的语言,而这种语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,我们就必须把这多个对象进行存储

一个基本类型的变量显然是无法满足存储多个对象的,所以应该是一个容器类型的变量,通过前面的知识,我们知道数组和StringBuffe、StringBuilder均属于容器类型。但是呢? StringBuffer的结果是一个字符串,不一定满足我们的要求,所以我们只能选择数组,这就是对象数组。

可是问题又来了,对象数组又不能适应变化的需求,因为数组的长度是固定的,这个时候,为了适应变化的需求,Java就提供了集合类供我们使用。

(2) 数组和集合的区别?

A:长度区别

数组的长度固定

集合长度可变

B:内容不同

数组存储的是同一种类型的元素

而集合可以存储不同类型的元素

C:元素的数据类型问题

数组可以存储基本数据类型,也可以存储引用数据类型

集合只能存储引用类型(装对象)

虽然数组看起来有一丝不太灵活,但数组也确实是保存一组对象的有效方法,如果想要保存一组基本数据类型,我们也推荐使用这种方法,只是由于其长度固定,导致它在很多时候也受到一些限制。

补充:

在Java中,数组是一种效率最高的存储和随机访问对象的引用序列的方式。数组就是一个简单的线性序列,这使得元素访问非常快速。但是为这种速度所付出的代价是数组对象的大小被固定,并且在其生命周期中不可改变。你可能会建议使用ArrayList,它可以通过创建一个新实例,然后把旧实例中所有的引用到移到新实例中,从而实现更多空间的自动分配。尽管通常应该首选ArrayList而不是数组、但是这种弹性需要开销,因此,ArrayList的效率比数组低很多。 ——Thinking in Java 第16章

(3) 集合框架关系,以及Collection 类简介

Java提供了很多种集合类,他们的数据结构是不同的,但是,它们肯定有一些共性的地方 (存储,获取,判断)一直向上追溯,我们可以的得到这样继承体系

Collection : 是集合的顶层接口,它的子体系有重复的,有唯一的,有有序的,有无序的。

代码语言:javascript
复制
Collection c = new Collection(); //这是错误的 接口不能实例化

Collection的功能概述:

1:添加功能

代码语言:javascript
复制
//添加一个元素
Boolean add(Object obj)

//添加一个集合的元素
Boolean addAll(Collection c)

2:删除功能

代码语言:javascript
复制
//移除所有元素  
void clear()

//移除一个元素
boolean remove(Object o)

//移除一个集合的元素(有一个移除就返回true)
Boolean removeAll(Collection c)

3:判断功能

代码语言:javascript
复制
//判断集合中是否包含指定的元素
Boolean contains(Object o)

//判断集合中是否包含指定的集合元素(包含所有)
Boolean containsAll(Collection c)

//判断集合是否为空
Boolean isEmpty()

4:获取功能(重点)

代码语言:javascript
复制
 Iterator<E> iterator()    

5:长度功能

代码语言:javascript
复制
int size()

面试题:数组有没有length()方法呢?字符串有没有length()方法呢?集合有没有length()方法呢?

代码语言:javascript
复制
数组求长度用length属性

字符串求长度用length()方法

集合求长度用size()方法

6:交集功能

代码语言:javascript
复制
//两个集合A B ,A对B交集,最终的结果保存在A    中,B不变。返回值表示的是A是否发生过改变
boolean retainAll(Collection c)

7:把集合转换为数组

代码语言:javascript
复制
Object[] toArray()

(二) 集合的遍历

(1) 集合转数组遍历
代码语言:javascript
复制
import java.util.ArrayList;
import java.util.Collection;

public class Demo {
    public static void main(String[] args) {
        Collection c = new ArrayList();
        c.add("I");
        c.add("love");
        c.add("you");
        c.add("!");

        Object[] objs = c.toArray();
        for (int x = 0; x < objs.length; x++) {
            //System.out.println(objs[x]);
            //得到的元素是字符串,我在获取到元素的同时,如果还想知道元素的长度
            //System.out.println(objs[x] + "---" + objs[x].length());
            //上述代码实现不了是因为,Object中没有length()方法
            //我们想要使用字符串的方法,就必须把元素还原成字符串
            //向下转型
            String s = (String) objs[x];
            System.out.println(s + "---" + s.length());
        }
    }
}
代码语言:javascript
复制
/*
 *    Collection存储自定义对象并遍历案例
 */

import java.util.ArrayList;
import java.util.Collection;

public class StudentDemo {
    public static void main(String[] args) {
        //创建集合对象
        Collection c = new ArrayList();

        //创建学生对象
        Student s1 = new Student("admin", 10);
        Student s2 = new Student("张三", 20);
        Student s3 = new Student("李四", 30);
        Student s4 = new Student("王五", 40);

        //把学生添加到集合
        c.add(s1);
        c.add(s2);
        c.add(s3);
        c.add(s4);

        //把集合转化为数组
        Object[] objs = c.toArray();
        //遍历数组
        for (int x = 0; x < objs.length; x++) {
            //System.out.println(objs[x]);
            //得到的元素是字符串,我在获取到元素的同时,如果还想知道元素的长度
            //System.out.println(objs[x] + "---" + objs[x].length());
            //上述代码实现不了是因为,Object中没有length()方法
            //我们想要使用字符串的方法,就必须把元素还原成字符串
            //向下转型
            Student s = (Student) objs[x];
            System.out.println(s.getName() + "-" + s.getAge());
        }

    }
}
(2) 集合迭代器遍历
代码语言:javascript
复制
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/*
 *  Iterator iterator() 迭代器,集合的专用遍历方式
 *  Object next():获取元素
 *  oolean hasNext():如果仍有元素可以迭代,则返回 true。
 */
public class IteratorDemo {
    public static void main(String[] args) {
        //创建集合对象
        Collection c = new ArrayList();
        c.add("I");
        c.add("love");
        c.add("you");
        c.add("!");

        //实际返回的肯定是子类对象,这里是多态
        Iterator it = c.iterator();

        while (it.hasNext()) {
            String s = (String) it.next();
            System.out.println(s);
        }
    }
}

//运行结果
I
love
you
!
集合的使用步骤:
  1. 创建集合元素
  2. 创建元素对象
  3. 把元素添加到集合
  4. 遍历集合 (1) 通过集合对象获取迭代器对象 —— Iterator it = c.iterator(); (2) 通过迭代器对象的hasNext()方法判断是否有元素 ——while 通过迭代器对象的next()方法获取元素并且移动到下一个位置

迭代器为什么不定义成一个类,而是一个接口?

假设迭代器定义的是一个类,这样我们就可以创建该类的对象,调用该类的方法来实现集合的遍历。但是呢?我们想想,Java中提供了很多的集合类,而这些集合类的数据结构是不同的,所以存储的方式和遍历的方式应该是不同的。进而它们的遍历方式也应该是不同的,最终就没有定义迭代器类。

而无论你是哪种集合,你都应该具备获取元素的操作,并且,最好再辅助于判断功能,这样在获取前,先判断,这样就更不容易出错。也就是说,判断功能和获取功能应该是一个集合遍历所具备的,而每种集合的方式又不太一样,所以我们把这两个功能给提取出来,并不提供具体实现,这种方式就是接口。

那么,真正的具体实现类在哪里呢?

在真正的具体的子类中,以内部类的方式体现。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 理想二旬不止 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 集合框架概述和集合的遍历
    • (一) 集合框架的概述
      • (1) 集合的由来
      • (2) 数组和集合的区别?
      • (3) 集合框架关系,以及Collection 类简介
    • (二) 集合的遍历
      • (1) 集合转数组遍历
      • (2) 集合迭代器遍历
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档