一.Collection集合
数组: 存储同一种数据类型的集合容器.
数组的特点:
1. 只能存储相同数据类型的数据
2. 一旦给定了长度,数组长度被固定了,不能改变
3. 数组中的元素与元素之间的内存地址是连续的
注意: Object类型的数组可以存储任意类型的数据
集合:集合是存储对象数据的集合容器。
集合比数组的优势:
1. 集合可以存储任意类型的对象数据,数组只能存储同一种数据类型 的数据。
2. 集合的长度是会发生变化的,数组的长度是固定的。
注意:
集合虽然说可以储存任意类型的对象数据 是因为可以通过自动装箱保存基本数据类型
Collection 单例集合的根接口
List 如果是实现了List接口的集合类,具备的特点: 有序,可重复。
ArrayList 底层是维护了一个Object数组实现的 特点: 查询速度快,增删慢。
LinkedList 底层是使用了链表数据结构实现的 特点: 查询速度慢,增删快。
Vector(了解即可) 底层也是维护了一个Object的数组实现的,实现与ArrayList是一样的,但是Vector是线程安全的,操作效率低。
Set 如果是实现了Set接口的集合类,具备的特点: 无序,不可重复。
HashSet 底层是使用了哈希表来支持的,特点: 存取速度快.
TreeSet 如果元素具备自然顺序 的特性,那么就按照元素自然顺序的特性进行排序存储。
Collection接口中的方法:
1.测试collection接口中的方法
// 首先定义Collection接口的
// Collection是个接口 要遵循多态的方式 去创建实现类的对象
Collection collection = new ArraryList();
// 添加(返回值是布尔类型的)
add() 添加成功返回true 否则返回false
addAll(Collection c) 把一个集合 的元素添加到另外一个集合中去。
// 添加一个字符串
boolean b1 = collection.add("a");
// 添加数字
boolean b2 = collection.add(60);
// 添加对象
boolean b1 = collection.add(new Persom("小东吖",20) );
System.out.println(collection);
结果
[a, 60]
2.addAll 两个集合 第一个集合传到 第一个
// 定义第一个集合
Collection c1 = new ArrayList();
// 定义第二个集合
Collection c2 = new ArrayList();
c1.add("a");
c1.add("b");
// 把传入的集合中所有的元素 添加到第一个集合中
c2.add("q");
c2.add("w");
c2.add("e");
//c1.addAll(c2);
// 把一个集合当成一个元素传入到c1集合中
c1.add(c2);
System.out.println(c1);
为什么能装基本数据类型?
比如 add(60)
Object obj = new Integer(100);
其中有个自动装箱的操作
结果
[a, b, [q, w, e]]
// 这里是把一个集合当成一个元素添加进去的
3.测试一些方法
Collection collection = new ArrayList();
collection.add("a");
collection.add("b");
collection.add("c");
collection.add("d");
// 测试方法 判读这个集合是不是空的
boolean b1 = collection.isEmpty();
System.out.println(b1);
// 获取集合长度
System.out.println(collection.size());
// 是否包含某个元素
boolean b2 = collection.contains("h");
System.out.println(b2);
// 删除某个元素
boolean b3 = collection.remove("c");
System.out.println("b3 = " + b3);
// 清空集合
collection.clear();
// 打印集合元素
System.out.println(collection);
结果
false
4
false
b3 = true
[]
4.遍历字符串数组
// 遍历字符串集合
Collection collection = new ArrayList();
collection.add("a");
collection.add("b");
collection.add("c");
collection.add("d");
// 将集合转化为数组
Object[] array = collection.toArray();
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
结果
a
b
c
d
//创建一个集合 添加三个学生禁区 遍历集合 只打印学生姓名
// 创建学生的类
public class Student {
// 私有化成员变量
private String name;
private int age;
// 构造方法
public Student() {
}
public Student(String name,int age) {
this.age = age;
this.name = name;
}
// set / get 方法
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
// 直接打印student对象 就可以调用toString方法
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
// 遍历集合
public static void main(String[] args) {
Collection collection = new ArrayList();
// 添加三个对象
collection.add(new Student("小东吖", 12));
collection.add(new Student("小东", 14));
collection.add(new Student("哈哈", 15));
//
// 强转数组类型 不能把数组中的元素强转
Object[] array = collection.toArray();
for (int i = 0; i < array.length; i++) {
// 数组遍历中要把数组中每一个对象(元素)都进行向下转型
// 向下转型.
Student student = (Student)array[i];
System.out.println(student.getName());
}
}
结果
小东吖
小东
哈哈
5.判断是否全部包含
containsAll(Collection<?> c)
如果此 collection 包含指定 collection 中的所有元素,则返回 true。
```
``
Collection collection1 = new ArrayList();
Collection collection2 = new ArrayList();
collection1.add("q");
collection1.add("w");
collection1.add("r");
collection2.add("c");
collection2.add("q");
boolean containsAll = collection1.containsAll(collection2);
System.out.println(containsAll);
结果
false
6.removeAll(Collection
移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。
// 删除重复的
Collection collection1 = new ArrayList();
Collection collection2 = new ArrayList();
collection1.add("q");
collection1.add("w");
collection1.add("r");
collection2.add("r");
collection2.add("s");
// 判断全部包含时 是可以有重复元素的 也算包含
collection1.removeAll(collection2);
System.out.println(collection1);
[q, w]
7.retainAll(Collection
仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。
Collection collection1 = new ArrayList();
Collection collection2 = new ArrayList();
collection1.add("q");
collection1.add("w");
collection1.add("r");
collection2.add("y");
collection2.add("w");
// c1 转换成 是把两个集合的交集取出来
// 如果c1没变 就返回true
// c1改变了 返回 false
boolean retainAll = collection1.retainAll(collection2);
System.out.println(collection1);
System.out.println(retainAll);
二.集合迭代器
迭代器(Iterator)
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象
(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。
注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
(2) 使用next()获得序列中的下一个元素。
(3) 使用hasNext()检查序列中是否还有元素。
(4) 使用remove()将迭代器新返回的元素删除。
1.迭代器应用:
Collection collection = new ArrayList();
collection.add("a");
collection.add("b");
// 获取集合中迭代器
Iterator iterator = collection.iterator();
// 判断有没有下一个元素
boolean b1 = iterator.hasNext();
// 获取下一个元素
Object next = iterator.next();
System.out.println(b1);
System.out.println(next);
}
结果
true
a
2.用迭代器遍历集合
Collection collection = new ArrayList();
// 迭代器遍历时 相当于有一个指针 指向你的集合
// 每next一次 指针向后移动
// 最终遍历完成
collection.add("a");
collection.add("b");
collection.add("c");
collection.add("d");
//fun1(collection);
// 使用迭代器循环遍历数组
// 获取集合中迭代器
Iterator iterator = collection.iterator();
// 判断是否有下一个元素
while (iterator.hasNext()) {
// 获取集合中元素
Object next = iterator.next();
System.out.println(next);
}
结果
a
b
c
d