集合

来源:互联网 发布:淘宝开店安全吗 编辑:程序博客网 时间:2024/06/07 03:13

一、集合类概述

java.util包下提供了一些集合类,这些集合类又被称为容器。数组也是一种容器,但集合类与数组的不同之处在于数组的长度的是固定的,而集合的长度是可变的;数组用来存放基本类型的数据,集合用来存放对象的引用。常用的集合有List集合、Set集合和Map集合,其中List与Set继承了Collection接口,各接口还提供了不同的实现类。
这些类的继承关系如下:
Java.lang.Object

|——–Collection

|—–List:元素是有序的,元素可以重复,因为该集合体系有索引;

|—–ArrayList:底层的数据结构使用的是数组数据结构,查询快、增删慢,线程不同步。

|—-LinkedList:底层的数据结构是链表数据结构,查询慢增删快。

|—-Vector:底层是数组数据结构,线程同步。被ArrayList替代了。

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

|—-HashSet:底层数据结构是哈希表。HashSet通过元素的两个方法,hashCode(hashCode是用来在散列存储结构中确定对象的存储地址的)和equals来保证元素的唯一性。如果元素的hasCode相同,才会判断equals是否为true。如果元素的hashCode值不同,不会调用equals。注意:对于判断元素是否存在以及删除等操作,依赖的方法是元素的HashCode和equals方法。ArrayList依赖的方法只有equals.

|—-TreeSet:以对Set集合中的元素进行排序。排序时,当主要条件相同,一定要比较次要条件。底层数据结构是二叉树,保证元素唯一性的依据是compareTo方法return 0;

|—–Map

|—–HashMap

|——-TreeMap

二、Collection接口;

Collection接口是层次结构中的根接口。构成Collection的单位称为元素。Collection接口通常不能直接使用,但该接口提供了添加元素、删除元素、管理数据的方法。由于List接口和Set接口都继承了Collection接口,因此这些方法对List集合和Set集合是通用的。常用方法如下:
add(E e):将指定的对象添加到集合中;

remove(Object obj):将指定的对象从该集合中删除;

isEmpty():返回boolean值,用于判断当前集合是否为空;

iterator():返回在此Collection的元素上进行迭代的迭代器,用于遍历集合中的对象;
注意:
1、add方法的参数类型是Object,以便于接受任意类型的对象。
2、集合中存储的都是对象的引用(地址);

三、迭代器

获取集合中的元素用迭代器
ArrayList al = new ArrayList();
al.add(“Java01”);
al.add(“Java02”);
Iterator it = al.iterator();

Iterator是一个接口,接口型引用指向自己的子类对象,而这个子类对象是由集合中的iterator()方法获取的,it.hasNext()方法用来判断集合中是否仍有元素。it.next()方法可以获取集合中的下一个元素。迭代器其实就是集合的取出元素的方式。

由于每一种容器的数据结构不同,所以将取出方式iterator()方法定义在集合的内部。又因为都有判断和取出两个动作,所以将这些共性内容抽取为Iterator接口。

迭代器中不能使用集合的方法进行操作,只能用迭代器自身的方法进行操作。但Iterator只能进行判断取出删除的操作。如果想进行其他操作,如添加修改,就需要使用其子接口:ListIterator。该接口只能通过List集合的listIterator方法获取。

四、List集合

List集合特有的迭代器:ListIterator是Iterator的子接口。在迭代时,不可以通过集合对象的方法操作集合中的元素。

1、List接口
List接口继承了Collection接口,因此包含Collection中的所有方法,此外List接口还定义了以下两个重要的方法:
get(int index):获得指定索引位置。
set(int index,Object obj):将集合中指定索引位置的对象修改为指定的对象。

2、List接口的实现类
List接口的常用实现类有ArrayList与LinkedList;
ArrayList类实现了可变的数组,允许保存所有元素,包括null,并可以根据索引位置对集合进行快速的随机访问;缺点是向指定的索引位置插入对象或删除对象的速度较慢。

ArrayList判断对象是否相同,用的是equals方法,用对象的equals方法和另一个对象比较。自己定义的类继承基类的equals方法,而基类的方法比较的是地址值,因此应该重写equals方法。

List集合判断元素是否相同依据的是元素的equals方法!
字符串中有自己的equals方法!
LinkedList类采用链表结构保存对象。这种结构的优点是便于向集合中插入和删除对象,需要向集合中插入删除对象时,使用LinkedList类实现的List集合的效率较高;但对于随机访问集合中的对象,使用LinkedList类实现List集合的效率低。

LinkedList的特有方法:
添加元素:
addFirst();
addLast();
获取元素,但不删除元素:
getFirst();
getLast();
获取元素并删除元素。如果集合中没有元素,会出现NoSuchElementException。
removeFirst();
removeLast();

五、Set集合

Set集合的功能和Collection的功能是一致的。

Set集合中的对象不按特定的方式排序,只是简单的把对象加入集合中,但Set集合不能包含重复对象。Set集合由Set接口和Set接口的实现类的组成。Set接口继承了Collection接口,因此包含Collection接口中的所有方法。

Set接口常用的两个实现类有HashSet类与TreeSet类。
HashSet通过实现类的两个方法hashCode和equals来保证元素的唯一性。如果元素的hashCode相同,才会判断equals是否为true。如果,如果元素的hashCode值不同,不会调用equals。

TreeSet类不仅实现了Set接口,还实现了java.util.SortedSet接口。因此,TreeSet类实现的Set集合在遍历集合时,按照自然顺序递增排序,也可以按照指定比较器递增排序,即可以通过比较器对用TreeSet类实现的Set集合中的对象进行排序。

Comparable接口强制让实现它的类具备比较性方法为compareTo(To)。

TreeSet:可以对Set集合中的元素进行排序,排序时,当主要条件相同,一定要比较次要条件。底层数据结构是二叉树,保证元素唯一性的依据是compareTo方法return0。

往TreeSet里存储的元素必须具有比较性!
TreeSet排序的第一种方式:让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法。这种方式也称为元素的自然顺序,或者叫做默认顺序。

TreeSet排序的第二种方式:当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时需要让集合自身具备比较性。在集合初始化就有了比较方式。定义一个类,实现Comparator接口,覆盖compare方法。

定义比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。

当两种排序方式都存在时,以比较器为主。

六、泛型

泛型:JDK1.5版本以后出现的新特性,用于解决安全问题,是一种类型安全机制。
好处:
1、将运行时期出现的问题转ClassCastException,移到了编译时期,方便程序员解决问题,让运行时期问题减少安全。
2、避免了强制转换的麻烦。
泛型格式:通过<>定义要操作的引用数据类型。
在使用Java提供对象时,什么时候写泛型:通常在集合框架中很常见,只要见到<>就要定义泛型。
其实<>就是用来接收类型的,当使用集合时,将集合中要存储的数据类型作为参数传递到<>即可。

泛型类:当类中要操作的引用数据类型不太确定的时候,早起定义Object来完成宽展,现在定义泛型来完成扩展。

泛型方法:
泛型类定义的泛型,在整个类中有效,如果被方法使用,那么泛型类的对象要明确要操作的具体的类型后,所有要操作的类型就一定固定了。为了让不同的方法可以操作不同的类型,而且类型还不太确定,那么可以将泛型定义在方法上。

?:通配符,也可以理解为占位符。

七、Map

Map集合:该集合存储键值对,一对一往里存,而且要保证键的唯一性。

1、添加:
put(K key V value)
添加元素:如果添加元素时有相同的键,那么后添加的值会覆盖并返回原有键对应值。。

Map

|—–Hashtable:底层是哈希表数据结构,不可以存入null键和null值,该集合是线程同步的。JDK1.0,效率低。

|—-HashMap:底层是哈希表数据结构,允许使用null键和null值,该集合是不同步的。

|——TreeMap:底层是二叉树数据结构。线程不同步。可以用于给Map集合中的键进行排序。

Set底层就是使用了Map集合。

Map集合的两种取出方式:
1、SetketSet:将Map中所有的键存入到Set集合,因为Set集合具备迭代器,所以可以通过方式取出所有的键,然后用get()方法获取每一个键对应的值。
Map集合取出的原理:将map集合转成set集合,在通过迭代器取出。
2、Set