集合框架
一. 什么是集合?
集合是一个批量的数据储存的容器(内存),作用和数组非常类似
但是数组有着以下缺陷
- 数组的长度一旦确定就不可改变
- 数组对数据提供出的方法不够丰富(大多都继承的是Object的方法)
二. Java中的体系结构
- 集合分为两大类:单列集合和双列集合
单列集合:该集合体系中的每个元素都是一个值
双列集合:该集合体系中每个元素都有两个值组成分别是key键和value值两者之间存在着映射关系- 单列集合的顶级接口是Collection双列集合的顶级接口是Map
- Collection接口下又分为两个派系:List接口和Set接口
- List接口的特点是:有序有重复,Set接口的特点是:无序无重复
- List接口下有三个常用的实现类:ArrayList、Linked、Vector
- Set接口下有两个常用的实现类:HashSet、TreeSet,其中LinkedHashSet实现类继承于HashSet
- Map接口下分为两个派系TreeMap类和HashMap类,而其中LinkedHashMap实现类继承于HashMap
三. Collection接口的使用
所有的集合框架都是在java.util包中
在Collection接口中继承了Iterable(可被迭代的,能够通过循环的方式依次访问容器中的每个元素)
在Iterable接口中定义了一个抽象方法:Iterator iterator();要求返回一个迭代器对象(Iterable)
Collection接口中的常用方法
- add(E e) 向集合中添加一个新的元素,当没有具体的类型的时候默认为Object类型
说明:任何集合中只能存储引用类型的数据- size()返回集合中的元素个数;
//接口多态 Collection collection = new ArrayList(); collection.add("zhangsan"); collection.add(98.5);//自动封箱 collection.add(true); collection.add(new String()); System.out.println(collection.size());//4
- 迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”
迭代操作:万能的迭代方式(使用迭代器)迭代器对象可以理解为一个指向整个容器的指针,初始状态它指向了第一个元素的前面
获取迭代器对象
调用迭代器对象的next()方法表示让迭代器往下移动一位并获取指向的元素的值返回
循环的条件使用迭代器对象的hasNext()方法来控制,该方法可以用来判断是否存在下一个元素,如果存在就返回true否则返回falseCollection collection = new ArrayList(); Iterator iterator = collection.iterator(); while(iterator.hasNext()) { Object value = iterator.next(); System.out.println(value); }
- remove(Object o)从集合中删除指定元素,但是只能删除一个,要删除多个,就需要进行迭代(放在循环里删除),正确的调用方法
while(iterator.hasNext()) { Object value = iterator.next(); //collection.remove("shangsan"); //java.util.ConcurrentModificationException错误 if (value.equals("zhangsan")) { iterator.remove(); } }
- 实现类(ArrayList)里面remove()方法原码
public boolean remove(Object o) {
if (o == null) {
for (int index = 0; index < size; index++)
if (elementData[index] == null) {
fastRemove(index);
return true;
}
} else {
for (int index = 0; index < size; index++)
if (o.equals(elementData[index])) {
fastRemove(index);
return true;
}
}
return false;
}
- addAll(Collection collection);将一个集合中的所有元素添加到另一个集合中(批量的添加)
- clear();清空集合中所有的元素
- contains(Object o);查询集合中是否有o这个对象,在原码中是用equals方法进行判断
- isEmpty();判断当前集合是否为空
- toArray();将当前集合转换为数组
四. List接口的使用
首先List接口是从Collection接口那里继承而来,特点是有序有重复
有序:每个元素都有一个固定的下标,和数组类似
有重复:可以有多个重复的元素
List接口中与下标相关的对应方法
- add(int index, Object object),添加元素到指定序列
- get(int index)根据下标直接获取某个位置的元素值并返回
- set(int index,Object e)修改指定下标位置的元素值
- remove(int index) 根据下标删除指定位置的元素
注意:如果按照一个int类型的数据内容进行删除,需要手动进行包装,否则将参数理解为下标
- sort(Comparator c )
List list=new ArrayList();
list.add(111);
list.add(222);
list.add(444);
list.add(777);
list.add(666);
//System.out.println(list.get(3));
list.sort(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
// TODO Auto-generated method stub
return (Integer)o1-(Integer)o2;
};
});