zoukankan      html  css  js  c++  java
  • Java集合框架概述和集合的遍历

    第三阶段 JAVA常见对象的学习

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

    (一) 集合框架的概述

    (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 : 是集合的顶层接口,它的子体系有重复的,有唯一的,有有序的,有无序的。

    Collection c = new Collection(); //这是错误的 接口不能实例化
    

    Collection的功能概述:

    1:添加功能

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

    2:删除功能

    //移除所有元素  
    void clear()
    
    //移除一个元素
    boolean remove(Object o)
    
    //移除一个集合的元素(有一个移除就返回true)
    Boolean removeAll(Collection c)
    

    3:判断功能

    //判断集合中是否包含指定的元素
    Boolean contains(Object o)
    
    //判断集合中是否包含指定的集合元素(包含所有)
    Boolean containsAll(Collection c)
    
    //判断集合是否为空
    Boolean isEmpty()
    

    4:获取功能(重点)

     Iterator<E> iterator()	
    

    5:长度功能

    int size()
    

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

    数组求长度用length属性
    
    字符串求长度用length()方法
    
    集合求长度用size()方法
    

    6:交集功能

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

    7:把集合转换为数组

    Object[] toArray()
    

    (二) 集合的遍历

    (1) 集合转数组遍历

    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());
            }
        }
    }
    
    /*
     *	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) 集合迭代器遍历

    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中提供了很多的集合类,而这些集合类的数据结构是不同的,所以存储的方式和遍历的方式应该是不同的。进而它们的遍历方式也应该是不同的,最终就没有定义迭代器类。

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

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

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

    结尾:

    如果内容中有什么不足,或者错误的地方,欢迎大家给我留言提出意见, 蟹蟹大家 !_

    如果能帮到你的话,那就来关注我吧!(系列文章均会在公众号第一时间更新)

    在这里的我们素不相识,却都在为了自己的梦而努力 ❤

    一个坚持推送原创Java技术的公众号:理想二旬不止

    img

  • 相关阅读:
    Building Java Projects with Gradle
    Vert.x简介
    Spring及Spring Boot 国内快速开发框架
    dip vs di vs ioc
    Tools (StExBar vs Cmder)which can switch to command line window on context menu in windows OS
    SSO的定义、原理、组件及应用
    ModSecurity is an open source, cross-platform web application firewall (WAF) module.
    TDD中测试替身学习总结
    Spring事务银行转账示例
    台式机(华硕主板)前面板音频接口(耳机和麦克风)均无声的解决办法
  • 原文地址:https://www.cnblogs.com/ideal-20/p/11065962.html
Copyright © 2011-2022 走看看