一、集合的概念
集合可以看做是一个存储对象的容器,与数组不同的是集合可以存储不同类型的对象,但开发中一般不这样做。集合不能存储基本类型的对象,如果存储则需要将其转化为对应的包装类。
二、集合的分类
集合分为 Collection 和 Map 两大接口,具体的实现类继承自这两大接口。
(一)Collection 接口
Collection 接口下面有 3 个子接口,可以视为 3 个分支,常用的是 List 接口和 Set 接口:
1、List 子接口
特点:存放的数据有序且允许重复,主要的实现类有 ArrayList(重点)、LinkedList、Vector,这三个实现类用法相同,具体可见:java —— ArrayList 使用方法
区别:LinkedList 增加了 .addFirst() 方法和 .addLast() 方法,分别表示在首尾添加。
public static void main(String[] args)
{
LinkedList list=new LinkedList();
list.add("Tom");
list.add("Jerry");
list.addFirst("Spike");
list.addLast("Snoopy");
System.out.println(list.get(0));
System.out.println(list.get(list.size()-1));
}
2、Set 子接口
特点:存放的对象无序且不允许重复,方法与 ArrayList 相同,但由于无序,因而没有 .get() 方法,常见的实现类有 HashSet、TreeSet。
区别:HashSet 内部对象散列存放,完全无序;TreeSet 内部按照自然升序排列,与添加的先后顺序无关。自定义的类如果要在 TreeSet 内部实现自然排序,要么实现 Comparable 接口,要么自定义 Comparator 比较器。
(二)Map 接口
特点:Map 接口的实现类采用键值对的形式存储对象,主要的实现类是 HashMap、TreeMap、HashTable。虽然内部存储无序,但由于有键值对的存在,可以通过 .get(key k) 的方法获取元素。
区别:HashMap 允许键出现一次“null”,值允许为空;TreeMap 内部按照键的自然升序排列,键不允许为“null”,值允许为空;HashTable 键和值都不允许为空。
常用方法:
.containsKey(key k) | 判断是否包含指定的键 |
.containsValue(value v) | 判断是否包含指定的值 |
.get(key k) | 根据键获取值 |
.isEmpty() | 判断是否为空 |
.keySet() | 返回一个set集合,包含所有的键 |
.values() | 返回一个collection集合,包含所有的值 |
.put(key k,value v) | 添加元素 |
.putAll(Map m) | 将集合m添加至本集合 |
.remove(key k,value v) | 根据键删除值 |
.size() | 获取集合长度 |
三、服务集合的三大工具
(一)Iterator 迭代器
用法可见:java —— ArrayList 使用方法 中的 “八、迭代器”。
(二)Comparable 接口和 Comparator 比较器
用法可见:java —— Comparable 接口和 Comparator 比较器
(三)Collections 工具类
Collections 是一个操作 List、Set、Map 等集合的工具类,它提供了一系列静态方法用于对集合执行查询、排序、修改等操作。
1、排序
① 升序:Collections.sort(List list)
② 降序:Collections.reverse(List list)
③ 随即排列:Collections.shuffle(List list)
public static void main(String[] args)
{
ArrayList<Integer> ar=new ArrayList();
ar.add(5);
ar.add(4);
ar.add(7);
//升序
Collections.sort(ar);
Iterator ite1=ar.iterator();
while(ite1.hasNext())
{
System.out.println(ite1.next());
}
//降序
Collections.reverse(ar);
Iterator ite2=ar.iterator();
while(ite2.hasNext())
{
System.out.println(ite2.next());
}
//随即排列
Collections.shuffle(ar);
Iterator ite3=ar.iterator();
while(ite3.hasNext())
{
System.out.println(ite3.next());
}
}
2、 修改
① 交换:Collections.swap(List list,int i,int j)
public static void main(String[] args)
{
ArrayList<Integer> ar=new ArrayList();
ar.add(5);
ar.add(4);
ar.add(7);
Collections.swap(ar,0,2); //将索引0和2的元素进行交换
Iterator ite=ar.iterator();
while(ite.hasNext())
{
System.out.println(ite.next());
}
}
② 填充:Collections.fill(List list, Object obj)
public static void main(String[] args)
{
ArrayList<Integer> ar=new ArrayList();
ar.add(5);
ar.add(4);
ar.add(7);
Collections.fill(ar,10); //将集合内元素变成10
Iterator ite=ar.iterator();
while(ite.hasNext())
{
System.out.println(ite.next());
}
}
3、使集合不可变
public static void main(String[] args)
{
ArrayList<Integer> ar=new ArrayList();
ar.add(5);
ar.add(4);
ar.add(7);
Collection cc=Collections.unmodifiableCollection(ar);
//将集合不可变并返回一个集合cc,此时cc不能执行任何变更
}