1、介绍
数组就是容器的一种,数组的长度固定,不适合做变化的需求,Java提供了类集框架供我们使用。
1)类集框架是一组类和接口
2)位于java.util包当中
3)主要用于存储和管理对象
a、使用数组时候,当内容扩充时,需要考虑数组边界,数组的容量是有限的,而类集框架的容量是可以随时扩充的。
b、数组可以是基本类型,也可以是引用类型,集合只能是引用类型。
c、数组只能存储同一种类型的数据,集合可以存储不同类型(其实集合一般存储的也是同一种类型)。
4)类集框架主要分为三大类:列表、集合、映射。
2、类集框架结构图
Collection
|--List
|--ArrayList
|--Vector
|--LinkedList
|--Set
|--HashSet
|--TreeSet
Map
|------------|--HashMap
以下将类集框架泛称容器。
J2SDK所提供的容器API位于java.util包内。
容器API的类图结构如下图所示:
1、Collection接口定义了存取一组对象的方法,其子接口Set和List分别定义了存取方式。
1)Set中的数据对象没有顺序,且不可以重复。
2)List中的数据对象有顺序且可以重复。
什么叫重复的对象,如果两个对象equals,则认为两个对象相等,引用值相等。
2、Map接口定义了存取键(key)—值(value)映射对的方法。
1)键相当于x,值相当于y,一个x只能对应唯一的y,如x1 -> y1、x2 -> y2、x3 -> y3。
2)也就是说一个键只能对应于一个值,一个键只能索引到一个对象,键不能即对应于对象a,又对应于对象b。
3)在Map的实现类中,键不能重复,就算同样的键映射到同样的对象也不行。
4)两个键怎样被认为是重复的呢?
如果两个键的hashCode一样,就认为两个键重复。
5)重写一个类的equals()方法时,一定要重写其hashCode()方法。原因如下:
a、对于两个看起来equals的对象(内部属性都相等),如果作为键的话,就应当认为是相同的键,但Java在判断两个键是否相等时是根据它们的hashCode来判断的而不是根据equals()方法。
b、而Object类的hashCode()方法相当于是返回该对象在堆中的地址,也就是说就算两个对象再怎么相等,两者的地址是绝对不会相等的。
c、如果两个对象看起来equals,但因为hashCode不一样而被认为是不同的键,那看起来就会像是同样的键既指向对象a,又指向对象b,所以为了防止这样的情况出现,在重写一个类的equals()方法的同时,一定要重写其hashCode()方法,即保证看起来相同的两个对象拥有同样的hashCode。
6)为什么Java使用hashCode()方法而不是equals()方法来判断两个对象是否相等?
因为在判断若干个对象是否有重复(即相等)时,使用equals()方法的效率比较低,而使用hashCode的效率比较高。