目录
集合类概述
a.为什么出现集合类?
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,Java就提供了集合类。
b.数组和集合类同是容器,有何不同?
数组虽然也可以存储对象,但长度是固定的;集合长度是可变的。数组中可以存储基本数据类型,集合只能存储对象。
c.集合类的特点
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。
Collection接口
Collection接口概述
Collection 层次结构中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。
Collection接口成员方法
(由于Collection是一个接口,所以无法被实例化,需要它的子类来进行接口多态的方式实例化,这里暂时用ArrayList来示范。)
1.添加功能
boolean add(E e) 确保此集合包含指定的元素(可选操作)
import java.util.ArrayList;
import java.util.Collection;
public class CollectionTest1 {
public static void main(String[] args) {
Collection c = new ArrayList();
//boolean add(E e)确保此集合包含指定的元素(可选操作)
System.out.println(c.add(12)); //输出true,表示该元素成功插入到对象c里
System.out.println(c.add("help"));
c.add(2.33);
c.add(12);
System.out.println(c); //调用AbstractCollection类中的toString()方法,所以不会输出地址值
}
}
boolean addAll(Collection c) 将指定集合中的所有元素添加到此集合(可选操作)
//创建集合对象
Collection c1 = new ArrayList();
//向集合中添加元素
c1.add("java");
c1.add("hadoop");
c1.add("hive");
c1.add("spark");
//创建另一个集合对象
Collection c2 =new ArrayList ();
c2.add("hello");
c2.add("java");
//boolean addAll(Collection c) 将指定集合中的所有元素添加到此集合(可选操作)
c1.addAll(c2); //将c2集合中的元素添加到c1里
System.out.println(c1);
System.out.println(c2);
2.删除功能
boolean remove(Object o) 从该集合中删除指定元素的单个实例(如果存在)(可选操作)
//boolean remove(Object o) 从该集合中删除指定元素的单个实例(如果存在)(可选操作)
c.add(121);
c.add("eee");
c.add("hello");
c.add("bigdata");
System.out.println(c);
c.remove("hello");//删除指定元素(如果有重复只移除一个符合条件的元素)
System.out.println(c);
boolean removeAll(Collection c) 删除指定集合中所包含的所有此集合的元素(可选操作)
//创建集合对象
Collection c1 = new ArrayList();
//向集合中添加元素
c1.add("java");
c1.add("hadoop");
c1.add("hive");
c1.add("spark");
//创建另一个集合对象
Collection c2 =new ArrayList ();
c2.add("hello");
c2.add("java");
//boolean removeAll(Collection c) 删除指定集合中所包含的所有此集合的元素(可选操作)
c1.removeAll(c2); //将c1集合里包含c2集合的元素删除
System.out.println(c1);
System.out.println(c2);
void clear() 从此集合中删除所有元素(可选操作)
//void clear() 从此集合中删除所有元素(可选操作)
c.add(121);
c.add("eee");
System.out.println(c);
c.clear(); //删除
System.out.println(c);
3.判断功能
boolean contains(Object o) 如果此集合包含指定的元素,则返回true
c.add(121);
c.add("eee");
c.add("hello");
c.add("bigdata");
System.out.println(c.contains("hello")); //包含就输出true,否则false
boolean containsAll(Collection c) 如果此集合中包含指定集合中的所有元素,则返回true
//创建集合对象
Collection c1 = new ArrayList();
//向集合中添加元素
c1.add("java");
c1.add("hadoop");
c1.add("hello");
//创建另一个集合对象
Collection c2 =new ArrayList ();
c2.add("hello");
c2.add("java");
System.out.println(c1.containsAll(c2)); //包含返回true,否则false
boolean isEmpty() 如果此集合不包含元素,则返回true
//boolean isEmpty() 如果此集合不包含元素,则返回true
c.add(121);
c.add("eee");
c.add("hello");
c.add("bigdata");
System.out.println(c.isEmpty()); //空输出true,非空false
4.获取长度
int size() 返回此集合中的元素数
//int size() 返回此集合中的元素数
c.add(121);
c.add("eee");
c.add("hello");
c.add("bigdata");
System.out.println(c.size()); //这里有四个元素,输出为4
5.求交集功能
boolean retainAll(Collection c) 仅保留此集合中包含在指定集合中的元素(可选操作)
//创建集合对象
Collection c1 = new ArrayList();
//向集合中添加元素
c1.add("java");
c1.add("hadoop");
c1.add("hello");
//创建另一个集合对象
Collection c2 =new ArrayList ();
c2.add("hello");
c2.add("java");
//boolean retainAll(Collection c) 仅保留此集合中包含在指定集合中的元素(可选操作)
c1.retainAll(c2); //c1保留与c2集合相交部分元素
System.out.println(c1);
System.out.println(c2);
6.集合的遍历
Object[] toArray() 返回一个包含此集合中所有元素的的数组
把集合转成数组,可以实现集合的遍历
//创建集合对象
Collection c = new ArrayList();
//添加元素
c.add("ee");
c.add("sds");
c.add("rrr");
c.add("tet");
//集合转换为数组
Object[] objects = c.toArray();
//遍历数组
for(int i=0;i<objects.length;i++){
// System.out.println(objects[i]);
// 若想获取每一个元素的长度,需向下转型,因为object中没有length方法,子类为String类。
String s =(String) objects[i];
System.out.println(s+" 长度:"+s.length());
}
例:用集合遍历学生信息
a.首先创建学生的标准类(不会的可以去看看前面 面向对象——封装 )
class Student{
private String name;
private int age;
public Student() {}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
b.然后创建集合遍历
public class CollectionTest3 {
public static void main(String[] args) {
//创建集合对象
Collection c =new ArrayList();
//创建学生对象
Student s1 =new Student("qwee",20);
Student s2 =new Student("sdfs",30);
Student s3 =new Student("adasfa",40);
//将对象添加进入集合
c.add(s1);
c.add(s2);
c.add(s3);
//转换为数组
Object[] objects = c.toArray();
//遍历数组
for(int i=0;i< objects.length;i++){
// System.out.println(objects[i]); 普通输出
Student student = (Student) objects[i]; //向下转型
System.out.println(student.getName()+"————"+student.getAge());
}
}
}
c.结果
Iterator接口
Iterator接口概述
对 collection 进行迭代的迭代器
依赖于集合而存在
Iterator接口成员方法
a. Iterator<E> iterator()返回此集合中的迭代器 (它是Collection集合遍历的专有方式)
b. E next() 返回迭代中的下一个元素
例:迭代器遍历字符串
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionTest4 {
public static void main(String[] args) {
//创建集合对象
Collection c =new ArrayList();
//添加元素
c.add("hadoop");
c.add("hive");
c.add("java");
c.add("bigdata");
//获取集合c的迭代器对象
//Iterator<E> iterator() 返回此集合中的元素的迭代器
Iterator iterator = c.iterator();
//System.out.println(iterator);//不能直接输出,iterator的实现类中没有toString方法,输出是地址值
//E next() 返回迭代中的下一个元素
Object next = iterator.next();
System.out.println(next); //输出 hadoop
System.out.println(iterator.next()); //输出hadoop下一个元素hive,以此类推,超出集合元素数量会报错
System.out.println(iterator.next());
System.out.println(iterator.next());
}
}
c. boolean hasNext() 如果迭代中还有元素,返回true(判断迭代中海有没有元素)
用上面的 E next() 方法多调用一次超过集合拥有元素数量就会报错,所以可以用hasnext()改进。
//boolean hasNext() 判断迭代中还有没有元素
if (iterator.hasNext()){
System.out.println(next);
//如果这样输出,每验证一次需重新输出,如果元素过多太繁琐,需改进
}
//由于不知道需要循环输出多少次,用while循环改进
while(iterator.hasNext()){
System.out.println(iterator.next());
}
遍历结果
若想继续使用元素的方法(如查看长度)需向下转型
while(iterator.hasNext()){
Object next = iterator.next();
//向下转型,添加的数据都是String类型的,所以转String类
String s =(String) next;
System.out.println(s+" 长度:"+s.length());
}
同样,我们继续利用迭代器来遍历自定义的对象(学生类同上,需先创建公共类)
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionTest5 {
public static void main(String[] args) {
//创建集合对象
Collection c= new ArrayList();
//创建学生对象
Student s1 =new Student("w3da3",24);
Student s2 =new Student("q32423",23);
Student s3 =new Student("sdf313",34);
//添加到集合
c.add(s1);
c.add(s2);
c.add(s3);
//获取迭代器对象
Iterator iterator = c.iterator();
//遍历迭代器对象,获取每一个元素
while(iterator.hasNext()){
Object next = iterator.next();
//向下转型,这里是Student类,所以转Student类
Student s =(Student) next;
//转型后就能调用元素的方法了
System.out.println(s.getName()+"_____"+s.getAge());
}
}
}
( 不推荐用for循环,如果你非要使用for循环,也能使用for循环遍历,没有while循环可读性高)
for (Iterator iterator1 = c.iterator();iterator1.hasNext();){
Object next = iterator1.next();
Student s =(Student) next;
System.out.println(s.getName()+"_____"+s.getAge());
}
注意,同一个迭代器只能遍历一次,多次遍历没有效果。应为遍历一次指针指向末尾(如while循环后,再使用while循环无第二次输出结果,只有第一次结果)