集合类
java.util包中提供了一些集合类,与数组类似,集合也被称为容器。它们的不同点是数组的长度是固定的,集合的长度是可变的,数组用来存放基本类型的数据,集合用来存放对象的引用。常用的集合有List,Map,Set,继承关系图如上。
1.Collection接口
Collection接口是层次结构中的根接口。Collection接口通常不能直接使用,不过它提供了增删改查数据的方法。由于List和Set接口都竭诚了Collection接口,所以它们也可以使用父类的方法。
常用的方法有:
add(E e) 添加对象
remove(Object o) 移除对象
isEmpty() 返回Boolean值,判断集合是否为空
iterator() 返回在此Collection的元素上进行迭代的迭代器,用于遍历
size() 返回值的类型是int,获取集合中元素的个数
示例:
import java.util.*;
class CollectionDemo
{
public static void main(String[] args)
{
Collection<String> list = new ArrayList<String>(); //实例化集合类对象
list.add("a"); //添加集合元素
list.add("b");
list.add("c");
Iterator<String>it = list.iterator(); //创建迭代器
while(it.hasNext()) //判断下一个元素是否为空
{
String str = (String)it.next(); //获取集合中的元素
System.out.println(str);
}
}
}
结果为
a
b
c
2.List集合
List集合包括List接口以及List接口的所有实现类。List集合中的元素是有序的,允许重复,因为该集合体系有索引。
因为List接口继承了Collection,所以父类有的它都有了。除此之外,还有几个非常重要的方法:
1 get(int index): 获得指定索引位置的元素
2 set(int index,Object obj): 将集合中指定索引位置的对象修改为指定的对象
List接口的实现类: 常用的有ArrayList和LinkedList
ArrayList类实现了可变的数组,它底层的数据结构也是数组。可以通过索引位置对集合进行快速的随机访问,缺点就是插入对象和删除对象的速度较慢。
LinkedList类采用的是链表结构,优点是插入和删除对象的速度快,但是随机访问集合元素的效率低,与ArrayList刚好相反。
示例:
import java.util.*;
class ListDemo
{
public static void main(String[] args)
{
List<String>list = new ArrayList<String>(); //创建集合对象
list.add("a");
list.add("b");
list.add("c");
list.add("d");
int i = (int)(Math.random()*(list.size()-1)); //获取0-3之间的随机数
System.out.println("随机获取数组中的元素:"+list.get(i));
list.remove(2); //将指定索引位置的元素从集合中移除
System.out.println("将索引是‘2’的元素从数组移动后,数组中的元素是:");
for(int j=0;j<list.size();j++){ //循环遍历集合
System.out.println(list.get(j));
}
}
}
Set集合中的对象不按特定的方式排序,只是简单的存储。不过Set集合中不能包含重复的对象。和List同理,Set接口继承了Collection接口的所有方法。
Set接口常用的实现类有HashSet类与TreeSet类:
HashSet类实现Set接口,是由哈希表支持。它不保证Set的迭代顺序,特别是它不保证该顺序恒久不变。此类允许使用null。
TreeSet类实现了Set接口,也实现了java.util.SortedSet接口,因此,TreeSet类实现的Set集合在遍历集合时按照自然顺序递增排序,也可以按照指定比较器递增排序。
TreeSet类增加的方法:
first() 返回Set中当前第一个元素
last() 返回Set中当前最后一个元素
comparator() 返回Set中进行排序的比较器,如果用的是自然顺序,就返回null
headSet(E toElement) 返回一个新的Set集合,新集合包含toElenment之前的所有对象
subSet(E fromElement,E fromElement) 返回一个新的Set集合,包含fromElement对象与fromElement对象之间的所有对象
注意: 返回的新的集合之类的,都是包含头,不包含尾的
对字符串进行长度的排序
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
public class TreeSetTest{
public static void main(String[] args){
TreeSet ts = new TreeSet(new ComparatorByLen()); //调用新的比较方法
ts.add( "aaaa"); //向集合中添加元素
ts.add( "zz");
ts.add( "nbag");
ts.add( "cba");
ts.add( "abc");
Iterator it = ts.iterator(); //迭代器创建
while(it.hasNext()){ //循环判断下一个元素是否为空
System.out.println(it.next());
}
}
}
class ComparatorByLen implements Comparator{
public int compare(Object o1,Object o2){
String s1 = (String)o1;
String s2 = (String)o2;
int temp = s1.length() - s2.length();
return temp == 0?s1.compareTo(s2):temp; //用三目运算符返回长的字符串
}
}
运行结果为:
4.Map集合
Map集合没有继承Collection接口,它提供的是key到value的映射。Map中不能包含相同的key,每个key只能映射一个value。
Map接口提供了将key映射到值的对象。除了常用的集合方法之外,还有另外的一些方法:
put(K key,V value) 向集合中添加指定的key和value的映射关系
containsKey(Object key) 如果此映射包含指定key的映射关系,则返回true
containValue(Obejet value) 如果此映射将一个或多个key映射到指定值,则返回true
get(Object key) 如果存在指定的key对象,则返回该对象对应的值,否则返回null
keySet() 返回该集合中的所有key对象形成的Set集合
values() 返回该集合中所有值对象形成的Collection集合
示例:
import java.util.*;
class MapDemo11
{
public static void main(String[] args)
{
Map<String,String>map = new HashMap<String,String>(); //创建Map实例
map.put("01","李同学"); //向集合中添加对象
map.put("02","张同学");
map.put("03","王同学");
map.put("04","赵同学");
Set<String> set = map.keySet(); //构建Map集合中所有key对象的集合
Iterator <String> it = set.iterator(); //创建集合迭代器
System.out.println("key集合中的元素:");
while(it.hasNext()) //遍历集合
{
System.out.println(it.next());
}
Collection<String>coll = map.values(); //构建Map集合中所有values值集合
it = coll.iterator();
System.out.println("values集合中的元素:");
while(it.hasNext()) //遍历集合
{
System.out.println(it.next());
}
}
}
输出结果: