集合是JAVA中用途很广泛的一类容器,与数组类似,集合用于存储、获取、操作对象。但它与数组又有一些区别。
首先我们可以看看数组的一些弊端:
1.数组的长度是不可变的,在我们声明时指定好长度就不可以再变化
2.数组中没有提供可以查看有效元素个数的方法
而集合将这两个弊端很好的进行了解决,但同时,集合也有局限性,即它只能存储对象
JAVA将集合按照存储的特性分为了很多种,即不同的集合用于存储不同的对象,而不同的集合之间因为存在一些共性,又可以提取出来形成一个上一级的集合,这也叫做集合框架,用一张简单的图表示:
由下往上看,比如3个方形代表3个不同的集合,它们分别存储3种不同的对象,但由于都是方形,存在共性,于是将他们三个提取出来形成了一个具有共性的大集合大方形,同样,方形和椭圆形的集合之间可能也存在共性,于是它们又被提取出来,形成了一个更大的集合,这就是一个集合框架,而java的集合框架,较为复杂,图片网上有很多,就不列出来了。我们就主要说一说那些常用的集合。将上面的图转化为常用的集合框架,大致可以画成这样:
那么我们首先从Collection这个大集合说起,查看Collection的源码,发现:
Collection实际上是一个接口,它位于java.util.Collection中,还包含子接口List、Set等等,而该接口中又包含了许多方法,我们主要说一说常用的方法。
既然是接口,我们就需要使用实现类,这里我们用一个常用的实现类ArrayList来创建实例:
Collection collection=new ArrayList();
首先是向集合中添加元素的方法add(Object obj)
参数列表告诉我们是Object类型,那么可以传入任意类型的参数:
collection.add("AA");
collection.add(3);//自动装箱
collection.add(new Person("张三",12));
collection.add(new String("BBB"));
在上面我们有说到,集合只能存储对象,而当我们在add()方法中输入一个数字,也能存储,是因为该方法进行了自动装箱的操作。
打印该集合:
上面有说到,集合拥有数组无法实现的查看有效元素个数的方法:
System.out.println(collection.size());
结果:
可以添加元素,那么也可以删除元素,其中有清除所有元素的方法clear():
collection.clear();
System.out.println(collection);
结果:
判断集合是否为空的方法isEmpty():
boolean b=collection.isEmpty();
System.out.println(b);
结果:
我们也可以进行批量操作,比如将某一个集合中的所有元素存进集合addAll(Collection c):
数组中有一个asList()的方法,可以将数组转换为集合:
Collection collection2=Arrays.asList(1,2,3);
collection.addAll(collection2);
结果:
这里我们不妨可以使用add()方法存入该集合,看看两者有何区别:
Collection collection2=Arrays.asList(1,2,3);
collection.add(collection2);
结果:
不难发现,addAll()方法是将存入的集合中的每个元素单独存进了集合,而add方法是将该存入的集合为一个整体存入集合
判断集合中是否包含某元素,可以调用contains(Object obj)方法:
boolean b = collection.contains("AAA");
System.out.println(b);
结果:
假设我们要判断集合中是否包含某个指定的对象:
boolean b1=collection.contains(new Person("张三",12));
System.out.println(b1);
该对象存在于集合中,但运行结果:
而如果我们判断一个字符串是否存在:
boolean b3=collection.contains(new String("BBB"));
System.out.println(b3);
结果:
发现能够查到,这是因为新建String时自动重写了equals方法,而对象之间进行比较,实际上是调用了equals()方法,我们只用在Person实体类中重写equals()方法就可以了:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Person)) return false;
Person person = (Person) o;
return Objects.equals(getName(), person.getName()) &&
Objects.equals(getAge(), person.getAge());
}
同样,如果想判断某个集合中的所有元素是否都包含在当前元素中,调用cotainsAll(Collection c)方法即可,其原理与contains方法相同:
Collection collection3=new ArrayList();
collection3.add("AA");
collection3.add(new Person("张三",12));
boolean b2=collection.containsAll(collection3);
System.out.println(b2);
除此之外,还有remove、removeall(删除、删除集合中所包含的所有元素)方法,与上面类似,这里就演示一下removeall方法:
Collection collection3=new ArrayList();
collection3.add(new Person("张三",12));
collection3.add("AA");
collection3.add(888);
collection.removeAll(collection3);
System.out.println(collection);
先看运行结果:
在collection中,包含的元素是aa、数字3、一个年龄为12的张三对象以及BBB,而在collection3中,只有三个元素,在执行了removeall方法后,打印的collection只包含了3和BBB两个元素,而被移除的正是两个集合的交集,这也就是说明removeall方法实际上移除的是当前集合以及传入集合的交集。
同样地,若想返回两个集合的交集部分,调用retainAll(Collection c)即可:
Collection collection3=new ArrayList();
collection3.add(new Person("张三",12));
collection3.add("AA");
collection3.add(888);
collection.retainAll(collection3);
System.out.println(collection);
//11.toArray()
Object [] objects=collection.toArray();
for (Object obj:
objects) {
System.out.println(obj );
}
运行结果: