Java集合框架
在很多时候我们需要统计数据时会常用数组来完成,但是数组在处理一些问题时存在明显的缺陷,而集合完全弥补了数组的缺陷,它比数组更灵活更实用,可大大提高软件的开发效率,并且不同的集合可适用于不同的场合。
集合框架是为表示和操作集合而规定的一种统一的标准系结构,它包含三大部分:对外的接口、接口的实现和对集合运算的算法。
接口:表示集合的抽象数据类型,如Collection、List、Set、Map、Iterator。
实现:集合框架中接口的具体实现,如:ArrayList、LinkList、HashMap、HashSet。
算法:计算方法,如查找、排序等,如工具类Collections。
Java集合框架共有三大类接口:List、Set、Map。其中,Set和List拥有一个共同的父接口Collection接口。集合如果要限定数据类型,只能放引用数据类型。
一、List接口
List接口继承Collection接口,存储一组不唯一(允许重复)、有序的对象。
1、ArrayList
ArrayList在new对象时,可以限定数据类型,也可以不限定,它的语法以及常用方法是:
List list = new ArrayList(); //此行创建对象的代码也可以限定数据类型
ArrayList<String> list = new ArrayList<String>(); //此行创建对象的代码也可以不限定数据类型
//常用方法
list.add(Object); //添加数据
list.add(int,Object); //在指定位置添加数据
list.get(下标); //取数据,下标从0开始到【长度-1】结束
list.size(); //得到长度
list.contains(Object); //判断列表中是否存在指定元素
list.remove(int/Object); //删除值,删除值和下标都是用remove,根据参数的数据类型来判断是值还是下标
list.clear(); //清空所有值
它的遍历方式是:
for(int i = 0; i < 对象名.size(); i++){
System.out.print(对象名.get(i));
}
//foreach的方式:
for(int num:对象名){
System.out.print(num);
}
2、LinkedList
LinkedList和ArrayList有一点点的不一样,因为它是采用链式存储规则,前一个会有一个指针指向下一个值对的存储单位,像火车车厢一样,而ArrayList采用的存储方式类似于数组。它适用于集合数据频繁修改,但不适用于频繁的读、遍历操作的集合。
LinkedList的语法及常用方法有:
List list = new LinkedList(); //此行创建对象的代码也可以限定数据类型
LinkedList<String> list = new LinkedList<String>(); //此行创建对象的代码也可以不限定数据类型
//常用方法
list.add(Object); //添加数据
list.add(int,Object); //在指定位置添加数据
list.get(下标); //取数据,下标从0开始到【长度-1】结束
list.size(); //得到长度
list.contains(Object); //判断列表中是否存在指定元素
list.remove(int/Object); //删除值,删除值和下标都是用remove,根据参数的数据类型来判断是值还是下标
list.clear(); //清空所有值
//除此之外,LinkedList还有属于自己的扩展方法
list.addFirst(); //在集合的最前面插入元素
list.addLast(); //在集合的最后面插入元素
list.getFrist(); //获取第一个元素
list.getLast(); //获取最后一个元素
list.removeFrist(); //删除第一个元素
list.removeLast(); //删除最后一个元素
它的遍历方式是:
for(int i = 0; i < 对象名.size(); i++){
System.out.print(对象名.get(i));
}
//foreach的方式:
for(int num:对象名){
System.out.print(num);
}
二、Set接口
Set接口存储的是一组唯一(不允许重复)、无序的对象。它的操作、创建对象以及方法都是类似于List,这里就不在赘述它的语法及常用方法了。
1、HashSet
HashSet存储方式类似于数组,它的创建对象及方法和ArrayList大同小异。
2、TreeSet
TreeSet以树形结构图存储,它实现了SortedSet接口,所以它会自动排序,默认从小到大排列。
我们有时候为了查重,会通过Set给List去重。
三、Map接口
Map接口存储的是一组成对的键-值对象,它的key不允许重复,但是value可以重复,key和value都不要求有序。
1、HashMap
HashMap集合类是线程不安全的,但是它速度快。它的语法以及常用方法有:
Map map = new HashMap(); //此行创建对象的代码也可以限定数据类型
HashMap<String,String> map = new HashMap<String,String>(); //此行创建对象的代码也可以不限定数据类型
//常用方法
map.put(Object,Object); //添加数据
map.get(key); //取数据,下标从0开始到【长度-1】结束
map.size(); //得到长度
map.keySet(); //返回键的集合
map.keySet(); //返回值的集合
map.containsKey(Object); //判断列表中是否存在指定键
map.containsValue(Object); //判断列表中是否存在指定键
map.isEmpty(); //判断是否有值
map.clear(); //清空所有值
2、Hashtable
Hashtable操作类似HashMap,方法以及创建对象都大同小异,但是它是线程安全的。在这里就不详细的介绍了。
3、ConcurrentMap
ConcurrentMap是将HashMap和Hashtable结合在一起,它也是线程安全的,实现安全的方式比Hashtable更优,因为它针对线程安全部分做了优化。在这里不做主要讲述。
4、TreeMap
它基本上也是和前面差不多,但是它不能以null为key,它会自动对key排序,基本语法和常用方法大同小异。
四、Iterator
Iterator是一个迭代器,就是一个循环遍历的操作。操作步骤为:
1、先将List、Set、Map对象转换为Iterator对象;
2、通过Iterator对象的hasNext方法判断是否有下一个值;
3、通过Iterator对象的next方法取值。
它的语法为:
Iterator<数据类型> it = list(set\map).iterator(); //数据类型可写可不写
while(it.hasNext()){
System.out,print(it.next()); //输出取到的值
}
例如,输出保存在Map集合里的狗狗信息:
//创建4个狗狗对象
Dog ououDog = new Dog("欧欧", "雪纳瑞");
Dog yayaDog = new Dog("亚亚", "拉布拉多");
Dog meimeiDog = new Dog("美美", "雪纳瑞");
Dog feifeiDog = new Dog("菲菲", "拉布拉多");
// 创建Map集合对象并把4个狗狗对象放入其中
Map dogMap = new HashMap();
dogMap.put(ououDog.getName(),ououDog);
dogMap.put(yayaDog.getName(),yayaDog);
dogMap.put(meimeiDog.getName(),meimeiDog);
dogMap.put(feifeiDog.getName(),feifeiDog);
//通过迭代器依次输出集合中所有狗狗的信息
System.out.println("使用Iterator遍历,所有狗狗的昵称和品种分别是:");
Set keys = dogMap.keySet(); //取出所有key的集合
Iterator it = keys.iterator(); //获取Iterator对象
while(it.hasNext()) {
String key = (String)it.next(); //取出key
Dog dog = (Dog)dogMap.get(key); //根据key取出对应的值
System.out.println(key + "\t" +dog.getStrain());
}
运行结果是:
好啦,今天就到这里啦!