• Java中集合概念


    集合的由来:
    我们学习的是面向对象语言,而面向对象语言对事物的描述是通过对象体现的,为了
    方便对多个对象进行操作,我们就必须把这多个对象进行储存,而想要储存多个对象,就
    不能是一个基本的变量,而应该是一个容器类型的变量,在我们目前所学过的知识里面,
    有哪些是容器类型的呢? 数组和StringBuffer。但是,StringBuffer的结果是一个字符串
    不一定满足我们的需求,所以我们只能选择数组,这就是对象数组。而对象数组又不能适应
    变化的需求,因为数组的长度是固定的,这个时候,为了适应变化的需求,Java就提供了集
    合类供我们使用。

    数组和集合的区别:
    A:长度区别
    数组的长度固定
    集合长度可变
    B:内容不同
    数组存储的是同一种类型的元素
    而集合可以存储不同类型的元素
    C:元素的数据类型问题:
    数组可以存储基本数据类型,也可以存储引用类型
    集合只能存储引用类型

    集合是存储多个元素的,但是,存储多个元素我们也是有不同需求的:比如说,我要这多个元素
    中不能有相同的元素,再比如说,我要这多个元素按照某种规则排序一下针对不同的需求,Java
    就提供了不同的集合类,这样,Java就提供了很多个集合类,这多个集合类的数据结构不同。结
    构不同不重要,重要的是你要能够储存东西,并且还要能够使用这些东西,比如说判断,获取等。
    既然这样,那么,这多个集合类是有共性的内容的,我们把这些集合类的共性内容不断的向上提取,
    最终就能形成集合的继承体系结构。

    数据结构:数据的储存方式。

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

    Collection的功能概述:
    1:添加功能
    boolean add(Object obj):添加一个元素
    boolean addAll(Collection c):添加一个集合的元素
    2:删除功能
    void clear():移除所有元素
    boolean remove(Object o):移除一个元素
    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()方法. //所以数组没有length()方法,字符串有length()方法,集合没有length()方法!
    6:交集功能
    boolean retainAll(Collection c):用于从列表中移除未包含在指定collection中的所有元素
    7:把集合转换为数组
    Object[] toArray()

    Collection接口的概述
    Collection层次结构中的根接口。Collection表示一组对象,这些对象也称为collection的元素。一些collection允许有重复的元素,而另一些则
    不允许。一些collection是有序的,而另一些则是无序的。

    /**集合框架:Collection集合的基本功能测试:*/
    public static void main(String[] args){
    //测试不带All的方法

    //创建集合对象
    //Collection c = new Collection(); //错误,因为接口不能实例化
    Collection c = new ArrayList();

    1 //boolean add(Object obj):添加一个元素
    System.out.println("c:"+c);//c:[]
    System.out.println("add"+c.add("hello"));//c:[hello] /*这里说明一下:看到c.add是通过对象c调用的add方法,那是通过c调用ArrayList里面的方法*/
    c.add("hello");
    c.add("world");
    c.add("java");
    System.out.println("c:"+c);//c:[hello,world,java]

    2 //void clear():移除所有元素
    c.clear();
    System.out.println("c:"+c);//c:[]

    2 //boolean remove(Object o):移除一个元素
    System.out.println("remove:"+c.remove("hello"));//remove:true
    System.out.println("c:"+c);//c:[world,java] //这里的输出表示 使用remove方法删除一个元素后,原来地址的值也会被删除
    System.out.println("remove:"+c.remove("javase"));//remove:false //因为原来值里面没有javase 所以false

    3 //boolean contains(Object o):判断集合中是否包含指定的元素
    System.out.println("contains:"+c.contains("hello"));//contains:true //表示包含指定元素,如果没有,返回false

    3 //boolean isEmpty():判断集合是否为空
    System.out.println("isEmpty:"+c.isEmpty());//isEmpty:false 因为有值 所以返回false 没有值:就是true

    5 //int size():元素的个数
    Systme.out.println("size:"+c.seze());size:3
    }

    /**集合框架:Collection集合的高级功能测试:*/

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

    //boolean removeAll(Collection c):移除一个集合的元素

    //boolean containsAll(Collection c):判断集合中是否包含指定的集合元素(全部元素)

    //boolean retainAll(Collection c):用于从列表中移除未包含在指定collection中的所有元素


    public static void main(String[] args){
    //创建集合1
    Collection c1 = new ArrayList();
    c1.add("abc1");
    c1.add("abc2");
    c1.add("abc3");
    c1.add("abc4");
    System.out.println(c1);//[abc1, abc2, abc3, abc4]

    //创建集合2
    Collection c2 = new ArrayList();
    c2.add("abc5");
    c2.add("abc6");
    c2.add("abc7");
    System.out.println(c2);//[abc5, abc6, abc7]

    1.//boolean addAll(Collection c):添加一个集合的元素
    System.out.println("addAll:"+c1.addAll(c2));addAll:true
    System.out.println(c1);//[abc1, abc2, abc3, abc4, abc5, abc6, abc7]
    //此时:如果c2.add("abc4"); 就是在c2对象增加abc4这个字符串 在使用这个方法,则会输出[abc1, abc2, abc3, abc4, abc4, abc5, abc6, abc7] //表示使用这个方法可以添加重复对象元素

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    2.//boolean removeAll(Collection c):移除一个集合的元素
    //那么移除一个元素是true还是多个呢? 一个
    //只要有一个元素被移除了,就返回true

    //创建集合1
    Collection c1 = new ArrayList();
    c1.add("abc1");
    c1.add("abc2");
    c1.add("abc3");
    c1.add("abc4");

    //创建集合2
    Collection c2 = new ArrayList();
    c2.add("abc4");
    c2.add("abc5");
    c2.add("abc6");
    c2.add("abc7");

    System.out.println("removeAll:"+c1.removeAll(c2));//removeAll:true
    System.out.println(c1);//[abc1, abc2, abc3] //移除了abc4,返回true 只要c1里面有的 c2也有就会删除,删除共同存在的

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    3.//boolean containsAll(Collection c):判断集合中是否包含指定的集合元素
    //只有包含所有的元素才叫包含

    //创建集合1
    Collection c1 = new ArrayList();
    c1.add("abc1");
    c1.add("abc2");
    c1.add("abc3");
    c1.add("abc4");

    //创建集合2
    Collection c2 = new ArrayList();
    c2.add("abc4");
    c2.add("abc5");
    c2.add("abc6");
    c2.add("abc7");
    System.out.println("containsAll:"+c1.containsAll(c2));//containsAll:false

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    4.//boolean retainAll(Collection c):用于从列表中移除未包含在指定collection中的所有元素
    //两个集合都有的元素?思考元素去哪了,返回的boolean有是什么意思
    //假设有两个集合A,B。A对B做交集,最终的结果保存在A中,B不变。返回值表示的是A是否发生过改变。

    //创建集合1
    Collection c1 = new ArrayList();
    c1.add("abc1");
    c1.add("abc2");
    c1.add("abc3");
    c1.add("abc4");

    //创建集合2
    Collection c2 = new ArrayList();
    c2.add("abc4");
    c2.add("abc5");
    c2.add("abc6");
    c2.add("abc7");
    System.out.println("retainAll:"+c1.retainAll(c2));//retainAll:true
    System.out.println("c1");//[abc4] //两个对象的交集最后保存在c1中
    System.out.println("c2");//[abc4, abc5, abc6, abc7]
    }


    ================================================================================================================================================================================================

    7. //Object[] toArray()


    集合的遍历。其实就是依次获取集合中的每一个元素。
    Object[] toArray():把集合转成数组,可以实现集合的遍历
    public static void main(String[] args){
    //创建集合对象
    Collection c = new ArrayList();

    //添加元素
    c.add("hello");//Object obj = "hello"; 向上转型(这里有一个隐式转换)
    c.add("world");
    c.add("java");

    //遍历
    //Object[] toArray():把集合转成数组,可以实现集合的遍历
    Object[] objs = c.toArray();
    for(int x=0;x<objs.length;x++){
    //System.out.println(objs[x]); //hello world java
    //我知道元素是字符串,我在获取到元素的同时,还想知道元素的长度。
    //System.out.println(objs[x]+"---"+objs[x].length());
    //上面的实现不了,原因是Object中没有length()方法
    //我们要向使用字符串的方法,就必须把元素还原成字符串
    //向下转型
    String s = (String) objs[x];
    System.out.println(s+"---"+s.length());//hello---5
    //world---5
    //java---4
    }

    }

    ================================================================================================================================================================================================

    //Iterator<E> iterator():迭代器:集合的专用遍历方式

    package javatest;

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

    public class A {

    public static void main(String[] args) {
    Collection c = new ArrayList();

    // 创建并添加元素
    c.add("hello");
    c.add("world");
    c.add("java");

    // 迭代器:集合的专用遍历方式
    Iterator it = c.iterator(); // 实际返回的肯定是子类对象,这里是多态

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

    //其实开发中大多数人在这里不写while而是for //for只是效率高但是不太容易看懂
    for (Iterator it = s.iterator(); it.hasNext();) {
    AText z = (AText) it.next();
    System.out.println(z);
    }
    }

    }
    最后输出:hello
    world
    java
    关于迭代器:
    迭代器:是遍历集合的一种方式。
    迭代器是依赖于集合而存在的。
    通过调用集合里的方法使用

    //集合的使用步骤:
    A:创建集合对象
    B:创建元素对象
    C:把元素添加到集合
    D:遍历集合
    a:通过集合对象获取迭代器对象
    b:通过迭代器对象hasNext()方法判断是否有元素
    c:通过迭代器对象的next()方法获取元素并移动到下一个位置
    //思考:迭代器为什么不定义成一个类,而是一个接口?
    假设迭代器定义的是一个类,这样我们就可以创建该类的对象,调用该
    类的方法来实现集合的遍历。但是呢?我们想想,Java中提供了很多的集合
    而这些集合类的数据结构是不同的,所以,储存的方式和遍历的方式应该是
    不同的。进而他们的遍历也应该不是一样的,最终,就没有定义迭代器类。
    无论你是哪种集合,你都应该具备获取元素的操作,并且,最好在辅助
    与判断功能,这样,在获取前,先判断,这样就更不容易出错。也就说,判
    断功能和获取功能应该是一个集合遍历所具备的,而每种集合的方式又不太
    一样,所以我们把这两个功能给提取出来,并不提供具体实现,这种方式就
    是接口。
    那么,真正的具体的实现类在哪里呢?
    在真正的具体的子类,以内部类的方式体现的。
    //这个内部类里面一层套一层

  • 相关阅读:
    [zjoi]青蛙的约会_扩展欧几里德
    [coci2012]覆盖字符串 AC自动机
    出题日志
    [zjoi2003]密码机
    矩阵乘法
    洛谷 P1064 金明的预算方案
    洛谷 P1656 炸铁路
    洛谷 P1049 装箱问题
    最长上升子序列(LIS)与最长公共子序列(LCS)
    求最大公约数与最小公倍数
  • 原文地址:https://www.cnblogs.com/lszbk/p/12318367.html
Copyright © 2020-2023  润新知