由来
面向对象语言对事物的描述是通过对象来体现的,为便于处理对象
==》用容器存储对象【字符串(str)、列表(list)、元祖(tuple)、字典(dict)、集合(set)】总结_容器型数据类型 & 容器类型数据
数组是一种存储同一数据类型(基本类型数据)的多个元素的容器,数据多了我们可以用数组存储;那么对象多了,也不知道需要多少数量的对象(非固定长度)
==》Java就提供了集合以便使用,用集合存储对象的引用
数组是固定长度的,集合是可变长度的;集合是:只要是对象就可以存,不管是不是同一种对象;而数组只能存储一种类型的对象。
常用的集合有List集合、Set集合和Map集合,其中List与Set继承了Collection接口,各接口还提供了不同的实现类。
是什么
- 集合类存放于 java.util 包中,是一个用来存放对象的容器,准确的说是存放数据对象引用的容器。
- 集合类型主要有3种:set(集)、list(列表)和map(映射)。
- 只能存放对象,不能存放int(基本数据类型)等类型,存的是对应的是Integer(int的包装类)等对象。
- 集合存放的都是对象的引用,而非对象本身,对象本身是放在堆内存中。所以我们称集合中的对象就是集合中对象的引用。
- 可以存放不同类型的对象(因为实现的时候使用了泛型),不建议使用。
Java 集合框架
Java 集合框架主要结构图
发现一个特点,上述所有的集合类,除了map系列的集合,即左边的集合都实现了Iterator接口。
Iterator是一个用来遍历集合中元素的接口,主要有hashNext(),next(),remove()三种方法。
它的子接口ListIterator在它的基础上又添加了三种方法,分别是add(),previous(),hasPrevious()。
从图中我们可以看到:
- 集合主要分为Collection和Map两个接口。
- Collection又分别被List和Set继承。
- List被AbstractList实现,然后分为3个子类,ArrayList,LinkList和VectorList。
- Set被AbstractSet实现,又分为2个子类,HashSet和TreeSet。
- Map被AbstractMap实现,又分为2个子类,HashMap和TreeMap。
- Map被Hashtable实现。
List:继承自Collection。可以存在相同的对象,有序的。具体实现类有ArrayList,LinkedList,Vector等(已经被废弃,很少使用)。
Set:继承自Collection。不能存在相同的对象,无序的,就是数学意义上的集合。具体实现类有HashSet,LinkedHashSet,TreeSet等。
Map:以键值对的形式存放对象。key-value。一般是key为String类型,value为Object的类型。具体实现类有HashMap,LinkedHashMap,TreeMap等。
集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含如下内容:
- 接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象。
- 实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。
- 算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。
除了集合,该框架也定义了几个 Map 接口和类。Map 里存储的是键/值对。尽管 Map 不是集合,但是它们完全整合在集合中。
集合框架体系:
Java 集合框架提供了一套性能优良,使用方便的接口和类,java集合框架位于java.util包中, 所以当使用集合框架的时候需要进行导包。
Iterator接口
public interface Iterator<E> {
boolean hasNext();
E next();
default void remove() { // 此方法可用于在迭代中删除结合中的元素,如果不用Iterator,在list循环中使用remove会抛异常。
throw new UnsupportedOperationException("remove");
}
/**
* 举个简单例子(把集合里的元素每个都输出出来):
* List<String> names = new ArrayList<>();
* names.add("Joemsu");
* names.add("GodnessY");
* names.iterator().forEachRemaining(c -> System.out.println("hi! " + c));
*/
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
}
Collection接口
Collection接口是层次结构中的根接口。构成Collection的单位成为元素。Collection接口通常不能直接使用,但该接口提供了添加元素、删除元素、管理数据的方法。由于List接口与Set接口都继承了Collection接口,因此这些方法对List、Set是通用。
public interface Collection<E> extends Iterable<E> {
int size(); // 若size超过Integer.MAX_VALUE也只会返回Integer.MAX_VALUE
boolean isEmpty();
boolean contains(Object o); //如果向集合里添加null,使用contains(null),也可以返回true
Iterator<E> iterator();
/**
* 深层拷贝,修改数组的数据不会对集合里的元素产生影响。
* 注意:只能返回Object[],不能强制转换其他类型,如需要转型,使用下面带泛型的方法。
*/
Object[] toArray();
<T> T[] toArray(T[] a);
boolean add(E e);
boolean remove(Object o);
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c);
boolean removeAll(Collection<?> c);
boolean retainAll(Collection<?> c); //保留c集合里的元素
void clear();
boolean equals(Object o);
int hashCode(); //如过a.equals(b),则hashCode()肯定相同,反之不一定
@Override
default Spliterator<E> spliterator() { //针对parallelStream()添加的方法,用于分割集合,进行并行处理
return Spliterators.spliterator(this, 0);
}
/**
* 如果满足filter,则删除,举个栗子:
* Collection<String> myHeart = new ArrayList<>();
* myHeart.add("Boduolaoshi");
* myHeart.add("GodnessY");
* System.out.println("before: " + myHeart.size());
* myHeart.removeIf(s -> s.equals("Boduolaoshi"));
* System.out.println("after: " + myHeart.size());
*/
default boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean removed = false;
final Iterator<E> each = iterator();
while (each.hasNext()) {
if (filter.test(each.next())) {
each.remove();
removed = true;
}
}
return removed;
}
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
default Stream<E> parallelStream() { //采用并行处理,使用多核cpu的特性
return StreamSupport.stream(spliterator(), true);
}
}
常用方法
boolean add(Object o)
:添加对象到集合
boolean remove(Object o)
:删除指定的对象
int size()
:返回当前集合中元素的数量
boolean contains(Object o)
:查找集合中是否有指定的对象
boolean isEmpty()
:判断集合是否为空
Iterator iterator()
:返回一个迭代器
遍历集合
Collection集合的遍历通常通过迭代器iterator实现。
//导入java.util包
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class collection {
public static void main(String[] args) {
Collection<String> list = new ArrayList<>(); //实例化集合对象
list.add("A"); //向集合中添加数据
list.add("B");
list.add("C");
Iterator<String> ite = list.iterator(); //创建迭代器
while(ite.hasNext()) { //是否还有下一个元素
String str = (String) ite.next(); //获取集合中元素
System.out.println(str);
}
}
}
运行结果: