1、数组的优势与弊端
- 数组在内存存储方面的特点:
1 数组初始化以后 长度就是确定的,不可以改变
2 数组声明的类型 就决定了进行元素初始化时的类型
- 数组在存储方面的弊端:
1 输出初始化之后 长度不可变 不便于扩展
2 数组中提供的属性和方法较少,不便于对元素进行添加 删除 插入等操作,且效率不高,同时无法直接获取存储的元素的个数。
3 数组存储的数据是有序的,可以重复。
2、集合框架
Java 集合框架支持两种类型的容器:一种是为了存储一个元素集合,简称为集合(collection);另一种是为了存储键/值对,称为映射(map,或称图)。
2.1 集合的体系结构
3、 collection接口
1、collection接口
Collection 是一个顶层接口,一些 Collection 接口的实现类允许有重复的元素,而另一些则不允许;一些 Collection 是有序的,而另一些则是无序的。
JDK 不提供 Collection 接口的任何直接实现类,而是提供了更具体的子接口,如 Set 接口和 List 接口。这些子接口继承 Collection 接口的方法,然后再对 Collection 接口从不同角度进行重写或扩充。
2、collection 接口的三个子接口
Collection 接口主要有三个子接口,分别是 Set 接口、List 接口和 Queue 接口,
- Set 接口
Set 实例用于存储一组不重复的元素。
- List 接口
List 实例是一个有序集合。程序员可对 List 中每个元素的位置进行精确控制,可以根据索引来访问元素,此外 List 中的元素是可以重复的。
- Queue 接口
Queue 中的元素遵循先进先出的规则,是对数据结构“队列”的实现。
4、Map 接口
Map 接口定义了存储和操作一组“键(key)值(value)”映射对的方法。
Map 接口和 Collection 接口的本质区别在于,Collection 接口里存放的是一系列单值对象,而 Map 接口里存放的是一系列key-value 对对象。Map 中的 key 不能重复,每个 key 最多只能映射到一个值。
HashMap 和 Hashtable 是 Map 接口的实现类。
5、迭代器
Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代 ArrayList 和 HashSet 等集合。
iterator()方法定义在 Collection 接口中,因此所有单值集合的实现类,都可以通过 iterator()实现遍历。iterator()的返回值是 Iterator 对象,通过 Iterator 接口的 hasNext()和 next()方法即可实现对集合元素的遍历。
- 调用 it.next() 会返回迭代器的下一个元素,并且更新迭代器的状态。
- 调用 it.hasNext() 用于检测集合中是否还有元素。
- 调用 it.remove() 将迭代器返回的元素删除。
Iterator 类位于 java.util 包中,使用前需要引入它,语法格式如下:
import java.util.Iterator; // 引入 Iterator 类
迭代器的使用:
// 迭代器迭代集合
Iterator iter = collection.iterator();
// 使用迭代器来迭代集合
while(iter.hasNext()){
Object obj = iter.next();
System.out.println(obj);
}
迭代器使用while和for那个更好:
for循环更利于空间的释放
但是在开发中 普遍使用while
ConcurrentModificationException : 并发修改异常
产生原因:
迭代器在迭代集合的过程中,通过集合对象修改了集合的元素,造成迭代器获取园中判断预期修改值和实际修改值不一致
解决方案:通过集合本身来进行遍历集合,有集合自己修改
for(int i = 0 ; i < list.size();i++){
String str = (String)list.get(i);
if(str.equals("world")){
// list.add("hadoop");//新增 新增到集合的末尾
list.set(i,"hadoop");// 修改元素
}
}
System.out.println(list);
ListIteator
void | add(E e) 将指定的元素插入列表(可选操作)。 |
---|---|
boolean | hasNext() 返回 true 如果遍历正向列表,列表迭代器有多个元素。 |
boolean | hasPrevious() 返回 true 如果遍历反向列表,列表迭代器有多个元素。 |
E | next() 返回列表中的下一个元素,并且前进光标位置。 |
int | nextIndex() 返回随后调用 next() 返回的元素的索引。 |
E | previous() 返回列表中的上一个元素,并向后移动光标位置。 |
int | previousIndex() 返回由后续调用 previous() 返回的元素的索引。 |
void | remove() 从列表中删除由 next() 或 previous() 返回的最后一个元素(可选操作)。 |
void | set(E e) 用 指定的元素替换由 next() 或 previous() 返回的最后一个元素(可选操作)。 |