java入门学习提升第十八篇:Java容器类详解(一)Collection接口

今天来看看Java里的一个大家伙,那就是容器。

所谓容器,就是专门用来装对象的东西,如果你学过高数,没错,就跟里面说的集合是一个概念,就是一堆对象的集合体,但是集合类是容器类中的一个子集,为了区别表示,所以还是叫容器类,之后所说的集合类只是容器里的一个子集,之后会有详细介绍。

容器就是用来存放和管理其他类对象的地方,你可以把它理解为仓库管家,当你有东西需要存放和管理的时候,就要记得来找它。你也许会说,不是有数组吗?确实,用数组存放一堆相同类型对象也是一个不错的选择,但是有一个很大的缺陷,那就是数组大小只能是固定的,不能从数组里动态添加和删除一个对象,要扩容的时候,就只能新建一个数组然后把原来的对象全部复制到新的数组里,而且只能存放相同类型的对象,使用起来不够灵活。然而我们的管家就不一样了。

国际惯例,先来看一个栗子:

public class Test {

public static void main(String args[]){

//小明打算学Java,买了三本书

Book bookA = new Book("Java核心技术(卷一)", 88.9);

Book bookB = new Book("Java核心技术(卷二)", 88.6);

Book bookC = new Book("Java编程思想", 99.0);

//他想了想,放哪呢?到处放怕之后会找不到,放书架以后书变多了找起来就很麻烦

//于是他找了个管家

Map bookMap = new HashMap<>(3);

//然后跟管家说,这三本书先放你这了,要用的时候找你拿

bookMap.put(bookA.getName(), bookA);

bookMap.put(bookB.getName(), bookB);

bookMap.put(bookC.getName(), bookC);

//勤劳的管家兢兢业业的保存好了三本书

//小明回到家,想检查一下管家老不老实

//“管家,把Java核心技术(卷一)给我拿过来”

Book bookD = bookMap.get("Java核心技术(卷一)");

//他查看了一下这本书的信息并跟原来的信息校验了一番

System.out.println(bookD);

System.out.println(bookA.equals(bookD));

//并同样校验了另外两本书

Book bookE = bookMap.get("Java核心技术(卷二)");

System.out.println(bookE);

System.out.println(bookB.equals(bookE));

Book bookF = bookMap.get("Java编程思想");

System.out.println(bookF);

System.out.println(bookC.equals(bookF));

//嗯,看来管家没有玩花样,还是原来的书,晚饭给他加个蛋

}

}

class Book{

private String name;

private Double price;

public Book(String name, Double price) {

this.name = name;

this.price = price;

}

public Double getPrice() {

return price;

}

public void setPrice(Double price) {

this.price = price;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

@Override

public String toString() {

return "Book{" +

"name='" + name + ''' +

", price=" + price +

'}';

}

}

输出如下:

Book{name='Java核心技术(卷一)', price=88.9}

true

Book{name='Java核心技术(卷二)', price=88.6}

true

Book{name='Java编程思想', price=99.0}

true

相信大家看过小明和管家的故事之后,对容器这个概念应该有初步的了解了。容器一般来说就是在你需要存放一系列对象时,可以给你管理对象的好管家。

当然,容器家族里并不只有HashMap这一个管家,最开始就说了,容器可是一个庞大的家族。先来看一张图感受一下吧:

好像有点多?关系有点复杂。没错,除了并发包里的集合类以外的大部分容器类差不多都在这了,这个图,emmmm...看看就好,我们还是看下面这个图吧

别慌,其实最常用的就是这么几个了,Collection和Map是两个大的接口,Collection下有三个子接口,List,Queue,Set,下面是最常用的三个类,ArrayList,LinkedList,HashSet。Map接口下最常用的就要数上面栗子里的HashMap了。正如你看到的那样,容器类里有很多不同的实现类,也就是不同的管家,他们有的不同的能力,各有所长也各有所短,至于他们的具体介绍,将会留到之后的几篇文章里介绍,本篇作为集合的介绍篇就不多做讲解了。

需要注意的是,容器中只能存放对象,而不能存放基本类型。所以当你将一个 int 型数据 1放入容器中的时候,其实它会自动装箱转换成 Integer 类后存入的,Java中每一种基本类型都有对应的引用类型。在容器存放的是多个对象的引用,对象本身还是放在堆内存中。容器可以存放不同类型,不限数量的数据类型。

Collection接口

Collection接口是容器家族里的老大哥,是最基本的容器接口,但是这里的Collection跟容器并不是等价关系,因为你仔细看看上面的图就知道,容器家族里还有另外一个老大哥,那就是Map接口。一个Collection代表一组Object,即Collection的元素(Elements)。Collection接口下有三个子接口,分别是List,Set,Queue,它们各有各的特点,下面会一一介绍,但是都继承于Collection接口,所以继承了Collection的所有特性。

我们可以来看看Collection接口都有哪些方法:

public interface Collection extends Iterable {

//查询操作

/**

* 返回集合中元素个数

*/

int size();

/**

* 集合是否为空

*/

boolean isEmpty();

/**

* 是否包含某个元素

*/

boolean contains(Object o);

/**

* 取迭代器

*/

@Override

Iterator iterator();

/**

* 转到数组

*/

Object[] toArray();

/**

* 转到指定数组

*/

T[] toArray(T[] a);

// 修改操作

/**

* 添加元素

*/

boolean add(E e);

/**

* 移除元素

*/

boolean remove(Object o);

// 批量操作

/**

* 是否全部包含

*/

boolean containsAll(Collection c);

/**

* 全部添加

*/

boolean addAll(Collection c);

/**

* 全部移除

*/

boolean removeAll(Collection c);

/**

* 条件移除

*/

default boolean removeIf(Predicate filter) {

Objects.requireNonNull(filter);

boolean removed = false;

final Iterator each = iterator();

while (each.hasNext()) {

if (filter.test(each.next())) {

each.remove();

removed = true;

}

}

return removed;

}

/**

* 保留全部

*/

boolean retainAll(Collection c);

/**

* 清空

*/

void clear();

// 比较和哈希

/**

* 比较是否相等

*/

boolean equals(Object o);

/**

* 取哈希值

*/

int hashCode();

@Override

default Spliterator spliterator() {

return Spliterators.spliterator(this, 0);

}

//流操作

default Stream stream() {

return StreamSupport.stream(spliterator(), false);

}

default Stream parallelStream() {

return StreamSupport.stream(spliterator(), true);

}

}

可以看出,Collection的操作还是蛮多的,增删该查和批量操作都有,至于迭代器是什么东西,后面的篇章会有详细介绍。最后两个方法涉及到了流操作,这是Java8里新添加的特性,关于流操作的知识,这里暂时不多说,以后在做讲解。

通过本篇,你只需要了解一下集合是什么,为什么要有集合,集合家族的全貌,了解一下Collection接口中有哪些方法就足够了,之后的文章会从以下几方面来介绍容器家族:

1.Map接口

2.Iterable接口

3.List,Set,Queue接口

4.ArrayList使用方式和应用场景+源码剖析

5.HashSet使用方式和应用场景+源码剖析

6.LinkedList使用方式和应用场景+源码剖析

7.HashMap使用方式和应用场景+源码剖析

今天的讲解就到此为止了,仅仅介绍了容器的基本概念,作为容器学习的开胃菜,后面一系列的文章都会围绕容器展开,希望大家继续关注!

我做开发十多年的时间,如果大家对于学习java的学习方法,学习路线以及你不知道自己应该是自学还是培训的疑问,都可以随时来问我,大家可以加我的java交流学习qun:四九四,八零一,九三一,qun内有学习教程以及开发工具。

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

推荐阅读更多精彩内容