黑马程序员 D9集合框架

本文深入探讨Java集合框架的概念、特点、与数组的区别,并详细介绍了集合体系的组成,包括List、Set、Map等主要集合类及其底层数据结构。同时,文章强调了迭代器在集合操作中的作用及使用方法,并提供了集合常见使用步骤。最后,通过练习巩固所学知识。

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

一、

集合概述:

Java是面向对象语言,如果我们要针对多个对象进行操作,就必须对多个对象进行存储。

而对多个元素进行存储,前面我们学习过数组,数组的弊端,长度固定。这样,数组将不能满足变化的要求。所以,Java就提供了集合供我们使用。

集合的特点:

长度可以发生改变。
只能存储对象。
可以存储多种类型对象(一般存储的还是同一种,因为1.5JDK的新特性 泛型)。

集合和数组的区别:

长度问题

数组固定。

集合可变。

存储元素问题

数组可以是基本类型,也可以是引用类型。

集合只能是引用类型。(JDK1.5以后还可以存储基本数据类型,因为JDK1.5自动装箱拆箱)

是否同一类型

数组元素类型一致。

集合元素类型可以不一致。(建议还是同一种类型,因为JDK1.5出现了泛型)

功能是否一致

数组只能对数据进行存取操作,当然删除数组中的元素还可以删除,就是null。

集合不但可以对数据进行基本操作,还提供了更强大的功能,比如删除 修改...。

集合体系的由来

集合是存储多个元素的容器,但是,由于数据结构不同,Java就提供了多种集合类。

而这多种集合类有共性的功能,所以,通过不断的向上抽取,最终形成了集合体系

结构。

为什么会出现这么多的容器呢?

因为每一个容器对数据的存储方式都有不同,这个存储方式称之为:数据结构。

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

如何学习和使用一个继承体系呢?

学习顶层:因为顶层定义的是共性内容。
使用底层:因为底层才是具体的实现。

简单一句话:参阅顶层内容,建立底层对象。
Collection:定义了集合框架的共性功能。
|------List(列表):元素是有序的,元素可以重复,因为该集合体系有索引。

|--ArrayList:底层是数组数据结构,查询速度很快,但是增删稍慢,线程不同步,默认10个元素。(线程不同步)

|--LinkedList:底层是链表数据结构,查询很慢,增删速度很快。(线程不同步)

|--Vector:底层是数组数据结构,和ArrayList一样,查询,增删,都很慢,Vector是1.0出现,ArrayList是1.2出现,(线程同步)但已经不用了。

|------Set(集):元素是无序的(存入和取出顺序不一定一致),元素不可以重复。

|--HashSet:底层数据结构是哈希表。线程是不同步的。

采用散列函数对元素进行排序Asiic),是专门为快速查询而设计的。存入HashSet的对象必须定义hashCode方法。

|--LinkedHashSet:有序。

内部使用散列以加快查询速度,同时使用链表维护元素插入的次序,在使用迭代器遍历Set时,结果会按元素插入的次序显示。 

|--TreeSet:底层的数据结构是二叉树。线程是不同步的。

对Set集合中的元素的进行指定(我们指定的比较器)顺序的排序。不同步。TreeSet底层的数据结构就是二叉树。

采用红黑树的数据结构进行排序元素,使用它可以从Set中提取有序(升序或者降序)的序列。

需要注意的是,存入自定义类时,TreeSet需要维护元素的存储顺序,因此自定义类要实现Comparable接口并定义compareTo方法。 

注意:集合只能保存引用数据类型,也就是存储的是对象的地址值,而不是对象本身。集合中的元素相当于引用类型变量。

注意:如果使用的集合涉及到了频繁的插入,建议使用LinkedList。

二、

集合注意:

1、直接存储基本类型值也是可以的,因为JDK1.5后,有自动装箱技术,会将基本数据类转换成数据对象。JDK1.4绝对不行,因为集合中存放的对象的引用,当直接存放基本类型值的时候,会将这个基本类型值变成一个对象(自动装箱)。

2、集合对象中存储的其实都是元素对象的引用。

3、add方法的参数是Object类型可以接受所有类型的对象。但会出现向上转型,取出元素时的类型还是Object,不能使用具体对象的特有内容,想要是有特有内容,必须向下转型。集合框架中存放的都是对象的地址。当我们想用对象的特有方法的时候必须向下转型。

当我们想直接打印一个集合,其实是调用了这个对象的toString方法,当我们要打印一个对象的长度的时候,首先我们会想到length方法。但是由于我们添加数据的时候用的add方法,而add方法的参数类型是Object,也就说把存进去的数据向上转型了。但是我们都知道Object是没有length方法,此时无法使用length方法。那么就要向下转型才可以,只有使用子类的特有方法size。


迭代器(Iterator)

1、什么是迭代器?其实就是集合的取出元素的方式。

就把取出方式定义在集合的内部,这样取出方式就可以直接访问结合内容的元素。那么取出方式就定义成了内部类。

而每一个容器的数据结构不同,所以取出的动作细节也不一样,但是都有共性内容:取出。那么可以写共性取出。

那么这些内部类都符合一个规则。该规则是Iterator

迭代时注意:在迭代时候,不可以通过集合对象的方法操作集合中的元素,因为会发生 ConcurrenModificationException异常。所以在迭代器时,只能用迭代器的方法操作元素,可是Iterator方法是有限的,只能对元素进行判断,取出,删除的操作
如果想要其他的操作,如添加、修改等,就需要使用其子接口,ListIterator。

如何获取集合的取出对象呢?

通过一个对外提供的方法:iterator()


迭代器的使用
1.使用步骤
1)通过集合对象获取迭代器对象。
2)通过迭代器对象判断。
3)通过迭代器对象获取。
2.迭代器原理
由于多种集合的数据结构不同,所以存储方式不同,所以,取出方式也不同。
这个时候,我们就把判断和获取功能定义在了一个接口中,将来,遍历哪种

集合的时候,只要该集合内部实现这个接口即可。

3.集合的常见使用步骤

1)创建集合对象。

2)创建元素对象。

3)把元素添加到集合中。

4)遍历集合。

1.通过集合对象获取迭代器对象。

2.通过迭代器对象判断。

3.通过迭代器对象获取。

4.Collection存储字符串和自定义对象并遍历

三、练习
1.
2.
3.
4.
5.


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值