集合的框架结构
Collection集合
java.util.Collection接口是List接口、Queue 接口以及Set接口的父接口,因此该接口里定义的方法
既可用于操作List集合,也可用于操作Queue集合和Set集合。
方法声明 | 功能介绍 |
---|---|
boolean add(E e); | 向集合中添加对象 |
boolean addAll(Collection<? extends E> c) | 用于将参数指定集合c中的所有元素添加到当前集合中 |
boolean contains(Object o); | 判断是否包含指定对象 |
boolean containsAll(Collection<?> c) | 判断是否包含参数指定的集合对象中的所有元素 |
boolean retainAll(Collection<?> c) | 保留当前集合中存在且参数集合中存在的所有对象(取两个集合的交集,当集合中的元素发生改变时才会返回true) |
boolean remove(Object o); | 从集合中删除对象 |
boolean removeAll(Collection<?> c) | 从集合中删除参数指定的所有对象 |
void clear(); | 清空集合 |
int size(); | 返回包含对象的个数 |
boolean isEmpty(); | 判断是否为空 |
boolean equals(Object o) | 判断是否相等 |
int hashCode() | 获取当前集合的哈希码值 |
Object[] toArray() | 将集合转换为数组 |
Iterator iterator() | 获取当前集合的迭代器 |
public class CollectionTest {
public static void main(String[] args) {
// 多态的方式构造一个Collection集合
Collection collection = new ArrayList();
System.out.println(collection); // []
// 向集合中添加对象
collection.add("hello");
collection.add(2);
collection.add(new Person("张飞", 28));
System.out.println(collection); // [hello, 2, Person{name='张飞', age=28}]
// 将参数指定集合c中的所有元素添加到当前集合中
Collection collection1 = new ArrayList();
collection1.add("world");
collection1.add(666);
// 注意!!!!!!
collection1.addAll(collection);
System.out.println(collection1); // [world, 666, hello, 2, Person{name='张飞', age=28}]
collection1.add(collection);
System.out.println(collection1); // [world, 666, hello, 2, Person{name='张飞', age=28}, [hello, 2, Person{name='张飞', age=28}]]
// 判断是否包含指定对象
// contains的工作原理是:Object.equals(o, e),其底层工作原理是 o == e(比较地址值)
System.out.println(collection1.contains("world")); // true
System.out.println(collection1.contains(collection)); // true
// 注意:如果Person没有重写equals方法则使用继承自Object的equals方法则下述代码输出false
System.out.println(collection1.contains(new Person("张飞", 28))); // true
// 判断是否包含参数指定的集合对象中的所有元素
System.out.println(collection1.containsAll(collection)); // true
collection.add(1);
System.out.println(collection1.containsAll(collection)); // false
// 保留当前集合中存在且参数集合中存在的所有对象
System.out.println(collection.retainAll(collection)); // false,因为元素没有发生改变
// 从集合中删除对象
System.out.println(collection); // [hello, 2, Person{name='张飞', age=28}, 1]
System.out.println(collection.remove(new Person("张飞", 28))); // true 此处与contains方法原理一样
System.out.println(collection.remove(3)); // false
// 集合向数组转换
Collection c = new ArrayList();
c.add(1);
c.add(2);
c.add(3);
Object[] objects = c.toArray();
System.out.println(Arrays.toString(objects)); // [1, 2, 3]
// 数组向集合转换
Collection objects1 = Arrays.asList(objects);
System.out.println(objects1); // [1, 2, 3]
}
}
Iterator接口
java.util.Iterator接口主要用于描述迭代器对象,可以遍历Collection集合中的所有元素。
java.util.Collection接口继承Iterator接口,因此所有实现Collection接口的实现类都可以使用该迭
代器对象。
方法声明 | 功能介绍 |
---|---|
boolean hasNext() | 判断集合中是否有可以迭代/访问的元素 |
E next() | 用于取出一个元素并指向下一个元素 |
void remove() | 用于删除元素 |
public class IteratorTest {
public static void main(String[] args) {
Collection c = new ArrayList();
c.add("hello");
c.add(1);
c.add(new Person("吕布", 30)); // hello, 1, Person{name='吕布', age=30}]
System.out.println(c);
// 使用迭代器遍历集合
Iterator iterator = c.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
/*
hello
1
Person{name='吕布', age=30}
*/
}
// 迭代时删除集合中的元素
Iterator iterator1 = c.iterator();
while (iterator1.hasNext()) {
Object next = iterator1.next();
if ("hello".equals(next)) {
iterator1.remove();
// c.remove(next); java.util.ConcurrentModificationException在迭代器中不能执行集合的删除操作,只能使用迭代器的删除操作
}
}
}
}
for each循环
Java5推出了增强型for循环语句,可以应用数组和集合的遍历。
是经典迭代的“简化版”。
格式:
for(元素类型 变量名 : 数组/集合名称) {
循环体;
}
List集合
1、java.util.List集合是Collection集合的子集合,该集合中允许有重复的元素并且有先后放入次序。
2、该集合的主要实现类有:ArrayList类、LinkedList类、Stack类、Vector类。
3、其中ArrayList类的底层是采用动态数组进行数据管理的,支持下标访问,增删元素不方便。
4、其中LinkedList类的底层是采用双向链表进行数据管理的,访问不方便,增删元素方便。
5、可以认为ArrayList和LinkedList的方法在逻辑上完全一样,只是在性能上有一定的差别,ArrayList更适合于随机访问而LinkedList更适合于插入和删除;在性能要求不是特别苛刻的情形下可以忽略这个差别。
6、其中Stack类的底层是采用动态数组进行数据管理的,该类主要用于描述一种具有后进先出特征的
数据结构,叫做栈(last in first out LIFO)。
7、其中Vector类的底层是采用动态数组进行数据管理的,该类与ArrayList类相比属于线程安全的
类,效率比较低,以后开发中基本不用
ArrayList集合
LinkedList集合
List集合中的常用方法
方法声明 | 功能介绍 |
---|---|
void add(int index, E element) | 向集合中指定位置添加元素 |
boolean addAll(int index, Collection<? extends E> c) | 向集合中添加所有元素 |
E get(int index) | 从集合中获取指定位置元素 |
int indexOf(Object o) | 查找参数指定的对象 |
int lastIndexOf(Object o) | 反向查找参数指定的对象 |
E set(int index, E element) | 修改指定位置的元素 |
E remove(int index) | 删除指定位置的元素 |
List subList(int fromIndex, int toIndex) | 用于获取子List |
Queue集合
java.util.Queue集合是Collection集合的子集合,与List集合属于平级关系。
该集合的主要用于描述具有先进先出特征的数据结构,叫做队列(first in first out FIFO)。
该集合的主要实现类是LinkedList类,因为该类在增删方面比较有优势。
方法声明 | 功能介绍 |
---|---|
boolean offer(E e) | 将一个对象添加至队尾,若添加成功则返回true |
E poll() | 从队首删除并返回一个元素 |
E peek() | 返回队首的元素(但并不删除) |