Java集合框架(一)——集合概述

本文概述

本篇文章将分三块内容对Java中的集合框架进行介绍:
一. 集合框架相关概念
二. 集合体系通用方法
三. 集合遍历—Iteractor

一. 集合框架相关概念

集合:用于存储多个对象的容器

1. 为什么使用集合

  在Java的世界中流行这么一句话:“一切皆对象”,任何事物都是以对象的形式体现。那有没有一种容器能够满足我们存储多个对象的需求呢?大家能想到的大概就是数组了,既然我们有了数组,那为什么还要使用集合呢?
  首先,虽然数组能够存储对象,但是一旦对数组进行初始化,其长度就无法改变。其次数组只能存储同一类型的对象,这两点注定了数组难以满足Java作为面向对象语言适应存储对象不断变化的需求,这时集合就发挥了他的优势。

2.集合的特点

  集合是一种只用于存储对象,但可以存储不同类型的对象,且长度可变的容器

3.数组和集合区别

  从对数组和集合的分析中可以总结出两者的区别:

  • 长度区别:
      - 数组长度不变
      - 集合长度可变
  • 内容不同
      -数组只能存储同一种类型的元素
      -集合可以存储不同类型的元素
  • 元素的数据类型
      -数组可以存储基本数据类型和引用数据类型
      -集合只能存储引用数据类型
4. 集合框架体系的形成

  满足上述需求之后,如果又有需求提出:在这个容器中我不要重复的元素,或者这么多元素我要有一定的排列顺序等等。
  针对不同的需求,Java提供了多种不同的集合类,多种集合类之间又有不同的数据结构(数据的存储方式),但同时他们又有共同的特性,比如存储和获取的功能,我们把这些集合的共性不断向上提取,最终形成了我们的继承体系结构

集合框架继承图(不完全)

二. 集合体系通用方法

在学习理论中,一个人学习一样技能一般方式:
分析:具体到抽象
实现:抽象到具体
使用:使用具体的

  所以对于集合体系的学习也可以从较为抽象的Collection接口开始学习,因为学习了Collection就相当于学习了所有集合的共性。既然集合是一个容器,作为容器的共同方法应该不外乎添加,删除,查看,判断和修改等功能。所以在Collection接口中应该会提供这些抽象方法,这时就需要打开万能的API文档进行学习。
  根据文档的查阅,我们可以将Collection中的方法分成以下几类(具体例子中以实现类ArrayList为例子):

1. 添加元素:

方法:
boolean add(E e);//添加一个对象,添加成功返回True
boolean addAll(Collection<? extends E> c);//添加一个集合中的所有元素

示例1:

public static void main(String args[]) {
        Collection c1 = new ArrayList();
        System.out.println("c1:" + c1);
        c1.add("Java");
        c1.add("Python");
        System.out.println("c1:" + c1);
}

输出结果1:

c1:[]
c1:[Java, Python]


示例2:

    public static void main(String args[]) {
        Collection c1 = new ArrayList();
        Collection c2 = new ArrayList();
        
        c1.add("Java");
        c1.add("Python");
        c2.add("Java");
        c2.add("wjy2");
        System.out.println("c1:" + c1);
        
        c1.addAll(c2);
        System.out.println("c1:" + c1);

输出结果

c1:[Java, Python]
c1:[Java, Python, Java, wjy2]


2. 删除元素:

方法:

boolean clear();//清除所有元素
boolean remove(Object o);//移除某个元素
boolean removeAll(Collection<? extends E> c);//移除一个集合中所包含的元素

示例1:

public static void main(String args[]) {
    Collection c1 = new ArrayList();
    c1.add("Java");
    c1.add("Python");
    System.out.println("c1:" + c1);

    c1.remove("Python");
    System.out.println("c1:" + c1);
}

输出结果1:

c1:[Java, Python]
c1:[Java]


示例2:

    public static void main(String args[]) {
        Collection c1 = new ArrayList();
        Collection c2 = new ArrayList();
        
        c1.add("Java");
        c1.add("Python");
        c2.add("Java");
        c2.add("wjy2");
        
        c1.removeAll(c2);
        System.out.println("c1:" + c1);

输出结果

c1:[Python]


3. 查找元素:

Iterator<E> iterator();//集合的遍历
Object toArray();//将集合转换成为数组,从而通过遍历数组的方式遍历集合

4. 判断内容:

方法:

boolean contains(object o);//集合中是否包括该元素
boolean contains(Collection<? extends E> c);//集合中是否包括该集合
boolean isEmpty();//判断集合是否为空
int size();//集合中元素的数量

示例:

    public static void main(String args[]) {
        Collection c1 = new ArrayList();
        Collection c2 = new ArrayList();
        
        c1.add("Java");
        c1.add("Python");
        c2.add("Java");
        c2.add("wjy2");
        
        System.out.println(c1.contains("xxx"));
        System.out.println(c1.containsAll(c2));
        System.out.println(c1.size());
        System.out.println(c1.isEmpty());   
    }

输出结果:

false
false
2
false


思考:String类和Array类中判断长度是使用size()方法,还是length()方法,还是length属性呢?


5. 修改元素

方法:

boolean retainAll(Collection<? extends E> c);//取两个集合的交集,直接会对元素本身产生作用

示例:

    public static void main(String args[]) {
        Collection c1 = new ArrayList();
        Collection c2 = new ArrayList();
        
        c1.add("Java");
        c1.add("Python");
        c2.add("Java");
        c2.add("wjy2");
        
        c1.retainAll(c2);
        System.out.println("c1:" + c1);
}

输出结果:

c1:[Java]


注意:该方法会在原有集合上做出改变,只要原来的集合有改动就会返回True


三. 集合遍历—Iteractor

1. 集合遍历的方法

  还记得集合体系图中最上层的接口Iterable吗?
  我们可以通过Iterator来进行集合的遍历,使用while和for语句的代码如下:

while语句方法:

public static void main(String args[]) {
        Collection c1 = new ArrayList();
        c1.add(new Student("张三",18));
        c1.add(new Student("李四",28));
        c1.add(new Student("王五",38));
        c1.add(new Student("赵六",48));

        Iterator iter = c1.iterator();
        while(iter.hasNext()) {
            Student s = (Student) iter.next();
            System.out.println(s.getName() + "---------" + s.getAge());
        }
    }

for语句方法:

for(Iterator iter = c1.iterator();iter.hasNext();) {
        Student s = (Student) iter.next();
        System.out.println(s.getName() + "---------" + s.getAge());
    }

输出结果:

张三---------18
李四---------28
王五---------38
赵六---------48


  从两种方法中不难发现,使用while方法代码非常清晰,具有良好的可读性。使用for方法可读性不如前者,但是能够在一次循环中很快的将Iterator对象变成内存垃圾,及时回收,效率更高。
  具体使用哪种方法完全看个人喜好,所以不必纠结。

我们来总结一下集合的使用步骤:
  1. 创建集合对象
  2. 创建元素对象
  3. 把元素添加到集合当中
  4. 通过Iterator遍历集合
    - 通过集合对象获取迭代器
    - 通过迭代器中hasNext()方法判断是否又元素
    - 通过迭代器对象next()获取元素并移动到下一个位置

2. 从原理层面理解Iterator集合遍历

  学会了遍历的基本格式是不够的,还需要从源码角度理解Iterator的使用机制,才能够更好掌握集合的遍历。
  Interator在源码中的框架大致是这样的:

public interface Iterator{
        public abstract boolean hasNext();
        public abstract Object next();
}
public interface Iterable{
        Iterator iterator();
}
public interface Collection extends Iterable{
}
public interface List extends Collection{
}
public class ArrayList implements List{
}

  迭代器之所以定义成接口而不是一个类,是因为Java中提供了很多集合类,而这些集合类的数据结构是不同的,存储方式和遍历方式也是不同的,所以最终迭代器被设计为了接口。最终的实现方法不在Collection中,不再List中,而是在具体的实现子类ArrayList中才得以实现。

  而无论是集合本身还是集合遍历,都体现出Java作为面向对象语言所具备的继承,多态的特性,体现这Java设计语言本身的智慧与魅力。
  本文对集合框架做了简单的概述,之后的文章会对集合具体的实现类做更深入的介绍,欢迎继续观看后续内容,一起体会Java语言的智慧与魅力。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,598评论 18 399
  • 写在前面自开始在公司实习以来,经常都要用到集合框架。不仅后台要用,在前台做数据交互的时候用得也多。所以我想着是时候...
    EakonZhao阅读 3,264评论 0 12
  • 你要是是让我写你心间的良田,楼宇阁轩岂得广厦千万间。 你要不愿雨湿河边惹了悲欢,我把笔丢弃在从前,活泼在你脸便在我...
    龚杰1996阅读 168评论 0 0
  • 《爱情》 或许决定两个人爱情的那是勇气而决定一个人爱情的那是努力。 《因为爱情》 如果有一天你突然吻我我希望那是因...
    何鲸洛阅读 365评论 0 2
  • 我的父亲是一名教师,记得我小的时候总喜欢爬到父亲肩膀上然后骑在他的脖子上给他编辫子,每每这个时候他都很开心,现在我...
    心若止水858阅读 328评论 0 0