1、集合其实可以看成为数组的扩展,它与数组的不同之处在于:
《1》 一个数组只允许存储一种类型的数据,而一个集合可以存储任一种对象类型数据;
简单的说一个集合类似一个 Object[] 数组,因为一切类的基类都为Object类,
所以一切类都可以隐式转换为Object类,然后存储到Object类型的数组中。
《2》数组的大小为固定的,而集合的大小却可以根据数据的多少来自动增加或减小;
《3》可以通过 泛型 <类型> 来使集合转换为类似数组的集合,如:
List<String> list=new ArrayList<String>();
该集合中就只能存储String类型的数据。
2、集合中的接口与类,以及他们的关系:
《1》Collection接口:
Collection(接口)
|
/ /
List(接口) Set(接口)
| |
/ / / /
ArrayList LinkedList HashSet SortedSet
|
TreeSet
《2》Map接口
Map(接口)
/ | /
SortedMap Hashtable HashMap
| |
TreeMap Properties
3、各种集合类的特征:
《1》list 有序排序的集合,可以有重复元素;
《2》ArrayList :顺序表存储,用于多 查询 的数据存储;
《3》LinkedList:链表存储,用于多 插入、删除 的数据存储;
《4》set 无序排列的集合,不能有重复元素;
《5》Map : 非线性排列,键值对存储(键唯一),<key>=<value>;
《6》Hashtable: 键与值都不允许存 NULL值,线程安全;
《7》HashMap: 键与值都允许存放 NULL 值,线程不安全。
4、集合中的 迭代器 Iterator :
Iterator 用于迭代获取一个集合中的数据,类似于数组中for迭代:
《1》数组中:有arr数组:
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
《2》集合中:有list集合:
Iterator it=list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
如果在arr与list中存储的数据一致,则《1》、《2》打印的效果一致;
注意:在Iterator 中调用it.next()相当与在for中同时执行了arr[i] 和 i++;
所以当我们要打印一个user对象的name和age时,我们不能执行:
Iterator it=list.iterator();
while(it.hasNext()){
System.out.println(it.next().getName());
System.out.println(it.next().getAge());
}
正确代码为:
Iterator it=list.iterator();
while(it.hasNext()){
User user=it.next();
System.out.println(user.getName());
System.out.println(user.getAge());
}
5、集合中元素的排序(这里只讲客户化排序即自定义排序):
《1》定义排序规则:
(1) 创建一个排序规则类实现 Comparator接口;
(2) 在该类中重写compare方法,定义排序规则;
《2》将集合排序:
(1) List集合的排序:Collections.sort(list, c);
c为 排序规则类 的对象;
List 先插入数据,再按定义的规则排序;
(2)TreeSet集合排序:Set set=new TreeSet(c) ;
c为 排序规则类 的对象;
TreeSet 先定义排序规则,再按规则插入数据;
6、set 中去重复数据:
虽然set不允许插入重复值,但由于set对对象是否重复是通过调用该对象中的equals
方法来判断的,所以我们要重写该类中的equals方法(参见:equals详解),
同时重写hashCode方法,使两个相同属性的对象返回相同的hashCode;
注意:由于TreeSet是先定义排序再插入数据的,所以当按排序规则排序后发现两个数据
的顺序相同,则将两个数据看成是重复的数据,则不插入,所以TreeSet中可以通
过排序规则来去重复数据。
7、实例代码:
《1》List
《2》Set