Java集合
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作
一、集合框架的概述
1.集合、数组都是对多个数据进行存储操作的结构,简称Java容器。
说明:此时的存储,主要指的是内存层面的存储,不涉及到持久化的存储(.txt,.jpg,.avi,数据库中)
2.1 数组在存储多个数据方面的特点:
> 一旦初始化以后,其长度就确定了。
> 数组一旦定义好,其元素的类型就确定了。
比如:String[] arr;int[] arr1;Object[] arr2(什么都能放);
2.2 数组在存储多个数据方面的缺点:
> 一旦初始化以后,其长度就不可修改。
> 数组中提供的方法非常有限,对于添加、删除、插入数据等操作,非常不便,同时效率不高。
> 获取数组中实际元素的个数的需求,数组没有现成的属性或方法可用。
> 数组储存数据的特点是有序、可重复的;但对于无序、不重复数据的需求,不能满足。
.
.
二、集合框架
|----Collection接口:单列集合,用来存储一个一个对象
|----List接口:存储有序的、可重复的数据。 --> “动态”数组(因为特点和数组很像,但长度可变)
|----ArrayList、LinkedList、Vector
|----Set接口:存储无序的、不可重复的数据。
|----HashSet、linkedHashSet、TreeSet
|----Map接口:双列集合,用来存储一对(key -> value)一对的数据
|----HashMap、linkedHashMap、TreeMap、Hashtable、Properties
Collection接口:
Map接口
.
.
.
Collection接口
1、Collection 接口是 List、Set 和 Queue 接口的父接口,该接口里定义的方法既可用于操作 Set 集合,也可用于操作 List 和 Queue 集合。
2、JDK不提供此接口的任何直接实现,而是提供更具体的子接口(如:Set和List)实现。
3、在 Java5 之前,Java 集合会丢失容器中所有对象的数据类型,把所有对象都当成 Object 类型处理;从 JDK 5.0 增加了泛型以后,Java 集合可以记住容器中对象的数据类型。
(更严谨,是什么数据类型就装什么数据)
.
.
Collection 接口方法
1、添加
add(Object e):将元素 e 添加到集合coll中
addAll(Collection c):将 c 集合中的元素添加到当前的集合中
2、获取添加的元素个数
int size()
3、清空集合
void clear()
4、判断当前集合是否为空
boolean isEmpty()
5、是否包含某个元素,在判断是会调用equals()方法来判断
contains(Object obj):判断当前集合中是否包含obj
containsAll(Collection c):判断形参 c 中的所有元素是否都存在于当前集合中
6、删除
remove(Object obj):从当前集合中移除obj元素
removeAll(Collection c):从当前集合中移除 c 中所有元素
7、交集:获取当前集合和 c 集合的交集,并返回给当前集合
retainAll(Collection c)
8、判断两个集合中的元素是否相等(若是List接口则还要判断是否有序)
equals(Object obj)
9、集合与数组(只限对象数组,不包括基本数据类型数组)间的转换
toArray:集合 --> 数组
数组 --> 集合:调用Arrays类的静态方法asList()
注意:List arr1 = Arrays.asList(new int[]{123, 456});//这个只认为是一个数据,打印出的是地址值
10、获取集合对象的哈希值
hashCode()
11、遍历
iterator():返回迭代器(Iterator)对象,用于集合遍历
结论:
向Collection接口中实现类的对象中添加数据obj时,要求obj所在的类要重写equals()。
对于List而言:在使用 contains()、remove()、retainsAll()... 等方法时需要调用对应数据的equals()方法。
对于Set而言:
(以HashSet、LinkedHashSet为例):它的不可重复性就是通过equals()和HashCode()方法去判断。
(以TreeSet为例):它的不可重复性是通过Comparable()、Comparator()判断。
.
.
集合遍历:Iterator迭代器接口
1、Iterator对象称为迭代器(设计模式的一种),主要用于遍历 Collection 集合中的元素。
2、Collection接口继承了java.lang.Iterable接口,该接口有一个iterator()方法,那么所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了Iterator接口的对象。
3、Iterator 仅用于遍历集合,集合对象每次调用iterator()方法都得到一个全新的迭代器对象Iterator。
(也就意味着指针会再次返回到集合第一个元素前面)!!!
.
.
Iterator的方法
hasNext():检测集合中是否还有元素,存在则返回true !!!
next():返回迭代器中的下一个元素 !!!
remove():将当前迭代器返回的元素删除(使用remove()时,迭代器的指针不能为初始位置(或重复使用remove()),否则会报IllegalStateException)
遍历过程中是通过迭代器对象的remove方法,不是集合对象的remove方法。
代码:
public static void main(String[] args) {
// 创建集合
ArrayList<String> data = new ArrayList<>();
data.add("Google");
data.add("IDEA");
data.add("Baidu");
// 获取迭代器
Iterator<String> iterator = data.iterator();
// hasNext 检查集合中是否还有元素,如果有则进入循环。
while (iterator.hasNext()){
String str = iterator.next();
//判断用next()方法返回的元素是否是"IDEA"
if("IDEA".equals(str)){
//将指针指向的元素删除
iterator.remove();
}else{
// 循环打印集合中的元素
System.out.println(str);
}
}
}
迭代器的执行原理
.
.
使用 foreach 循环遍历集合元素
Java 5.0 提供了 foreach 循环迭代访问 Collection和数组。
遍历集合的底层调用Iterator完成操作。
遍历操作不需获取Collection或数组的长度,无需使用索引访问元素。
格式:
//for(集合元素的类型 局部变量 : 集合对象)
for(Object obj : coll){
System.out.println(obj);
}
把集合对象 coll 的第一个元素赋给 obj 然后打印出来,在把第二个元素赋给 obj 再打印,以此类推。
面试代码:
public void test3(){
String[] arr = new String[]{"MM","MM","MM"};
//方式一:普通for循环:arr中元素改变
// for (int i = 0; i < arr.length; i++) {
// arr[i] = "GG";
// }
//方式二:foreach循环:ar