- 集合类和数组不一样,数组元素既可以是基本类型的值,也可以是对象(实际上保存的是对象的引用变量);而集合里只能保存对象(实际上只是保存对象的引用变量,但通常习惯上认为集合里保存的是对象)。
-
Collection和Iterator接口
- Collection是List,Set,Queue接口的父接口,该接口里定义的方法既可用于操作Set接口,也可用于操作List和Queue集合。
public class CollectionTest {
public static void main(String[] args) {
Collection<String> collection = new ArrayList<>();
collection.add("1");
collection.add("2");
collection.add("3");
collection.add("rr");
collection.remove("rr");
/*ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("1");
arrayList.add("2");
collection.retainAll(arrayList);
System.out.println(collection);//[1, 2]
*/
//[1, 2, 3]
System.out.println(collection);
//true
System.out.println(collection.contains("1"));
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("1");
arrayList.add("2");
//从Collection中剔除arrayList中的元素
collection.removeAll(arrayList);
//[3]
System.out.println(collection);
//[1, 2]
System.out.println(arrayList);
//控制Collection集合里只剩下arrayList集合中也包含的元素
arrayList.retainAll(collection);
System.out.println(arrayList);
//删除Collection里的元素
collection.clear();
//[]
System.out.println(collection);
}
}
使用Lambda表达式遍历集合
- Iterator是Collection接口的父接口。
- Lambda表达式遍历集合元素
public class CollectionEach {
public static void main(String[] args) {
Collection<String> books = new HashSet<>();
books.add("java");
books.add("python");
books.add("Go");
//Consumer函数接口 Lambda表达式来遍历集合
books.forEach((e) -> System.out.println(e));
}
}
使用java8增强的Iterator遍历集合元素。
- Iterator主要用于遍历Collection集合中的元素,Iterator对象也被称为迭代器。
- Iterator接口来遍历集合元素
public class IteratorTest {
public static void main(String[] args) {
Collection<String> collection = new HashSet<>();
collection.add("1");
collection.add("2");
collection.add("3");
Iterator<String> iterator = collection.iterator();
//java8新加的默认方法,该方法可使用Lambda表达式来遍历集合元素
iterator.forEachRemaining((e) -> {
if (e=="1") {
iterator.remove();
}
System.out.println(e);
e="ttt";
});
//[2, 3]
System.out.println(collection);
// System.out.println(iterator.hasNext()); false
/*
* iterator 遍历集合 创建对象后只能使用一次
* */
while (iterator.hasNext()) {
String next = iterator.next();
System.out.println(next);
}
}
}
- 当使用Iterator对集合元素进行迭代时,Iterator并不是把集合元素本身传给了迭代变量,而是把集合元素的值传给了迭代变量,所以修改迭代变量的值对集合元素本身并没有任何影响。
- 当使用Iterator迭代访问Collection集合元素时,Collection集合里的元素不能被改变,只有通过Iterator的remove()方法删除上一次next()方法返回的集合元素才可以,否则引发异常。
public class IteratorErorTest {
public static void main(String[] args) {
Collection<String> collection = new HashSet<>();
collection.add("1");
collection.add("2");
collection.add("3");
Iterator<String> iterator = collection.iterator();
iterator.forEachRemaining((e) ->{
if (e.equals("1")) {
//Exception in thread "main" java.util.ConcurrentModificationException
//使用Iterator迭代过程中,不可修改集合元素
collection.remove(e);
}
});
System.out.println(collection);
}
}
- Iterator迭代器采用快速失败机制fail-fast。一旦迭代过程中检测到该集合已经被修改,程序立即出发ConcurrentModificationException异常,而不是显示修改后的结果,避免了共享资源而引发的潜在问题。
使用Lambda表达式遍历Iterator
public class CollectionEach {
public static void main(String[] args) {
Collection<String> books = new HashSet<>();
books.add("java");
books.add("python");
books.add("Go");
//Consumer函数接口 Lambda表达式来遍历集合
books.forEach((e) -> System.out.println(e));
}
}
使用forEach循环遍历集合元素
- 当使用foreach循环迭代访问几个元素时,该集合也不能被改变。
使用java8新增的Predicate操作集合
public class PredicateTest {
public static void main(String[] args) {
Collection<String> collection = new HashSet<>();
collection.add("111");
collection.add("21");
collection.add("13");
//满足剔除
collection.removeIf((e) -> e.length() ==2);
//[111]
System.out.println(collection);
}
}
计数字符串中a的数量
public class SumAnum {
public static void main(String[] args) {
String string = "aavaatgdaaaaaa";//10
System.out.println(sumA(string, (e) ->e.equals("a")));
}
private static int sumA(String string,Predicate<String> predicate) {
int nu = 0;
for (int i = 0; i < string.length(); i++) {
if (string.charAt(i) == 'a') {
nu++;
}
}
return nu;
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。