------- android培训、java培训、期待与您交流! ----------
为什么出现集合类?
- 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式
- 数组虽然也可以存储对象,但长度是固定的;集合长度是可变的
- 数组中可以存储基本数据类型,集合只能存储对象
- 集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象
集合的用处:
- 用于存储对象的容器
- 该容器的长度是可变的
集合和数组的区别:
- 集合长度是可变的,数组长度是固定的
- 集合中只能存储对象,数组中即可以存储对象,又可以存储基本类型数值
- 集合中存储的对象可以是任意类型的,数组中只能存储同一类型的对象
集合框架的由来:
- 容器很多,因为每个容器中的数据结构是不同的。
- 数据结构:就是数据在容器中存储方式
- 如散装鸡蛋和品牌鸡蛋的存储方式
- 容器虽然因为结构有不同,但是都具备着共性,可以不断地向上抽取。
- 就形成集合框架,该框架的顶层之一就是Collection接口。
- 该接口中定义了集合框架中最共性的功能。
- 最终使用的时候,其实使用的该框架最子类的对象。
Collection中有哪些方法呢?
1,添加方法。
boolean add(object e):一次添加一个元素。
boolean addAll(Collection):将一个参数容器中的元素添加到当前容器中。
2,删除方法。
boolean remove(object):删除一个指定对象。
boolean removeAll(Collection):删除指定collection中和本Collection中相同的元素。
void clear():直接将集合中的元素清空。
3,判断方法:
boolean contains(object):是否包含指定元素。
boolean containsAll(Collection):是否包含指定容器中的元素。
boolean isEmpty():是否有元素。
4,获取元素个数:
int size():获取元素有几个。
5,取交集。
boolean retainAll(collection):保留和指定collection集合中相同的元素,不相同的元素会被删除。
6,将集合转成数组。
7,取出元素的方法:
Iterator iterator():
迭代器:取出集合中元素的方式的一个对象。该对象本身就内置在容器中。
如何获取到集合的迭代器呢?
- 可以通过iterator()方法来完成。该方法返回一个Iterator类型对象。
- 迭代器接口出现:将每一个容器中的取出方式进行了封装。并对外暴露。
- 这样无论是什么容器或者数据结构,只要内部取出方式实现了Iterator接口,
- 都可以通过该接口取出这些容器中的元素。
- 它的出现,将容器的取出方式和容器的数据结构相分离,降低了耦合性。
- 而取出方式因为直接在访问容器中的元素,并依赖具体的数据结构,所以被定义在了容器中。
- 通过内部类来实现Iterator接口。
- 大型游戏机中抓布娃娃的游戏机中的夹子。就是那个迭代器。
- 只要是Collection集合中的容器,迭代器是通用取出方式。
演示代码如下:
//创建集合。输出结果
Collection coll = new ArrayList();
//添加元素。
coll.add("abc1");
coll.add("abc2");
coll.add("abc3");
/*
//获取该集合的迭代器对象。
Iterator it = coll.iterator();
//使用迭代器对象中的方法完成元素的获取。
while(it.hasNext())
{
System.out.println(it.next());
}
*/
//将while改成for结构。开发的时候建议写for。
for(Iterator it = coll.iterator(); it.hasNext(); )
{
System.out.println(it.next());
}
demo1
demo2
demo3
使用集合是的一些小细节
创建一个集合容器。其实也是一个对象
Collection coll = new ArrayList();存储时,add可以接收任意类型的对象因为参数类型是Object。
所以对象元素存入时都被提升为了Object。其实在集合中真正存储都是对象的引用。
coll.add(new Object());用迭代器取出时,其实取出的也是引用。
coll.add("abc");
coll.add(5);上面这样写是可以的。因为jdk1.5后,有了自动装箱机制。
相当于new Integer(5).装箱Integer.valueOf(5);
等同于coll.add(Integer.valueOf(5));//拆箱 intValue();
一般开发时,最常见的就是往集合存储自定义对象对自定义对象进行描述。
存储时,都被提升为了Object。
取出时如果要使用自定义对象的特有方法,一定要进行向下转型。
注意事项:在迭代时,循环中只要有一个next()即可
示例代码如下:
Collection coll = new ArrayList();
coll.add(new Person("lisi2",22));
coll.add(new Person("lisi3",23));
coll.add(new Person("lisi4",24));
//取出元素。
Iterator it = coll.iterator();
while(it.hasNext())
{
Person p = (Person)it.next();
System.out.println(p.getName()+":"+p.getAge());
//System.out.println(((Person)it.next()).getName()+":"+((Person)it.next()).getAge()); //出错,next()只能调用一次
}
Vector:jdk1.0就存在了,底层是数组结构,可变长度数组
原理:一旦原数组长度不够,会创建新数组,将原数组的元素复制到新数组,并
将新元素添加到数组中
- ArrayList:底层是数组结构,也是支持长度可变变数组的,是不同步的。代替了Vector,因为效率高,查询效率高,增删低
- LinkedList:底层是链接列表结构。简称链表结构。好处是对元素的增删效率非常高,查询低