一、集合的理解和好处
前面我们保存多个数据使用的是数组,数组有不足的地方。
数组:
1.长度开始时必须指定,而且一旦指定,不能更改。
2.保存的必须为同一类型的数据。
3.使用数组进行增加/删除元素比较麻烦。
例如:写出Person数组扩容示意代码。
Person[] pers = new Person[1]; //大小是1
pers[0] = new Person();
//增加新的Person对象
Person[] pers2 = new Person[pers.length + 1]; //创建新的数组
for(int i = 0; i < pers.length; i++) { //拷贝pers数组的元素到pers2
pers2[i] = pers[i];
}
pers2[pers2.length - 1] = new Person(); //添加新的对象
集合:
1.可以动态保存任意多个对象。
2.提供了一系列方便的操作对象的方法:add、remove、set、get。
3.使用集合添加/删除元素代码比较简洁。
二、集合的框架体系
Java的集合类很多,主要分为两大类:单列集合(Collection)、双列集合(Map)。
Collection 接口有两个重要的子接口 Set、List,它们的实现子类是单列集合。
Map 接口的实现子类是双列集合,存放K-V键值对。
三、Collection接口和常用方法
1.Collection接口
public interface Collection<E> extends Iterable<E> {}
(1)Collection接口没有直接的实现类,而是通过它的子接口 Set 和 List 来实现的。
(2)Collection接口的实现类可以存放多个元素,元素可以是Object类或其子类。
(3)Collection的子接口 List 的实现类,是有序的,可以存放重复的元素,有些不可以。
(4)Collection的子接口 Set 的实现类,是无序的,不可以存放重复的元素。
2.Collection接口常用方法
以Collection接口的实现类ArrayList为例。
(1)add:添加单个元素。
//创建 ArrayList类对象 ,并用 List接口变量list 接收
//接口的多态特性——多态参数:接口引用可以指向实现了接口的类的对象
List list = new ArrayList();
//(1)add:添加单个元素。
list.add("jack");//String类是Object子类
list.add(10);//自动装箱,等价于 list.add(new Integer(10))
list.add(true);//自动装箱
System.out.println(list);//[jack, 10, true]
(2)addAll:添加多个元素。
//(7)addAll:添加多个元素,多个元素放在一个集合中。
ArrayList list2 = new ArrayList();
list2.add("红楼梦");
list2.add("三国演义");
list.addAll(list2);
System.out.println(list);//[红楼梦, 三国演义]
(3)remove:删除指定元素。
//(2)remove:删除指定元素。
//list.remove(0);//删除第0个元素
list.remove(true);//指定删除某个元素
System.out.println(list);
(4)removeAll:删除多个元素。
//(9)removeAll:删除多个元素,并返回一个boolean值。
list.add("聊斋");
list.removeAll(list2);
System.out.println(list);//[聊斋]
(5)clear:清空。
//(6)clear:清空。
list.clear();
System.out.println(list);//[]
(6)contains:查找元素是否存在。
//(3)contains:查找元素是否存在。
System.out.println(list.contains("jack~"));//false
(7)containsAll:查找多个元素是否都存在。
//(8)containsAll:查找多个元素是否都存在,多个元素放在一个集合中。
System.out.println(list.containsAll(list2));//true
(8)size:获取元素个数。
//(4)size:获取元素个数。
System.out.println(list.size());//2
(9)isEmpty:判断是否为空。
//(5)isEmpty:判断是否为空。
System.out.println(list.isEmpty());//false
四、Collection接口遍历方式
1.遍历元素方式1——使用Iterator(迭代器)
在程序开发中,经常需要遍历集合中的所有元素。针对这种需求,JDK专门提供了一个接口java.util.Iterator。
Iterator接口也是Java集合中的一员,但它与Collection、Map接口有所不同,Collection接口与Map接口主要用于存储元素,而Iterator接口主要用于迭代访问(即遍历)Collection中的元素。
Iterator接口的常用方法:
- next():(1)箭头下移;(2)将下移后集合位置上的元素返回。
- hasNext():判断是否还有下一个元素,如果仍有元素可以迭代,则返回 true。
- 注意:在调用 iterator.next() 方法前,必须调用 iterator.hasNext() 进行检测。若不调用,且下一条记录无效,直接调用 iterator.next() 会抛出 NoSuchElementException 异常。
Iterable接口里有一个iterator()方法,用以返回一个实现了Iterator接口的对象,即可以返回一个迭代器。
package com.hspedu.collection_;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/**
* @author 韩顺平
* @version 1.0
*/
@SuppressWarnings({"all"})
public class CollectionIterator {
public static void main(String[] args) {
//接口向上转型:接口引用可以指向实现了接口的类的对象
Collection col = new ArrayList();
col.add(new Book("三国演义", "罗贯中", 10.1));
col.add(new Book("小李飞刀", "古龙", 5.1));
col.add(new Book("红楼梦", "曹雪芹", 34.6));
// System.out.println(col);
//需求:遍历col集合
//1.获取 col 对应的 迭代器
Iterator iterator = col.iterator();
//2.使用 while 循环遍历
//快速生成while循环快捷键:itit
//显示所有快捷键的快捷键:ctrl + j
while (iterator.hasNext()) {//判断是否还有下一个元素
//返回下一个元素,类型是Object
//obj 编译类型:Object 运行类型:Book
Object obj = iterator.next();
System.out.println(obj);
}
//3.当退出循环后,iterator迭代器的箭头指向最后一个元素
// iterator.next();//报错:NoSuchElementException
//4.如果需要再次遍历,需要重置iterator迭代器
iterator = col.iterator();//重新获取了一个迭代器
System.out.println("===第二次遍历===");
while (iterator.hasNext()) {
Object obj = iterator.next();
System.out.println(obj);
}
}
}
class Book {
private String name;
private String author;
private double price;
public Book(String name, String author, double price) {
this.name = name;
this.author = author;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
'}';
}
}
2.遍历元素方式2——使用增强for循环
基本语法:
for (元素类型 元素名:集合名/数组名){
访问元素
}
(1)增强for循环,可以在集合和数组上使用。
(2)增强for循环,底层仍然是迭代器。可以理解为简化版本的 迭代器遍历。
package com.hspedu.collection_;
import java.util.ArrayList;
import java.util.Collection;
/**
* @author 韩顺平
* @version 1.0
*/
@SuppressWarnings({"all"})
public class CollectionFor {
public static void main(String[] args) {
//接口向上转型:接口引用可以指向实现了接口的类的对象
Collection col = new ArrayList();
col.add(new Book("三国演义", "罗贯中", 10.1));
col.add(new Book("小李飞刀", "古龙", 5.1));
col.add(new Book("红楼梦", "曹雪芹", 34.6));
//使用增强for循环,在Collection集合上使用
//快捷键:I
for (Object book : col) {
System.out.println(book);
}
//在数组上使用增强for循环
int[] nums = {1, 8, 10, 90};
for(int i : nums) {
System.out.println(i);
}
}
}