一.集合框架
Collection子集 list 和 set
list的子集 LinkedList和ArrayList
set的子集 HashSet和TreeSet
Map 的子集 HashMap和TreeMap
二.集合和数组的区别
数组:长度不可变
数组保存的数据类型:基本数据类型和对象(其实是对象的引用变量)
集合:长度可变
集合保存的数据类型:对象(其实是对象的引用变量)
Map保存的是key-value的键值对,Map的key不可以重复
三.Iterator迭代器访问集合
使用Iterator需要注意的地方
代码示例1(企图通过Iterator迭代集合来给集合的元素赋值):
public void iteratorOperate(){
HashSet<String> set = new HashSet<>();
set.add("1");
set.add("2");
set.add("3");
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()){
String next = iterator.next();
if (next.equals("1")){
iterator.remove();
}
next = "4";//虽然在这里给集合元素赋值,但是在下面遍历该集合时发现该集合的元素的值并没有改变
//所以,当使用Iterator对集合元素进行迭代时,Iterator并不是把集合元素本身传递给了迭代对象,而是把集合元素
//的值传递给了迭代变量,所以修改迭代变量的值对集合元素本身没有影响.
}
for (String data:set) {
Log.d("collection"," 集合元素为:"+data);
}
}
代码示例二(在迭代的同时修改集合的元素):
public void iteratorOperate() {
HashSet<String> set = new HashSet<>();
set.add("1");
set.add("2");
set.add("3");
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
String next = iterator.next();
if (next.equals("1")) {
// iterator.remove();
set.remove(next);
}
}
for (String data : set) {
Log.d("collection", " 集合元素为:" + data);
}
}
运行报错java.util.ConcurrentModificationException
解释:当使用Iterator迭代访问集合元素时,集合里的元素不能被改变,只有通过Iterator的remove()方法删除上一次next()方法
返回的集合元素才可以,否则就会异常。Iterator迭代器采用的是快速失败(fail-fast)机制,一旦在迭代过程中检测到集合已经
被修改(通常是程序的其它线程修改),程序立即引发java.util.ConcurrentModificationException异常,而不是显示修改后的结果,
这样可以避免共享资源而引起的潜在问题。
四.foreach遍历集合
同Iterator类似,使用foreach访问集合时,foreach循环中的迭代对象也不是集合元素本身,系统只是将集合元素的值付给了迭代变量,
同样,当使用foreach循环迭代访问集合元素时,该集合也不能被改变,否则也会引发java.util.ConcurrentModificationException异常。
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
for (String data : list) {
if (data.equals("1")) {
list.remove(data);
}
}
}
Collection子集 list 和 set
list的子集 LinkedList和ArrayList
set的子集 HashSet和TreeSet
Map 的子集 HashMap和TreeMap
二.集合和数组的区别
数组:长度不可变
数组保存的数据类型:基本数据类型和对象(其实是对象的引用变量)
集合:长度可变
集合保存的数据类型:对象(其实是对象的引用变量)
Map保存的是key-value的键值对,Map的key不可以重复
三.Iterator迭代器访问集合
使用Iterator需要注意的地方
代码示例1(企图通过Iterator迭代集合来给集合的元素赋值):
public void iteratorOperate(){
HashSet<String> set = new HashSet<>();
set.add("1");
set.add("2");
set.add("3");
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()){
String next = iterator.next();
if (next.equals("1")){
iterator.remove();
}
next = "4";//虽然在这里给集合元素赋值,但是在下面遍历该集合时发现该集合的元素的值并没有改变
//所以,当使用Iterator对集合元素进行迭代时,Iterator并不是把集合元素本身传递给了迭代对象,而是把集合元素
//的值传递给了迭代变量,所以修改迭代变量的值对集合元素本身没有影响.
}
for (String data:set) {
Log.d("collection"," 集合元素为:"+data);
}
}
代码示例二(在迭代的同时修改集合的元素):
public void iteratorOperate() {
HashSet<String> set = new HashSet<>();
set.add("1");
set.add("2");
set.add("3");
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
String next = iterator.next();
if (next.equals("1")) {
// iterator.remove();
set.remove(next);
}
}
for (String data : set) {
Log.d("collection", " 集合元素为:" + data);
}
}
运行报错java.util.ConcurrentModificationException
解释:当使用Iterator迭代访问集合元素时,集合里的元素不能被改变,只有通过Iterator的remove()方法删除上一次next()方法
返回的集合元素才可以,否则就会异常。Iterator迭代器采用的是快速失败(fail-fast)机制,一旦在迭代过程中检测到集合已经
被修改(通常是程序的其它线程修改),程序立即引发java.util.ConcurrentModificationException异常,而不是显示修改后的结果,
这样可以避免共享资源而引起的潜在问题。
四.foreach遍历集合
同Iterator类似,使用foreach访问集合时,foreach循环中的迭代对象也不是集合元素本身,系统只是将集合元素的值付给了迭代变量,
同样,当使用foreach循环迭代访问集合元素时,该集合也不能被改变,否则也会引发java.util.ConcurrentModificationException异常。
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
for (String data : list) {
if (data.equals("1")) {
list.remove(data);
}
}
}