集合框架(一)
一、Collection集合
1..首先我们来看看这张图:
这张图中反应了集合框架的整体结构。图中集合主要分为了Collection和Map,而Collection又分为List和Set,之后两者又可以细分。框架中包含了两个工具类Collections和Arrays,它们是集合类和数组所有工具,能实现排序,查找等操作。
2.Collection集合
Collection集合可分为List和Set,其中List是有序的,元素存入集合的顺序和取出的顺序一致,元素都有索引,元素可以重复。而Set集合是无序的,存入和取出的顺序可能不一致,不可以存储重复元素,必须保证元素的唯一性。
Collection集合一些常用方法:
1.添加:add(),addAll()
2.删除:clear(),remove(),删除集合中的指定对象,删除后,集合长度会改变。removeAll()
3.判断:contains(),isEmpty()
4.获取:size()
5.取交集:retainAll()
6.获取集合中的所有元素:Iterator iterator()
7.将集合变成数组:toArray()
3.Collection集合的遍历
通过Iterator来遍历Collection中的元素或对象。
通过while循环或者for循环。
Iterator it = list.iterator();
while(it.hasNext()){
sop(it.next());
}
for(Iterator it = list.iterator();it.hasNext();){
sop(it.next());
}
List:有序(元素存入集合的顺序和取出的顺序一致),元素都有索引。元素可以重复。
|--ArrayList:底层的数据结构是数组,线程不同步,ArrayList替代了Vector,查询元素的速度非常快。
|--LinkedList:底层的数据结构是链表,线程不同步,增删元素的速度非常快。
|--Vector:底层的数据结构就是数组,线程同步的,Vector无论查询和增删都巨慢。
由于List集合中的元素可以重复,那么如何去除其中的重复元素呢:
去除ArrayList中的相同元素:
List集合判断元素是否相同,依据是元素的equals方法。
1.定义一个ArrayList容器
2.将原集合中不同的元素通过add方法添加到新的ArrayList中去
public static ArrayList single(ArrayList list){
//新建一个临时容器
ArrayList list1 = new ArrayList();
//遍历ArrayList集合中的元素
Iterator it = list.iterator();
while(it.hasNext()){
Object obj = it.next();
if(!list1.contains(obj)){
list1.add(obj);
}
}
return list1;
}
从中我们还看到了遍历List集合的方式,是通过Iterator实现的。
而List集合还有它自己特有的迭代器
ListIterator listIterator():list集合特有的迭代器。
接下来,如何遍历Vector中的元素呢,可以通过Enumeration来实现:
Enumeration e = v.elements();
while(e.hasMoreElements()){
System.out.println(e.nextElement());
}
它的使用与Iterator类似。
三、Set集合
Set集合层次结构:
Set接口中的方法和Collection中方法一致的。Set接口取出方式只有一种,迭代器。
|--HashSet:底层数据结构是哈希表,线程是不同步的。无序,高效;
HashSet集合保证元素唯一性:通过元素的hashCode方法,和equals方法完成的。
当元素的hashCode值相同时,才继续判断元素的equals是否为true。
如果为true,那么视为相同元素,不存。如果为false,那么存储。
如果hashCode值不同,那么不判断equals,从而提高对象比较的速度。
|--LinkedHashSet:有序,hashset的子类。
|--TreeSet:对Set集合中的元素的进行指定顺序的排序。不同步。TreeSet底层的数据结构就是二叉树。
接下来看看HashSet中存储元素的唯一性:
HashSet hs = new HashSet();
hs.add("java01");
hs.add("java02");
hs.add("java03");
hs.add("java04");
hs.add("java01");
Iterator it = hs.iterator();
while(it.hasNext()){
Object obj = it.next();
sop(obj);//遍历后打印出的结果中自动除去重复的元素
}
通过对比我们能发现:
对于ArrayList集合,判断元素是否存在,或者删元素底层依据都是equals方法。
对于HashSet集合,判断元素是否存在,或者删除元素,底层依据的是hashCode方法和equals方法。
TreeSet通常用于对Set集合进行元素的指定顺序排序,排序要依据元素自身具备的比较性。
TreeSet排序有两种方式:
第一种:
让元素自身具有比较性。需要实现Comparable接口,覆盖compareTo方法。称这种方式为自然顺序。
//重写了compareTo方法
public int compareTo(Object obj){
if(!(obj instanceof Student))
throw new RuntimeException("不是学生对象");
Student s = (Student)obj;
if(this.age>s.age)
return 1;
if(this.age==s.age){
return this.name.compareTo(s.name);//字符串的比较
}
return -1;
}
第二种:
定义一个类,实现Comparator接口,覆盖compare方法。
定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。
public int compare(Object o1,Object o2){
Student s1 = (Student)o1;
Student s2 = (Student)o2;
int num = s1.getName().compareTo(s2.getName());//字符串的比较
if(num == 0){
return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
}
return num;
}
第二种比较的方式较为灵活。