三、集合(collection、set、list、map)
一、定义:
集合是Java里面最常用的,也是最重要的一部分。能够用好集合和理解好集合对于做Java程序的开发拥有无比的好处。
容器:用来存储数据,不同的容器集合以不同的格式保存对象,它能够自动的改变这个容器的所能存放的数据数量的大小。这一点上,如果使用数组来存储的话,就显得十分的笨拙。
对于对象集合,必须执行的操作主要以下三种:
? 添加新的对象
? 删除对象
? 查找对象
Java容器类类库的用途是“保存对象”,并将其划分为两个不同的概念:
1) Collection 。 一组对立的元素,通常这些元素都服从某种规则。List必须保持元素特定的顺序,而Set 不能有重复元素。
2) Map 。 一组 成对的“键值对”对象。
? Collection – 对象之间没有指定的顺序,允许重复元素。
? Set – 对象之间没有指定的顺序,不允许重复元素
? List– 对象之间有指定的顺序,允许重复元素,并引入位置下标。
? Map – 接口用于保存关键字(Key)和数值(Value)的集合,集合中的每个对象加入时都提供数值和关键字。Map 接口既不继承 Set 也不继承 Collection。
List、Set、Map共同的实现基础是Object数组
1.2.Collection
1.2.1常用方法
Collection 接口用于表示任何对象或元素组。想要尽可能以常规方式处理一组元素时,就使用这一接口。Collection 在前面的大图也可以看出,它是List和Set 的父类。并且它本身也是一个接口。它定义了作为集合所应该拥有的一些方法。如下:
注意:
集合必须只有对象,集合中的元素不能是基本数据类型。
Collection接口支持如添加和除去等基本操作。设法除去一个元素时,如果这个元素存在,除去的仅仅是集合中此元素的一个实例。
? boolean add(Object element)
? boolean remove(Object element)
Collection 接口还支持查询操作:
? int size()
? boolean isEmpty()
? boolean contains(Object element)
? Iterator iterator()
组操作 :Collection 接口支持的其它操作,要么是作用于元素组的任务,要么是同时作用于整个集合的任务。
? boolean containsAll(Collection collection)
? boolean addAll(Collection collection)
? void clear()
? void removeAll(Collection collection)
? void retainAll(Collection collection)
containsAll() 方法允许您查找当前集合是否包含了另一个集合的所有元素,即另一个集合是否是当前集合的子集。其余方法是可选的,因为特定的集合可能不支持集合更改。 addAll() 方法确保另一个集合中的所有元素都被添加到当前的集合中,通常称为并。 clear() 方法从当前集合中除去所有元素。 removeAll() 方法类似于 clear() ,但只除去了元素的一个子集。 retainAll() 方法类似于 removeAll() 方法,不过可能感到它所做的与前面正好相反:它从当前集合中除去不属于另一个集合的元素,即交。
集合类的基本方法的使用:
import java.util.*;
public class CollectionToArray {
public static void main(String[] args) {
Collection collection1=new ArrayList();//创建一个集合对象
collection1.add(“000”);//添加对象到Collection集合中
collection1.add(“111”);
collection1.add(“222”);
System.out.println(“集合collection1的大小:”+collection1.size());
System.out.println(“集合collection1的内容:”+collection1);
collection1.remove(“000”);//从集合collection1中移除掉 “000” 这个对象
System.out.println(“集合collection1移除 000 后的内容:”+collection1);
System.out.println(“集合collection1中是否包含000 :”+collection1.contains(“000”));
System.out.println(“集合collection1中是否包含111 :”+collection1.contains(“111”));
Collection collection2=new ArrayList();
collection2.addAll(collection1);//将collection1 集合中的元素全部都加到collection2中
System.out.println(“集合collection2的内容:”+collection2);
collection2.clear();//清空集合 collection1 中的元素
System.out.println(“集合collection2是否为空 :”+collection2.isEmpty());
//将集合collection1转化为数组
Object s[]= collection1.toArray();
for(int i=0;i
1.3 List
1.3.1概述
Collection接口实际上并没有直接的实现类。而List是容器的一种,表示列表的意思。当我们不知道存储的数据有多少的情况,
我们就可以使用List 来完成存储数据的工作。例如保存一个应用系统当前的在线用户的信息。List的最大的特点就是能够自动
的根据插入的数据量来动态改变容器的大小。
1.3.2 常用方法
List 就是列表的意思,它是Collection 的一种,即继承了 Collection 接口,又定义一个允许重复项的有序集合。该接口不但
能够对列表的一部分进行处理,还添加了面向位置的操作。List 是按对象的进入顺序进行保存对象,而不做排序或编辑操作。它
除了拥有Collection接口的所有的方法外还拥有一些其他的方法。面向位置的操作包括插入某个元素或 Collection 的功能,还
包括获取、除去或更改元素的功能。在 List 中搜索元素可以从列表的头部或尾部开始,如果找到元素,还将报告元素所在的位置。
1、 void add(int index, Object element):添加对象element到位置index上
2、 boolean addAll(int index, Collection collection):在index位置后添加容器collection中所有的元素
3、 Object get(int index) :取出下标为index的位置的元素
4、 int indexOf(Object element) :查找对象element 在List中第一次出现的位置
5、 int lastIndexOf(Object element) :查找对象element 在List中最后出现的位置
6、 Object remove(int index) :删除index位置上的元素
7、 Object set(int index, Object element) :将index位置上的对象替换为element 并返回老的元素。
List(提供基于索引的对成员的随机访问)——ArrayList—–提供快速的基于索引的成员访问,对尾部成员的增加和删除支持较好
成员可为任意Object子类的对象
———-LinkedList—–对列表中任何位置的成员的增加和删除支持较好,但对基于索引的成员访问支持性能较差
成员可为任意Object子类的对象
在“集合框架”中有两种常规的 List 实现:ArrayList 和 LinkedList。使用两种 List 实现的哪一种取决于您特定的需要。如果要
支持随机访问,而不必在除尾部的任何位置插入或除去元素,那么,ArrayList 提供了可选的集合。但如果,您要频繁的从列表的中间
位置添加和除去元素,而只要顺序的访问列表元素,那么,LinkedList 实现更好。
LinkedList 来实现一个简单的队列的例子:
import java.util.*;
public class ListExample {
public static void main(String args[]) {
LinkedList queue = new LinkedList();
queue.addFirst(“Bernadine”);
queue.addFirst(“Elizabeth”);
queue.addFirst(“Gene”);
queue.addFirst(“Elizabeth”);
queue.addFirst(“Clara”);
System.out.println(queue);
queue.removeLast();
queue.removeLast();
System.out.println(queue);
}
}
运行程序产生了以下输出。请注意,与 Set 不同的是 List 允许重复。
[Clara, Elizabeth, Gene, Elizabeth, Bernadine]
[Clara, Elizabeth, Gene]
该的程序演示了具体 List 类的使用。第一部分,创建一个由 ArrayList 支持的 List。填充完列表以后,特定条目就得到了。示例
的 LinkedList 部分把 LinkedList 当作一个队列,从队列头部添加东西,从尾部除去。
List 接口不但以位置友好的方式遍历整个列表,还能处理集合的子集:
ListIterator listIterator() :返回一个ListIterator 跌代器,默认开始位置为0
ListIterator listIterator(int startIndex) :返回一个ListIterator 跌代器,开始位置为startIndex
List subList(int fromIndex, int toIndex) :返回一个子列表List ,元素存放为从 fromIndex 到toIndex之前的一个元素。
处理 subList() 时,位于 fromIndex 的元素在子列表中,而位于 toIndex 的元素则不是,提醒这一点很重要。
for-loop :
for (int i=fromIndex; i
1.4.Collection 和 Collections的区别
Collection是个java.util下的接口,它是各种集合结构的父接口。继承与他的接口主要有Set 和List.
Collections是个java.util下的专用静态类,它包含有各种有关集合操作的静态方法。提供一系列静态
方法实现对各种集合的搜索、排序、线程安全化等操作。
1.5.Array与Arrays的区别
1.数组类Array,是Java中最基本的一个存储结构。提供了动态创建和访问 Java 数组的方法。其中的
元素的类型必须相同。效率高,但容量固定且无法动态改变。 它无法判断其中实际存有多少元素,
length只是告诉我们array的容量。
2、Arrays类,此静态类专门用来操作array ,提供搜索、排序、复制等静态方法。equals():比较两个
array是否相等。array拥有相同元素个数,且所有对应元素两两相等。 sort():用来对array进行排序。
binarySearch():在排好序的array中寻找元素。
collections
例:
import java.util.*;
public class CollectionsDemo {
public static void main(String[] args) {
List sl = new ArrayList();
sl.add(“jhn”);
sl.add(“ncgcxs”);
sl.add(“rgd”);
sl.add(“ceaz”);
sl.add(“vfe”);
sl.add(“byt”);
sl.add(“fe”);
Collections.sort(sl);
System.out.println(sl);
//Collections.binarySearch(1);
//Collections.copy(sl);
System.out.println(Collections.max(sl));//max
System.out.println(Collections.min(sl));//min
Collections.reverse(sl);//反转
System.out.println(sl);
Collections.shuffle(sl);//打散
System.out.println(sl);
}
HashMap遍历的两种方式
第一种:
Map map = new HashMap();
Iterator iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
}
效率高,以后一定要使用此种方式!
第二种:
Map map = new HashMap();
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
Object key = iter.next();
Object val = map.get(key);
}
效率低,以后尽量少使用!
HashMap 与 TreeMap的区别
集合框架”提供两种常规的Map实现:HashMap和TreeMap (TreeMap实现SortedMap接口)。在Map
中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那
么TreeMap会更好。使用HashMap要求添加的键类明确定义了hashCode()和equals()的实现。这个TreeMap
没有调优选项,因为该树总处于平衡状态。