黑马程序员--Java集合框架(一)

来源:互联网 发布:淘宝网店开店技巧 编辑:程序博客网 时间:2024/05/17 06:03

——- android培训、java培训、期待与您交流! ———-

集合框架

集合的由来
我们学习的Java是一种面向对象的语言,而在我们使用的过程中,我们的很多操作都是通过对象来实现的,为了方便对多个对象进行操作,我们就要对着多个对象进行存储,存储自然需要容器,那么这个容器是什么呢?Java就给我们提供了集合来供我们使用。

集合和数组的区别

1.长度区别
数组:长度固定
集合:长度可变

2.内容区别
数组:可以是基本类型,也可以是引用类型

3.元素内容
数组:只能存储同一种类型
集合:可以存储不同类型(一般存储的是同一种类型)

集合的继承体系结构

在说集合的详细内容前,我们先来看看集合的继承体系结构
这里写图片描述

Collection
Collection集合是整个继承体系结构的顶层,是所有集合的头儿,它的子体系有重复的,有唯一的,有有序的,有无序的。

Collection方法演示

public class CollectionDemo {    public static void main(String[] args) {        // 测试不带All的方法        // 创建集合对象        // Collection c = new Collection(); //错误,因为接口不能实例化        Collection c = new ArrayList();        // boolean add(Object obj):添加一个元素        // System.out.println("add:"+c.add("hello"));        c.add("hello");        c.add("world");        c.add("java");        // void clear():移除所有元素        // c.clear();        // boolean remove(Object o):移除一个元素        // System.out.println("remove:" + c.remove("hello"));        // System.out.println("remove:" + c.remove("javaee"));        // boolean contains(Object o):判断集合中是否包含指定的元素        // System.out.println("contains:"+c.contains("hello"));        // System.out.println("contains:"+c.contains("android"));        // boolean isEmpty():判断集合是否为空        // System.out.println("isEmpty:"+c.isEmpty());        //int size():元素的个数        System.out.println("size:"+c.size());        System.out.println("c:" + c);    }}

Collection中测试带All的方法

import java.util.ArrayList;import java.util.Collection;/* * boolean addAll(Collection c):添加一个集合的元素 * boolean removeAll(Collection c):移除一个集合的元素(是一个还是所有) * boolean containsAll(Collection c):判断集合中是否包含指定的集合元素(是一个还是所有) * boolean retainAll(Collection c):两个集合都有的元素?思考元素去哪了,返回的boolean又是什么意思呢? */public class CollectionDemo2 {    public static void main(String[] args) {        // 创建集合1        Collection c1 = new ArrayList();        c1.add("abc1");        c1.add("abc2");        c1.add("abc3");        c1.add("abc4");        // 创建集合2        Collection c2 = new ArrayList();        //c2.add("abc1");        //c2.add("abc2");        //c2.add("abc3");        //c2.add("abc4");        c2.add("abc5");        c2.add("abc6");        c2.add("abc7");        // boolean addAll(Collection c):添加一个集合的元素        // System.out.println("addAll:" + c1.addAll(c2));        //boolean removeAll(Collection c):移除一个集合的元素(是一个还是所有)        //只要有一个元素被移除了,就返回true。        //System.out.println("removeAll:"+c1.removeAll(c2));        //boolean containsAll(Collection c):判断集合中是否包含指定的集合元素(是一个还是所有)        //只有包含所有的元素,才叫包含        // System.out.println("containsAll:"+c1.containsAll(c2));        //boolean retainAll(Collection c):两个集合都有的元素?思考元素去哪了,返回的boolean又是什么意思呢?        //假设有两个集合A,B。        //A对B做交集,最终的结果保存在A中,B不变。        //返回值表示的是A是否发生过改变。        System.out.println("retainAll:"+c1.retainAll(c2));        System.out.println("c1:" + c1);        System.out.println("c2:" + c2);    }}

集合的遍历

第一种方式
Object[] toArray():把集合转成数组,可以实现集合的遍历

import java.util.ArrayList;import java.util.Collection;public class CollectionDemo3 {    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]);            // 我知道元素是字符串,我在获取到元素的的同时,还想知道元素的长度。            // System.out.println(objs[x] + "---" + objs[x].length());            // 上面的实现不了,原因是Object中没有length()方法            // 我们要想使用字符串的方法,就必须把元素还原成字符串            // 向下转型            String s = (String) objs[x];            System.out.println(s + "---" + s.length());        }    }}

第二种方式:迭代器遍历(集合特有的遍历方式)

import java.util.ArrayList;import java.util.Collection;import java.util.Iterator;public class IteratorDemo {    public static void main(String[] args) {        // 创建集合对象        Collection c = new ArrayList();        // 创建并添加元素        // String s = "hello";        // c.add(s);        c.add("hello");        c.add("world");        c.add("java");        // Iterator iterator():迭代器,集合的专用遍历方式        Iterator it = c.iterator(); // 实际返回的肯定是子类对象,这里是多态        while (it.hasNext()) {            // System.out.println(it.next());            String s = (String) it.next();            System.out.println(s);        }    }}

存储自定义对象并遍历
上面是存储基本类型的集合的遍历方式,下面是存储引用类型的集合的遍历方式
首先写一个自定义学生对象类

public class Student {    // 成员变量    private String name;    private int age;    // 构造方法    public Student() {        super();    }    public Student(String name, int age) {        super();        this.name = name;        this.age = age;    }    // 成员方法    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }}

写一个学生测试类

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("周杰伦", 30);        Student s2 = new Student("王力宏", 27);        Student s3 = new Student("林俊杰", 33);        Student s4 = new Student("刘德华", 45);        Student s5 = new Student("罗志祥", 22);        // 把学生添加到集合        c.add(s1);        c.add(s2);        c.add(s3);        c.add(s4);        c.add(s5);        // 把集合转成数组        Object[] objs = c.toArray();        // 遍历数组        for (int x = 0; x < objs.length; x++) {            // System.out.println(objs[x]);            Student s = (Student) objs[x];            System.out.println(s.getName() + "---" + s.getAge());        }    }}

思考:迭代器为什么不定义成一个类,而是定义成一个接口?
其主要原因是因为迭代器是依赖于集合存在的。假设迭代器定义的是一个类,这样我们就可以创建该类的对象,调用该类的方法来实现集合的遍历。但是Java中有很多的集合类,而这些集合类的数据结构是不同的,那么最终的存储方式和遍历方式也是不同的,进而他们的遍历方式也应该是不一样的,所以最终,就没有定义迭代器类。而无论你使用哪种集合,你都应该具备对元素的操作,最好再有判断功能来辅助,这样就比较符合先判断再获取的逻辑。也就是说,判断和获取这两个功能应该是一个集合遍历所具备的,但是每种集合的方式又不太一样,所以就把这两个功能提取出来,并不提供具体实现,这就是接口。真正的具体实现类则是以内部类的方式体现的。

List

List是Collection的子接口,其特点是有序(存储顺序和取出顺序一致);可重复。

import java.util.Iterator;import java.util.List;import java.util.ArrayList;public class ListDemo {    public static void main(String[] args) {        // 创建集合对象        List list = new ArrayList();        // 创建字符串并添加字符串        list.add("hello");        list.add("world");        list.add("java");        // 遍历集合        Iterator it = list.iterator();        while (it.hasNext()) {            String s = (String) it.next();            System.out.println(s);        }    }}

List的特有功能

import java.util.ArrayList;import java.util.List;/* * List集合的特有功能: * A:添加功能 *      void add(int index,Object element):在指定位置添加元素 * B:获取功能 *      Object get(int index):获取指定位置的元素 * C:列表迭代器 *      ListIterator listIterator():List集合特有的迭代器 * D:删除功能 *      Object remove(int index):根据索引删除元素,返回被删除的元素 * E:修改功能 *      Object set(int index,Object element):根据索引修改元素,返回被修饰的元素 */public class ListDemo {    public static void main(String[] args) {        // 创建集合对象        List list = new ArrayList();        // 添加元素        list.add("hello");        list.add("world");        list.add("java");        // void add(int index,Object element):在指定位置添加元素        // list.add(1, "android");//没有问题        // IndexOutOfBoundsException        // list.add(11, "javaee");//有问题        // list.add(3, "javaee"); //没有问题        // list.add(4, "javaee"); //有问题        // Object get(int index):获取指定位置的元素        // System.out.println("get:" + list.get(1));        // IndexOutOfBoundsException        // System.out.println("get:" + list.get(11));        // Object remove(int index):根据索引删除元素,返回被删除的元素        // System.out.println("remove:" + list.remove(1));        // IndexOutOfBoundsException        // System.out.println("remove:" + list.remove(11));        // Object set(int index,Object element):根据索引修改元素,返回被修饰的元素        System.out.println("set:" + list.set(1, "javaee"));        System.out.println("list:" + list);    }}

List集合的特有遍历功能
存储字符串并遍历

import java.util.ArrayList;import java.util.Iterator;import java.util.List;public class ListDemo2 {    public static void main(String[] args) {        // 创建集合对象        List list = new ArrayList();        // 存储元素        list.add("hello");        list.add("world");        list.add("java");        list.add("javaee");        list.add("android");        list.add("javaee");        list.add("android");        // 遍历集合        Iterator it = list.iterator();        while (it.hasNext()) {            String s = (String) it.next();            System.out.println(s);        }    }}

存储自定义对象并遍历
自定义学生类

public class Student {    // 成员变量    private String name;    private int age;    // 构造方法    public Student() {        super();    }    public Student(String name, int age) {        super();        this.name = name;        this.age = age;    }    // 成员方法    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }}

学生对象遍历测试类

import java.util.ArrayList;import java.util.Iterator;import java.util.List;public class ListDemo {    public static void main(String[] args) {        // 创建集合对象        List list = new ArrayList();        // 创建学生对象        Student s1 = new Student("孙悟空", 30);        Student s2 = new Student("猪八戒", 40);        Student s3 = new Student("沙悟净", 27);        // 把学生对象添加到集合对象中        list.add(s1);        list.add(s2);        list.add(s3);        // 遍历        Iterator it = list.iterator();        while (it.hasNext()) {            Student s = (Student) it.next();            System.out.println(s.getName() + "---" + s.getAge());        }    }}

常见数据结构

特点:先进后出,例如子弹夹,第一次发射的是最后一颗压入弹夹的子弹,那么最后一个发射的就是压入的第一颗子弹
这里写图片描述

队列
特点:先进先出。例如排队打饭,第一个排队的第一个吃上饭,最后一个排队的最后才能吃饭。
这里写图片描述

数组

特点:存储同一种类型的多个元素的容器,有索引,方便获取
这里写图片描述

链表
由一个链子把多个结点连起来组成的数据
结点:由数据早(数据域)和地址(指针域)组成

这里写图片描述

——- android培训、java培训、期待与您交流! ———-

0 0
原创粉丝点击