1.Java集合概述
Java 中的集合大致上可分为4种体系,分别是Set,List,Map和Queue,具体说明如下所示。
- Set:代表无序、不可重复的集合。
- List:代表有序,重复的集合。
- Map:代表具有映射关系的集合。
- Queue:从JDK1.5以后增加的一种体系集合,代表一种队列集合实现。
Java集合就像一种容器,可以把多个对象(实际上是对象的引用,但习惯上都称对象)“丢进”该容器中。
在JDK 1.5之前,Java集合会丢失容器中所有对象的数据类型,把所有对象都当成Object 类型处理,从JDK1.5增加了泛型以后,Java集合可以记住容器中对象的数据类型,从而可以编写更简洁,健壮的代码。
很大程度上,一旦理解了接口就能够理解整个框架。虽然总要创建接口特定的实现,但访问实际集合的方法应该限制在接口的使用上。着允许我们更改基本的数据结构而不必改变其他代码。
Java集合框架中主要存在如下对象
接口 | 概念作用 |
---|---|
Collection | 接口是一组允许重复的对象 |
Set接口 | 继承与Collettion,但不允许重复,使用自己内部的一个排列机制 |
List接口 | 继承于Collection,允许重复,以元素安插的次序来放置元素,不会重新排列 |
Map接口 | 是一组成对的键-值对象,即所只有的是Key-value pairs。Map中不能有重复的key,它拥有自己的内部排列机制 |
容器中的元素都为Object,从容器取得元素时必须将它转换成原来的类型
2.Collection接口和Iterator接口
Collection接口用于表示任何对象或者元素组,想要尽可能的以常规方式处理一组元素时,就使用这一接口。
2.1 基础知识介绍
在Collection接口中主要存在如下类别的功能方法。
(1)单元素添加、,删除操作。
- boolean add(Object o):将对象添加给集合。
- boolean remove(Object o):如果集合中有与o相匹配的对象,则删除对象o。
(2)查询操作。
- int size:返回当前集合中元素的数量。
- boolean isEmpty():判断集合中是否有任何元素。
- boolean contains(Object o):查找集合中是否含有对象o。
- Iterator iterator():返回一个迭代器,用来访问集合中的各个元素。
(3)组操作(作用于元素组或整个集)。
- boolean containsAll(Collection c):查找集合中是否含有集合c中所有元素。
- boolean addAll(Collection c):将集合c中所有元素添加给该集合。
- void clear():删除集合中所有元素。
- void removeAll(Collection c):从集合中删除集合c中的所有元素。
- void retainAll(Collection c):从集合中删除集合c中不包含的元素。
(4)将Collection 转换为 Object 数组。
- Object[] toArray():返回一个内含集合所有元素的 array.
- Object[] toArray(Object[] a):返回一个内含集合所有元素的array。运行期间返回的array 和参数a的类型相同,需要转换为正确的类型。
方法摘要
- boolean add(E e)
确保此 collection 包含指定的元素(可选操作)。 - boolean addAll(Collection<? extends E> c)
将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。 - void clear()
移除此 collection 中的所有元素(可选操作)。 - boolean contains(Object o)
如果此 collection 包含指定的元素,则返回 true。 - boolean containsAll(Collection<?> c)
如果此 collection 包含指定 collection 中的所有元素,则返回 true。 - boolean equals(Object o)
比较此 collection 与指定对象是否相等。 - int hashCode()
返回此 collection 的哈希码值。 - boolean isEmpty()
如果此 collection 不包含元素,则返回 true。 - Iterator iterator()
返回在此 collection 的元素上进行迭代的迭代器。 - boolean remove(Object o)
从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。 - boolean removeAll(Collection<?> c)
移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。 - boolean retainAll(Collection<?> c)
仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。 - int size()
返回此 collection 中的元素数。 - Object[] toArray()
返回包含此 collection 中所有元素的数组。 - T[] toArray(T[] a)
返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。
由于一个接口实现必须实现所有的接口方法,因此调用程序就需要一种途径来知道一个可选的方法是否受支持;
如果选择的方法不受支持,就会抛出UnsupportedOperationException异常表示操作失败,这个异常继承于RuntimeException类,避免了将所有集合操作放入try-catch块中
类 AbstractCollection
此类提供 Collection 接口的骨干实现,以最大限度地减少了实现此接口所需的工作。
要实现一个不可修改的 collection,编程人员只需扩展此类,并提供 iterator 和 size 方法的实现。(iterator 方法返回的迭代器必须实现 hasNext 和 next。)
要实现可修改的 collection,编程人员必须另外重写此类的 add 方法(否则,会抛出 UnsupportedOperationException),iterator 方法返回的迭代器还必须另外实现其 remove 方法。
按照 Collection 接口规范中的建议,编程人员通常应提供一个 void (无参数)和 Collection 构造方法。
此类中每个非抽象方法的文档详细描述其实现。如要实现的 collection 允许更有效的实现,则可以重写这些方法中的每个方法。
Iterator接口
能够迭代的访问集合中的各个元素,并安全的从Collection除去适当的元素
- boolean hasNext():判断是否存在另一个可访问的元素
- Object next():返回要访问的下一个元素。如果到达集合末尾,则抛出NoSuchElement Exception异常。
- void remove():删除上次访问返回的对象。必须紧跟在一个元素的访问后执行,如果集合已经被修改,则返回IllegalStateException异常。
使用Collection方法操作集合里的元素
import java.util.*;
public class yongCollection
{
public static void main(String[] args)
{
Collection c = new ArrayList();
//添加元素
c.add("美美");
//虽然集合里不能放基本类型的值,但Java支持自动装箱
c.add(6);
System.out.println("集合c的元素个数为:" + c.size());
//删除指定元素
c.remove(6);
System.out.println("集合c的元素个数为:" + c.size());
//判断是否包含指定字符串
System.out.println("集合c的是否包含美美字符串:" + c.contains("美美"));
c.add("android江湖");
System.out.println("集合c的元素:" + c);
Collection books = new HashSet();
books.add("android江湖");
books.add("会当凌绝顶");
System.out.println("集合c是否完全包含books集合?" + c.containsAll(books));
//用c集合减去books集合里的元素
c.removeAll(books);
System.out.println("集合c的元素:" + c);
//删除c集合里所有元素
c.clear();
System.out.println("集合c的元素:" + c);
//books集合里只剩下c集合里也同时包含的元素
books.retainAll(c);
System.out.println("集合books的元素:" + books);
}
}
运行结果为
集合c的元素个数为:2
集合c的元素个数为:1
集合c的是否包含美美字符串:true
集合c的元素:[美美, android江湖]
集合c是否完全包含books集合?false
集合c的元素:[美美]
集合c的元素:[]
集合books的元素:[]
3.Set接口
Set集合同Collection基本类似,它没有提供任何额外的方法。可以说Set就是一个Collection,只不过其行为不同。
Set不允许包含相同的元素,如果试图把两个相同元素加入同一个Set集合中,则添加操作失败,add方法会返回false,并且不会增加元素。
3.1 基础知识介绍
1.Hash表
Hash表是一种数据结构,用于查找对象。Hash表为每个对象计算出一个整数,称为Hash Code(哈希码)
如果Hash表中的元素放的太满,就必须进行rehashing(再哈希)
2.Comparable接口和Comparator接口
(1) Comparable接口
在包java.lang中,接口Comparable适用于一个类有自然顺序的时候。假定对象集合是同一类型,该接口允许我们把集合排序城自然顺序;
其中方法int compareTo(Object o)
用于比较当前实例对象与对象o。如果位于对象o之前,则返回负值;如果两个对象在排序中位置相同,则返回0;如果位于对象o后面,则返回正值。
8种基本类型的自然排序
类 | 排序 |
---|---|
BigDecimal、BigInteger、Byte、Double、Float、Integer、Long、Short | 按数字大小排序 |
Character | 按Unicode值的数字大小排序 |
String | 按字符串中字符Unicode值排序 |
利用Comparable接口创建自己的类排序的过程,只是实现comparableTo()方法的问题。通常是依赖几个数据成员的自然排序。同时类也应该覆盖equals()和hashCode()以确保两个相等的对象返回同一个哈希码。
(2) Comparable接口
如果不能够实现java.lang.Comparable
,或者不喜欢默认的Comparable
行为,可以使用Comparator
接口来定义一个比较器
方法 | 作用 |
---|---|
int compare(T o1,T o2) | 比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。 |
boolean equals(Object obj) | 指示某个其他对象是否“等于”此 Comparator |
(3) SortedSet接口