什么是集合?
在前面的学习中,保存多个数据,用的是数组。
但是数组有很多不同的地方:
1.长度开始时必须指定,且一旦指定无法更改
2.保存的必须为同一类型元素,虽说可以多态保存,但是限制性也很大
3.使用数组进行增加删除元素 比较麻烦
所以就产生了集合类这个概念
所谓集合:简单来讲,集合就是一个放数据的容器,准确的说是放数据对象引用的容器。 可以理解为另一种类似数组的东西,也是用于存放数据的。但是比数组方便。
专业性来说:
集合就是由若干个确定的元素所构成的整体,集合是存储对象的容器,可以存储任意数量、任意类型的对象。
在Java中,如果一个Java对象 可以在内部持有若干其他Java对象,并对外提供访问接口,我们把这种Java对象称为集合。数组也可以看作是一种集合
集合的好处:
1.可以动态保存任意多个对象
2.提供了一系列方便的操作对象:add remove set get等
3.使用集合来增删改查比较方便
集合框架
集合的学习离不开集合框架,接下来就一个个学习。认识集合到底怎么用
集合分为单列集合 和 双列集合:暂时可以理解为单列集合一次只能存一个,双列集合一次可以存好多个
单列集合框架图:
双列集合框架图:
Collection集合
Collection接口集成于Iterator,Collection里还定义了很多方法,这些方法也都会继承到各个子接口和实现类里,而这些 API 的使用也是日常工作和面试常见常考的.
集合的使用最常用的就是CRUD功能:
增 add()/addAll()
删 remove()removeAll()
改 Collection Interface 里并没有直接改元素的操作
查 contains()/ containsAll()
其他 isEmpty()/size()/toArray()
Collection要点:
- Collection的实现子类,可以存放多个元素,每个元素可以是Object
- Collection的实现子类,可以存放重复的元素,有些不可以
- Collection的实现子类,有些是有序的(List),有些不是有序的(Set)
- Collection接口没有直接实现的子类,是通过他的子接口Set和List来实现的
演示:
因为Collection是接口,无法实例化,所以使用向上转型Collection指向Arraylist,演示
public class test1 {
public static void main(String[] args) {
Collection list = new ArrayList();
//add:添加单个元素
list.add("jack");
System.out.println(list);
//remove:删除指定元素
list.remove("jack");
System.out.println(list);
//contains:查找某个元素是否存在
System.out.println(list.contains("jack"));
//size:获取元素个数
System.out.println(list.size());
//isEmpty:判断是否为空
System.out.println(list.isEmpty());
//clear:清空所有元素
list.clear();
//addAll:添加多个元素
Collection list2 = new ArrayList();
list2.add("张三");
list2.add("李四");
list.addAll(list2);
System.out.println(list);
//containsALL:查找多个元素是否都存在
System.out.println(list.containsAll(list2));
//removeAll:删除多个元素
list.removeAll(list2);
}
}
false
0
true
[张三, 李四]
true
迭代器Iterator
Iterator对象称为迭代器,主要用于遍历Collection集合中的元素
所有实现了Collection接口的集合类,都有一个lterator()方法,用于返回一个实现了lterator接口的对象,即返回一个迭代器。
lterator用于遍历集合,lterator本身不存放对象
迭代器的执行原理
lterator iterator = list.iterator(); // 得到一个迭代器
hasNext();//判断是否还有下一个元素
next();//指针下移,将下移后对应的元素返回
图示:
注意:在使用迭代器的next()方法前,必须要先调用hasNext()方法进行检测,否则若没有下一个元素,直接使用next(),会抛出NoSuchElementException异常
迭代器使用演示:
public class test1 {
public static void main(String[] args) {
Collection list = new ArrayList();
list.add(new Book("三国演义","罗贯中",78));
list.add(new Book("红楼梦","曹雪芹",124));
list.add(new Book("西游记","吴承恩",88));
//获取迭代器
Iterator iterator = list.iterator();
//使用迭代器进行遍历
while (iterator.hasNext()) {
Object next = iterator.next();
System.out.println(next);
}
}
}
class Book{
String name;
String author;
double price;
public Book(String name, String author, double price) {
this.name = name;
this.author = author;
this.price = price;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
'}';
}
}
输出:
Book{name=‘三国演义’, author=‘罗贯中’, price=78.0}
Book{name=‘红楼梦’, author=‘曹雪芹’, price=124.0}
Book{name=‘西游记’, author=‘吴承恩’, price=88.0}
当执行到最后一个元素时,hasNext返回为false,此时iterator.next指向 西游记",“吴承恩”,88
也就是最后一个,如果要复原,可以重新再获取一次迭代器 iterator = list.iterator();
增强for循环
增强for循环可以代替iterator迭代器
特点:增强for循环就是简化版的iterator。本质一样,只能用于遍历集合或数组
使用语法:
for(元素类型 元素名:集合名或数字名){
访问元素
}
使用演示:
public class test1 {
public static void main(String[] args) {
Collection list = new ArrayList();
list.add(new Book("三国演义","罗贯中",78));
list.add(new Book("红楼梦","曹雪芹",124));
list.add(new Book("西游记","吴承恩",88));
for (Object o: list) {
System.out.println(o);
}
}
}
输出:
Book{name=‘三国演义’, author=‘罗贯中’, price=78.0}
Book{name=‘红楼梦’, author=‘曹雪芹’, price=124.0}
Book{name=‘西游记’, author=‘吴承恩’, price=88.0}
根据debug可以看到,底层还是使用iterator的hasNext和next。
Collection集合练习
请编写程序:
1.创建3个Dog{name,age}对象,放入ArrayList中,赋给List引用
2.用迭代器和增强for循环,遍历
3.重写Dog的toString方法,输出name和age
public class test {
public static void main(String[] args) {
List list = new ArrayList();
list.add(new Dog("小黄",2));
list.add(new Dog("小白",2));
list.add(new Dog("小黑",1));
System.out.println("iterator迭代器遍历");
Iterator iterator = list.iterator();
while (iterator.hasNext()){
Object o = iterator.next();
System.out.println(o);
}
System.out.println("增强for遍历");
for (Object o2:list) {
System.out.println(o2);
}
}
}
class Dog{
private String name;
private int age;
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Dog{" +
"name='" + this.getName() + '\'' +
", age=" + this.getAge() +
'}';
}
}
输出:
iterator迭代器遍历
Dog{name=‘小黄’, age=2}
Dog{name=‘小白’, age=2}
Dog{name=‘小黑’, age=1}
增强for遍历
Dog{name=‘小黄’, age=2}
Dog{name=‘小白’, age=2}
Dog{name=‘小黑’, age=1}