Java中的集合

学习了解

  1. 集合框架的概念与作用
  • 集合框架的体系结构
  • 集合框架的实际应用

概念与作用

集合概念:

  • 在现实生活中,很多的事物凑在一起。
  • 数学中的集合:具有共同属性的事物的总体。
  • Java中的集合类:是一种工具,就像是容器,存储任意数量的具有共同属性的对象。

集合的作用:

  • 在类的内部,对数据进行组织;
  • 简单而快速的搜索大量的条目;
  • 有的集合接口,提供了一些列排列有序的元素,并且可以在序列中间快速的插入或则删除有关的元素;
  • 有的集合接口,提供了映射关系,可以通过任意关键字(key)去快速查找对应的唯一对象,而这个关键字是任意类型。

集合与数组的对比——为何选择集合而不是数组?

  • 数组的长度是固定的,集合的长度可变;
  • 数组只能通过下标访问元素,类型固定(int型),数据量大时只能通过遍历来查找对象。而有的集合可以通过任意类型的关键字来查找所映射的具体对象;

集合框架的体系结构

集合框架由两大家族组成,分别是Collection家族和Map家族。

Collection和Map是两个接口。是Java集合框架的根接口。

Collection家族主要有三个子接口:分别是List(序列)、Queue(队列)、Set(集)三个接口。
其中List、Queue存储的元素是排列有序的,可以重复的。
Set中的元素是无序并且不能重复。

List有一个很常用很重要的实现类: ArrayList(数组序列)。

Queue有一个很重要的实现类:LinkedList(链表),这个LinkedList同时也是List接口的实现类。

Set有一个重要的实现类HashSet(哈希集)

Map家族也有众多的子接口,其中有一个很重要的实现类HashMap(哈希表)

Collenction和Map是如何存储数据的呢?
首先Collection存储的都是一个一个的独立对象,而Map的内部是以Key与Value两个对象(Key,Value)为一个映射来存储数据。这样一个映射就是一个Entry(键值对)类的示例,Entry类是Map的一个内部类,Key和Value可以是任何对象。

Paste_Image.png

可以将实现Collection接口的类所存储的数据都为一个一个的光棍(就是一个一个的对象),而实现Map接口的类所存储的是数据都为一对一对的夫妇(<Key,Value>)。

集合框架的实际应用

Collection接口 & List接口简介

Collection接口、子接口以及实现类
Collection接口:

  • List、Set和Queue接口的父接口
  • 定义了可用于操作List、Set和Queue的方法——增删改查

List接口及其实现类——ArrayList

  • List是元素有序并且可以重复的集合,被称为序列
  • List可以精确的控制每个元素的插入位置,或者删除某个位置元素
  • ArrayList——数组序列,是List的一个重要实现类
  • ArrayList底层是由数组实现的

范例:实现功能——模拟学生选课功能

  • 选择课程(往集合中添加课程)
  • 删除所选的某门课程
  • 查看所选课程
  • 修改所选课程

1、创建课程类

/**
 * 课程类
 * Created by 99479 on 2017/7/10.
 */
public class Course {
    public String id;
    public String name;
    public Course(String id, String name) {
        this.id = id;
        this.name = name;
    }   
}

2、创建学生类

import java.util.HashSet;
import java.util.Set;

/**
 * 学生类
 * Created by 99479 on 2017/7/10.
 */
public class Student {
    public String id;
    public String name;
    public Set courses;

    public Student(String id, String name) {
        this.id = id;
        this.name = name;
        this.courses = new HashSet();
    }
}

3、ListTest类

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

/**
 * 备选课程类
 * Created by 99479 on 2017/7/10.
 */
public class ListTest {
    /**
     * 用于存放备选课程的List
     */
    public List coursesToSelect;

    public ListTest(){
        this.coursesToSelect  = new ArrayList();
    }

    /**
     * 用于往coursesToSelect中添加备选课程
     */
    public void testAdd(){
        //创建一个课程对象,并通过调用add方法,添加到备选课程List中
        Course course = new Course("1","数据结构");
        coursesToSelect.add(course);
        Course temp = (Course) coursesToSelect.get(0);//对象存入集合中都变成Object类型,取出时需要类型转换
        System.out.println("添加了课程:" + temp.id +  " : "+ temp.name);

        Course course1 = new Course("2","C语言");
        //将对象插入指定位置
        coursesToSelect.add(0,course1);
        temp = (Course) coursesToSelect.get(0);
        System.out.println("添加了课程:" + temp.id +  " : "+ temp.name);

        /**
         * 如果插入的位置大于List容器的位置,将会报错(“java.lang.IndexOutOfBoundsException: Index: 4, Size: 2”)
        Course course2 = new Course("3","test");
        coursesToSelect.add(4,course2);
         */

        Course [] courses = {new Course("3","离散数学"),new Course("4","汇编语言")};
        coursesToSelect.addAll(Arrays.asList(courses));
        temp = (Course) coursesToSelect.get(2);
        System.out.println("添加了课程:" + temp.id +  " : "+ temp.name);
        temp = (Course) coursesToSelect.get(3);
        System.out.println("添加了课程:" + temp.id +  " : "+ temp.name);

        Course [] courses1 = {new Course("5","高等数学"),new Course("6","大学英语")};
        coursesToSelect.addAll(2,Arrays.asList(courses1));
        temp = (Course) coursesToSelect.get(2);
        System.out.println("添加了课程:" + temp.id +  " : "+ temp.name);
        temp = (Course) coursesToSelect.get(3);
        System.out.println("添加了课程:" + temp.id +  " : "+ temp.name);
    }

    /**
     * 取得List中的元素的方法
     */
    public void testGet(){
        System.out.println("有如下待选课程:");
        //获取集合的大小
        int size = coursesToSelect.size();
        for (int i  = 0 ; i <size ; i++){
            Course course = (Course) coursesToSelect.get(i);
            System.out.println("课程:"+ course.id + " :"+course.name);
        }
    }

    /**
     * 通过迭代器来遍历list
     */
    public void testIterator(){
        //通过集合的Iterator遍历集合
        System.out.println("有如下待选课程(使用迭代器访问):");
        Iterator iterator = coursesToSelect.iterator();
        while(iterator.hasNext()){
            Course course = (Course) iterator.next();
            System.out.println("课程:"+ course.id + " :"+course.name);
        }
    }

    /**
     *通过for-each方法访问集合元素
     */
    public void testForEach(){
        System.out.println("有如下待选课程(使用for-each方法访问):");
        for (Object obj : coursesToSelect){
            Course course = (Course) obj;
            System.out.println("课程:"+ course.id + " :"+course.name);
        }
    }

    /**
     * 修改List中的元素
     */
    public void testModify(){
        System.out.println("---------------- 修改集合中指定位置的元素");
        coursesToSelect.set(4,new Course("7","毛概"));
    }

    /**
     * 删除List中的元素(通过传入集合中的实体对象)
     */
    public void testRemovieWithObject(){
        Course course = (Course) coursesToSelect.get(4);
        System.out.println("我是课程:"+course.id+" : "+course.name+",我即将被删除");
        coursesToSelect.remove(course);//传入的是实体对象
        System.out.println("成功删除课程!");
        testIterator();
    }

    /**
     * 删除List中的元素(通过传入集合中的下标)
     */
    public void testRemovieWithIndex(){
        System.out.println("我在List集合中的下标为3,我即将被删除!");
        coursesToSelect.remove(3);
        testIterator();
    }

    /**
     * 删除List集合中的元素(通过传入指定集合中的元素的数组)
     */
    public void testRemoviewWithArray(){
        System.out.println("通过传入指定集合中的元素的数组");
        Course [] courses = {(Course) coursesToSelect.get(0), (Course) coursesToSelect.get(1)};
        coursesToSelect.removeAll(Arrays.asList(courses));
        testIterator();
    }



    public static void main(String[] args) {
        ListTest listTest = new ListTest();
        listTest.testAdd();
        listTest.testGet();
        listTest.testIterator();
        listTest.testForEach();
        listTest.testModify();
        listTest.testForEach();
        listTest.testRemovieWithObject();
        listTest.testRemovieWithIndex();
        listTest.testRemoviewWithArray();
    }
}

输出

添加了课程:1 : 数据结构
添加了课程:2 : C语言
添加了课程:3 : 离散数学
添加了课程:4 : 汇编语言
添加了课程:5 : 高等数学
添加了课程:6 : 大学英语
有如下待选课程:
课程:2 :C语言
课程:1 :数据结构
课程:5 :高等数学
课程:6 :大学英语
课程:3 :离散数学
课程:4 :汇编语言
有如下待选课程(使用迭代器访问):
课程:2 :C语言
课程:1 :数据结构
课程:5 :高等数学
课程:6 :大学英语
课程:3 :离散数学
课程:4 :汇编语言
有如下待选课程(使用for-each方法访问):
课程:2 :C语言
课程:1 :数据结构
课程:5 :高等数学
课程:6 :大学英语
课程:3 :离散数学
课程:4 :汇编语言
---------------- 修改集合中指定位置的元素
有如下待选课程(使用for-each方法访问):
课程:2 :C语言
课程:1 :数据结构
课程:5 :高等数学
课程:6 :大学英语
课程:7 :毛概
课程:4 :汇编语言
我是课程:7 : 毛概,我即将被删除
成功删除课程!
有如下待选课程(使用迭代器访问):
课程:2 :C语言
课程:1 :数据结构
课程:5 :高等数学
课程:6 :大学英语
课程:4 :汇编语言
我在List集合中的下标为3,我即将被删除!
有如下待选课程(使用迭代器访问):
课程:2 :C语言
课程:1 :数据结构
课程:5 :高等数学
课程:4 :汇编语言
通过传入指定集合中的元素的数组
有如下待选课程(使用迭代器访问):
课程:5 :高等数学
课程:4 :汇编语言
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容