在Java中,如果一个Java对象可以在内部持有若干其他Java对象,并对外提供访问接口,我们把这种Java对象称为集合。
就是提供一个容器用于存储数据,增加相对应的增删改查的方法,进行整体的封装->类
集合的目的就是为了管理元素(增删改查)
只不过对于容器而言,它不一定都是数组(链表、树、哈希表)
Java的数组可以看作是一种集合:
String[] s = new String[10]; // 可以持有10个String对象
s[0] = "Hello"; // 可以放入String对象
String first = s[0]; // 可以获取String对象
Java提供了数组这种数据类型,可以充当集合,那么,我们为什么还需要其他集合类?这是因为数组有如下限制:
因此,我们需要各种不同类型的集合类来处理不同的数据,例如:
Collection 层次结构 中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set
和 List
)实现。此接口通常用来传递 collection,并在需要最大普遍性的地方操作这些 collection。
Java标准库自带的java.util
包提供了集合类:Collection
,它是除Map
外所有其他集合类的根接口。Java的java.util
包主要提供了以下三种类型的集合:
List
:一种有序列表的集合,例如,按索引排列的Student
的List
;Set
:一种保证没有重复元素的集合,例如,所有无重复名称的Student
的Set
;Map
:一种通过键值(key-value)查找的映射表集合,例如,根据Student
的name
查找对应Student
的Map
。Java集合的设计有几个特点:
一是实现了接口和实现类相分离,例如,有序表的接口是List
,具体的实现类有ArrayList
,LinkedList
等,二是支持泛型,我们可以限制在一个集合中只能放入同一种数据类型的元素,
List<String> list = new ArrayList<>(); // 只能放入String类型
Java访问集合总是通过统一的方式——迭代器(Iterator)来实现,它最明显的好处在于无需知道集合内部元素是按什么方式存储的。
可迭代的,实现该接口的子类,都可以进行内部元素的遍历,并且可以被foreach循环使用
上述容器,有可能是数组、链表、树、哈希表,但是不是每个结构都可以用角标来进行元素的访问的!
所以每一个结构的内部,都要去实现一个迭代器,由迭代器来实现该结构所有元素的遍历问题
方法摘要:
boolean | add 确保此 collection 包含指定的元素(可选操作)。 |
---|---|
boolean | addAll 将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。 |
void | clear 移除此 collection 中的所有元素(可选操作)。 |
boolean | contains 如果此 collection 包含指定的元素,则返回 true 。 |
boolean | containsAll 如果此 collection 包含指定 collection 中的所有元素,则返回 true 。 |
boolean | equals 比较此 collection 与指定对象是否相等。 |
int | hashCode 的哈希码值。 |
boolean | isEmpty 如果此 collection 不包含元素,则返回 true 。 |
Iterator | iterator 返回在此 collection 的元素上进行迭代的迭代器。 |
boolean | remove 从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。 |
boolean | removeAll 移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。 |
boolean | retainAll 仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。 |
int | size 返回此 collection 中的元素数。 |
Object[] | toArray 返回包含此 collection 中所有元素的数组。 |
T[] | toArray 返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。 |
public class CollectionDemo01 {
public static void main(String[] args) {
Collection<Integer> col1 = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
col1.add(i);
}
System.out.println(col1);
Collection<Integer> col2 = new HashSet<>();
col2.add(9);
col2.add(9);
System.out.println(col2);
col1.addAll(col2);
System.out.println(col1);
System.out.println(col1.removeAll(col2));
System.out.println(col1);
System.out.println(col2);
for (Integer num : col2) {
System.out.println(num); //col2[i] = num
}
}
}
获取迭代器
Iterator<Integer> it = col2.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
集合转为数组
Object[] arr = col2.toArray();
for (int i = 0; i < arr.length; i++) {
System.out.println((Integer) arr[i]);
}
Integer[] iarr = new Integer[col2.size()];
col2.toArray(iarr); //底层会自动将元素添加进数组中
System.out.println(Arrays.toString(iarr));