什么是Java集合?
为了保存数量不确定的数据,以及保存具有映射关系的数据(也被称为关联数组),Java提供了集合类。集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类,所有的集合类都位于java.util包下。
集合类和数组不一样,数组元素既可以是基本类型的值,也可以是对象(实际上保存的是对象的引用变量);而集合里只能保存对象(实际上只是保存对象的引用变量,但通常习惯上认为集合里保存的是对象)。
Java的集合类主要由两个接口派生而出:Collection和Map,Colloection和Map是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类。
Java的集合的作用?
Java集合类是一种特别有用的工具类,可用于存储数量不等的对象,并可以实现常用的数据结构,如栈、队列等。除此之外,Java集合还可用于保存具有映射关系的关联数组。Java集合大致可分为List、Set、Queue和Map四种体系,其中List代表有序、重复的集合;Set代表无序、不可重复的集合;而Map则代表具有映射关系的集合,Java5又增加了Queue体系 集合,代表一种队列集合实现。如下所示是java集合的简单结构图:
List常用方法:
返回值 | 方法(形参) | f说明 |
boolean | add(E e) | 向列表的尾部添加指定的元素。 |
void | add(int index,E element) | 在列表的指定位置插入指定元素。 |
boolean |
addAll(Collection c) | 添加指定collection中的所有元素到此列表的结尾,顺序是指定collection的迭代器返回这些元素的顺序。 |
boolean | addAll(int index,Collection c) | 将指定collection中的所有元素都插入到列表中的指定位置。 |
void | clear() | 从列表中移除所有元素。 |
Boolean | Contains(Object o) | 如果列表包含指定的元素,则返回true |
Boolean | ContainsAll(Collection c) | 如果列表包含指定collection的所有元素,则返回true。 |
Boolean | Equals(Object o) | 比较指定位置的元素。 |
E | Get(int index) | 返回列表中指定位置的元素 |
Int | hashCode() | 返回列表的哈希值 |
Int | indexOf(Object o) | 返回此列表中第一次出现的指定元素的索引;如果此列表不包含元素,则返回-1。 |
Boolean | isEmpty() | 如果列表不包含元素,则返回true。 |
Iterator | Iterator() | 返回按适当顺序在列表的元素上进行迭代的迭代器。 |
Int | lastIndexOf(Object o) | 返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回-1。 |
ListIterator | listIterator() | 返回此列表元素的列表迭代器(按适当顺序) |
ListIterator | listIterator(int index) | 返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始 |
E | Remove(int index) | 移除列表中指定的元素 |
Boolean | Remove(Object o) | 从此列表中移除第一次出现的指定元素(如果存在) |
Boolean | removeAll(Collection c) | 从列表中移除指定collection中包含的其所有元素。 |
Boolean | retainAll(Collection c) | 仅在列表中保留指定collection中所包含的元素。 |
E | Set(int index,E element) | 用指定元素替换列表中指定位置的元素。 |
Int | Size() | 返回列表中的元素数 |
List | subList(int fromIndex,int toIndex) | 返回列表中指定的fromIndex(包括)和toIndex(不包括)之间的部分视图 |
Object[] | toArray() | 返回按适当顺序包含列表中的所有元素的数组(从第一个元素到最后一个元素)。 |
T[] | toArray(T[] a) | 返回按适当顺序(从第一个元素到最后一个元素)包含列表中所有元素的数组;返回数组的运行时类型时指定数组的运行时类型 |
示例代码(以ArrayList为例)
public class ListDemo {
public static void main(String[] args) {
//list定义
// List list=new ArrayList();1.5之前的写法
List<String>list1=new ArrayList<String>();//<>里放的是类
//添加
list1.add("aa");list1.add("bb");list1.add("cc");
list1.add("dd");list1.add("ee");list1.add("ff");
//修改
list1.set(1, "bbb");
//删除
list1.remove(0);list1.remove("cc");
//遍历list
for (int i = 0; i < list1.size(); i++) {
System.out.print(list1.get(i)+"\t");//get 获取集合里的一个对象
}
System.out.println();
for (String string : list1) {
System.out.print(string+"\t");
}
Iterator<String>it=list1.iterator();
while(it.hasNext()){
System.out.print(it.next()+"\t");
}
//排序
Collections.sort(list1,new Comparator<String>(){
@Override
public int compare(String o1,String o2){
return o1.compareTo(o2);
}
});
System.out.println();
System.out.println(list1);
}
}
Comparable和Comparator
- Comparable简介
Comparable是排序接口。若一个类实现了Comparable接口,就意味着该类支持排序。实现了Comparable接口的类对象的列表或者数组可以通过Collection.sort或Arrays.Sort进行自动排序。
此外,实现此接口的对象可以用有序映射中的键有序集合中的集合,无序指定比较器。
此接口只有一个方法compare,比较此对象与指定对象的顺序,如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
- Comparator简介
Comparator是比较接口,我们如果需要控制某个类的次序,而该类本身不支持排序(既没有实现Comparable接口),name我们就可以建立一个“该类的比较器”来进行排序,这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过实现Comparator来新建一个比较器,然后通过这个比较器对类进行排序。
注意:
若一个类要实现Comparator接口:它一定要实现compare(T o1,T o2)函数,但可以不实现equals(Object obj)函数。
Int compare(T o1,T o2)是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。
- Comparable和Comparator区别比较
Comparable是排序接口,若一个类实现了Comparable接口,就意味着“该类支持排序”。Comparable是比较器,我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。
用Comparable简单,只要实现Comparable接口的对象直接就成为一个可以比较的对象,但是需要修改源代码。用Comparator的好处是不需要修改源代码,而是另外实现一个比较器,当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了,并且在Comparator里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。