类集框架:List、Set、Map、Iterator、Comparator(重点)

本文详细介绍了Java中的集合框架,包括类集框架的作用、实现工具及其使用方法。文章通过多个示例对比了不同集合类型的特性,如TreeSet和HashSet的排序差异、TreeMap和HashMap的输出顺序,并展示了如何通过自定义比较器实现反序输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、类集框架作用

类集框架包含了一组标志接口,用户通过这些接口方便对基本类集(动态数组、链接表、树)进行高效率的实现。Java为类集框架提供了几个标准的实现工具,例如LinkedList、HashSet、TreeSet等,具体如下:

注意:Collection、Set、List都有iterator()方法,因此继承它们的类(TreeSet、HashSet、ArryList、LinkedList)和实现它们的接口(SortedSet)都保留了此方法,都可以通过迭代器iterator()进行迭代输出。一般的,实例化集合时,通常使用如下方法:

Set set = new HashSet();

Set set = new TreeSet();

List list = new ArryList();

List list = new LinkedList();由上可见,对象引用一般为Set和List。




注意:所有的映射都没有iterator()方法,因此若如果对映射进行迭代输出,则应先通过Map中的方法,转换为Set类型,再用集合的iterator()方法。


Map:

二、实现工具简介:

Collection——集合,传入参数为1个:

1.Collection为最大的接口,含有一个迭代器的方法iterator(),因此可通过迭代器对集合中的元素按照一定顺序排序;

2.TreeSet和SortedSet定义的集合,使用迭代器输出集合元素时,会按照自然顺序输出;也可定义一个实现比较规则(Comparator接口)的类,复写比较方法public int compare(Object o1, Object o2),根据返回值(-1,0,1)实现正序反序的输出;

3.其他的实现工具,使用迭代器输出集合元素时,顺序不确定(即使定义了比较规则,输出顺序也是不确定的)。


Map——映射,传入参数为2个(Key和Value):

1.Map为最大的接口,不含有迭代器方法iterator(),因此元素输出时不方便,需要转换为集合,才可使用此迭代方法;

2.Map映射含有的方法中,有2个方法的返回值为set集合:

Set<Map.Entry<K,V>> entrySet()   返回此映射中包含的映射关系的 set 视图。返回的 set 中的每个元素都是一个 Map.Entry类型
Set<K> keySet()   返回此映射中包含的键的 set 视图。返回的 set 中的每个元素都是一个 K类型

3.TreeMap和SortedMap在不定义比较规则(Comparator接口),使用迭代器输出映射元素时,会按照自然顺序输出;也可定义一个实现比较规则(Comparator接口)的类,复写比较方法public int compare(Object o1, Object o2),根据返回值(-1,0,1)实现正序反序的输出;

4.其他实现工具,使用使用迭代器输出集合元素时,顺序不确定(即使定义了比较规则,输出顺序也是不确定的)。


三、示例

1.TreeSet和HashSet的输出比较

import java.util.*;
class SetDemo 
{
public static void main(String[] args) 
{
Set set= new TreeSet();
set.add("a");
set.add("b");
set.add("c");
set.add("d");
for(Iterator iter = set.iterator();iter.hasNext();)
{
String s = (String)iter.next();
System.out.print(s+“  ”);
}

}
}

输出:a  b  c  d  

可以看出按默认的自然顺序输出

若把实例化定义为:Set set= new HashSet();

输出:d  b  c  a   

可以看出排序不规则


2.TreeSet实现反序输出

由于TreeSet含有一个输入参数为比较器的构造方法(注意:其他类(HashSet、LinkedList、ArryList)不含有此构造方法,也就是说只有TreeSet才可实现集合的反序排列):

public TreeSet(Comparator<? super E> c)   构造一个新的空 set,该 set 根据指定的比较器进行排序。

因此可以通过设置比较器,实现TreeSet集合中元素的反序排列。

import java.util.*;
class SetDemo 
{
public static void main(String[] args) 
{
Set set= new TreeSet(new MyComparator());
set.add("a");
set.add("b");
set.add("c");
set.add("d");
for(Iterator iter = set.iterator();iter.hasNext();)
{
String s = (String)iter.next();
System.out.print(s+"  ");
}

}
}
class MyComparator implements Comparator
{
public int compare(Object o1, Object o2)
{
String s1 = (String)o1;
String s2 = (String)o2;
return -s1.compareTo(s2); //或者 return s2.compareTo(s1);
}
}


结果:d  c  b  a


3.TreeMap和HashMap的输出比较

import java.util.*;
class  TreeMapAndHashMapDemo
{
public static void main(String[] args) 
{
Map map = new TreeMap();
map.put("a",new Integer(1));
map.put("b",new Integer(2));
map.put("c",new Integer(3));
map.put("d",new Integer(4));


Set set= map.entrySet();


for(Iterator iter = set.iterator();iter.hasNext();)
{
Map.Entry mapEntry = (Map.Entry)iter.next();


String key = (String)mapEntry.getKey();
Integer value =  (Integer)mapEntry.getValue();


System.out.print(key+", "+value);
System.out.println();
}

}
}

结果:

a, 1

b, 2

c, 3

d, 4   可见,按照自然顺序排列

若把实例化Map map = new TreeMap();换成 Map map = new HashMap();

结果:

d, 4

b, 2

c, 3

a, 1  可见,排列顺序不规则


4.TreeMap实现反序输出

由于TreeMap含有一个输入参数为比较器的构造方法(注意:其他类(HashMap)不含有此构造方法,也就是说只有TreeMap才可实现集合的反序排列):

public TreeMap(Comparator<? super K> c)  构造一个新的空映射,该映射根据给定的比较器进行排序。

因此可以通过设置比较器,实现TreeMap映射中元素的反序排列。


import java.util.*;
class  MapDemo
{
public static void main(String[] args) 
{
Map map = new TreeMap(new MyComparator());
map.put("a",new Integer(1));
map.put("b",new Integer(2));
map.put("c",new Integer(3));
map.put("d",new Integer(4));


Set set= map.entrySet();


for(Iterator iter = set.iterator();iter.hasNext();)
{
Map.Entry mapEntry = (Map.Entry)iter.next();


String key = (String)mapEntry.getKey();
Integer value =  (Integer)mapEntry.getValue();


System.out.print(key+", "+value);
System.out.println();
}


}
}


class MyComparator implements Comparator
{
public int compare(Object o1, Object o2)
{
String s1 = (String)o1;
String s2 = (String)o2;
return -s1.compareTo(s2);
}
}


结果:

d, 4

c, 3

b, 2

a, 1

5.Map通过迭代器输出时向Set的转换的两种方式

①通过keySet()方法

import java.util.*;
class  MapDemo
{
public static void main(String[] args) 
{
Map map = new TreeMap(new MyComparator());
map.put("a",new Integer(1));
map.put("b",new Integer(2));
map.put("c",new Integer(3));
map.put("d",new Integer(4));

Set set= map.keySet();

for(Iterator iter = set.iterator();iter.hasNext();)
{
String key = (String)iter.next();
Integer value = (Integer)map.get(key);


System.out.print(key+", "+value);
System.out.println();
}


}
}


class MyComparator implements Comparator
{
public int compare(Object o1, Object o2)
{
String s1 = (String)o1;
String s2 = (String)o2;
return -s1.compareTo(s2);
}
}

结果:

d, 4

c, 3

b, 2

a, 1


②通过entrySet()方法

详见示例4。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值