-------Android培训、java培训、期待与您交流! ----------
集合类:
为什么出现集合类?
数据多了封装成对象存储,对象多了封装成数组或集合存储
为什么数据多了用对象存?姓名、年龄、工号这些都是数据,这些数据都有所属,所属就是员工,所以这些数据都封装到员工对象里面
员工对象多了怎么办呢?员工对象多了就存储到数组、集合里面去
有数组了为什么要用集合呢?因为员工人数无法确定,员工人数还要增加所以就要用集合装员工对象。
数组是固定长度的,集合是可变长度的
数组只能用来存储同一种类型的对象,要么全存demo要么全存person。因为数组一定义就指定了里面的类型
集合可以存储不同类型的对象。可以存完domo类型再存一个person类型。只要存储的是对象就行。
所以集合类的应用领域更广泛,它没有局限性
集合是用来存储对象的
数组和集合类同是容器有何不同?
数组虽然也可以存储对象,但长度是固定的。集合长度是可变的。
数组中可以存储基本数据类型,集合只能存储对象
集合类的特点:
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象
集合作为容器分为很多种,就形成了一个框架,叫集合框架(Framework):
Collection收集、集合。
含有集合体系中最共性的内容。
(共性方法:add remove contains clear iterator)
|
——————————————————————
| |
List(抽取共性) Set(抽取共性)
| |
—————————————— ———————
| | | | |
ArrayList LinkedList Vector HashSet TreeSet
为什么会出现这么多的容器呢?
因为每一个容器对数据的存储方式都有不同,这个存储方式称之为:数据结构
Collection
|--List:(1)元素是有序的。(2)元素可以重复。(3)该集合体系有索引。如:存两个"张三"也可以。
|--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢
|--LinkedList:底层使用的是链表数据结构。特点:增删速度很快,查询稍慢
|--Vector:底层是数组数据结构
|--Set:(1)元素是无序的。(2)元素不可以重复。(3)该集合体系没有索引。
|--HashSet
|--TreeSet
add:添加元素
addAll:添加一组元素。添加collection进来
我有一个容器,你也有一个容器。我想把你容器中的元素放到我的容器中,直接把你的容器加进来,元素就全都加进来了
clear:清空容器。把容器中的所有元素都删掉
remove:移除一个元素
remove:移除一堆元素,不是全部。如:我集合中有1、2、3三个对象,你集合中有1、2两个对象。
只要我把你的容器往我集合里一放,1、2对象就删掉了
contains:包含某一个元素
containsAll:包含某一堆元素
isEmpty:集合中是否有元素
retainAll:取交集
toArray:把集合变数组
iterator:取出
size:判断集合的长度。数组中判断长度用length,不要搞混
思考以下问题:
Person p=new Person();
ArrayList al=new ArrayList();
al.add(p);
这段代码中的al.add(p);是指将new Person()这个对象放到数组里面去了吗?
不是。集合和数组都一样,里面存储的不是对象实体,而是对象的地址。
所以集合中存储的都是对象的地址
演示ArrayList中的常用方法:
class CollectionDemo
{
public static void main(String[] args)
{
//创建一个集合容器。使用Collection接口的子类ArrayList
ArrayList al=new ArrayList();//创建一个集合类的对象,也就是一个容器,这个容器里能装对象
//1、添加元素。add(Object obj),add方法为什么是用Object类接收?
// 因为容器里添加的对象是任意类型的,所以要用Object类接收
al.add("java01");
al.add("java02");
al.add("java03");
al.add("java04");
//打印原集合
sop(al);
//3、删除元素
al.remove("java02");
sop(al);
//al.clear();//清空集合,清空后的集合打印结果为:[],长度为0
//4、判断元素
sop("java03是否存在:"+al.contains("java03"));
sop("集合是否为空?"+al.isEmpty());
//2、获取个数,集合长度
sop("size:"+al.size());
//打印改变后的集合
sop(al);
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
/*
运行结果为:
[java01, java02, java03, java04]
[java01, java03, java04]
java03是否存在:true
集合是否为空?false
size:3
[java01, java03, java04]
*/
//取交集:retainAll
class CollectionDemo1
{
public static void main(String[] args)
{
method_2();
}
public static void method_2()
{
ArrayList al1=new ArrayList();
al1.add("java01");
al1.add("java02");
al1.add("java03");
al1.add("java04");
ArrayList al2=new ArrayList();
al2.add("java01");
al2.add("java02");
al2.add("java05");
al2.add("java06");
al1.retainAll(al2);//取交集,al1中只会保留和al2中相同的元素,al2不变
sop("al1:"+al1);
sop("al2:"+al2);
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
/*
运行结果为:
al1:[java01, java02]
al2:[java01, java02, java05, java06]
*/
//移除一堆元素:removeAll
class CollectionDemo2
{
public static void main(String[] args)
{
method_2();
}
public static void method_2()
{
ArrayList al1=new ArrayList();
al1.add("java01");
al1.add("java02");
al1.add("java03");
al1.add("java04");
ArrayList al2=new ArrayList();
al2.add("java01");
al2.add("java02");
al2.add("java05");
al2.add("java06");
al1.removeAll(al2);//把al1中和al2相同的元素都去掉了,al2不变
sop("al1:"+al1);
sop("al2:"+al2);
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
/*
运行结果为:
al1:[java03, java04]
al2:[java01, java02, java05, java06]
*/
/*
* 元素的取出:Iterator(迭代器)是个接口
* hasNext:如果仍有元素可迭代,则选择true
* next:返回迭代的下一个元素
*/
class CollectionDemo3
{
public static void main(String[] args)
{
method_get();
}
public static void method_get()
{
ArrayList al=new ArrayList();
al.add("java01");
al.add("java02");
al.add("java03");
al.add("java04");
Iterator it=al.iterator();
sop(it.next());
sop(it.next());
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
/*
运行结果为:
java01
java02
*/
/*
但这样取出太麻烦了,如果想把集合中的元素全部取出难道集合中有多少对象就要打印多少次?
不用那么麻烦,将打印过程写成循环就可以了
*/
class CollectionDemo4
{
public static void main(String[] args)
{
method_get();
}
public static void method_get()
{
ArrayList al=new ArrayList();
al.add("java01");
al.add("java02");
al.add("java03");
al.add("java04");
Iterator it=al.iterator();//获取迭代器,用于取出集合中的元素
while(it.hasNext())//当它没有可以取出的元素时,就返回false了
{
sop(it.next());
}
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
/*
运行结果为:
java01
java02
java03
java04
*/
什么是迭代器呢?
其实就是集合的取出元素的方式
迭代器的取出特点:
每个集合容器都有自己的取出特点,元素都在集合容器的内部,所以就把取出方式都在了每个集合容器的内部,
这样取出方式就可以直接访问集合内部的元素。那么取出方式就被定义成了内部类。
而每一个容器的数据结构不同,所以取出的动作细节也不一样。但是都有共性内容:判断和取出。那么可以将这些
共性抽取。
那么这些内部类都符合一个规则,该规则是:Iterator。
如何获取集合的取出对象呢?通过一个对外提供的方法:iterator();
原理类似于电玩城夹子抓布娃娃游戏
以上代码的while循环老外经常改为for循环来写,因为节省内存,所以以后用for循环来写
class CollectionDemo5
{
public static void main(String[] args)
{
method_get();
}
public static void method_get()
{
ArrayList al=new ArrayList();
al.add("java01");
al.add("java02");
al.add("java03");
al.add("java04");
for(Iterator it=al.iterator();it.hasNext();)
{
sop(it.next());
}
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
/*
运行结果为:
java01
java02
java03
java04
*/