特性三 静态导入
import static 导入目标类成员变量和方法 (当导入后,目标类静态成员变量和方法,可以作为当前类成员变量方法 直接使用 )
特性使用中可以使得程序可读性降低,当发生导入冲突时,出现编译问题
特性四 自动装箱拆箱
拆箱:包装类对象自动转换为基本数据类型
特性五 for/in语句 (增强for循环)
为什么要有for/in语句 :简化Iterator复杂写法
* 增强for循环在编译后,就是Iterator代码
for/in语句的适用范围
1、遍历数组
2、遍历实现Iterable接口的集合类
只要定义类 实现Iterable 接口,那么该类 就可以用于for/in 语句
1、实现Iterable接口,实现当中iterator方法
2、自定义迭代器 Iterator 实现其中三个方法 hasNext、next、remove
移除练习
package cn.itcast.forin;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.junit.Test;
/**
* 关于List集合的移除练习
*
* @author seawind
*
*/
public class RemoveTest {
// 定义一个List<String>集合,将”abc”,”bcd”,”asf”,”ceg”,”daf”,”dfs”存入集合,遍历集合移除所有包含字母”a”
// 的字符串,并在移除后输出结果
@Test
public void demo1() {
List<String> list = new ArrayList<String>();
list.add("abc");
list.add("bcd");
list.add("asf");
list.add("ceg");
list.add("daf");
list.add("dfs");
// 以List的遍历为基础,取出每个元素,判断是否包含a 然后删除
for (String s : list) {
if (s.contains("a")) {
list.remove(s);
// break;// 只能删除一次
}
}
System.out.println(list);
}
@Test
// 使用Iterator的remove方法删除
public void demo2() {
List<String> list = new ArrayList<String>();
list.add("abc");
list.add("bcd");
list.add("asf");
list.add("ceg");
list.add("daf");
list.add("dfs");
// 以List的遍历为基础,取出每个元素,判断是否包含a 然后删除
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String s = iterator.next();
if (s.contains("a")) {
iterator.remove();
}
}
System.out.println(list);
}
// 通过下标遍历 删除
@Test
public void demo3() {
List<String> list = new ArrayList<String>();
list.add("abc");
list.add("asf");
list.add("daf");
list.add("bcd");
list.add("ceg");
list.add("dfs");
// 以List的遍历为基础,取出每个元素,判断是否包含a 然后删除
for (int i = 0; i < list.size(); i++) {
String s = list.get(i);
if (s.contains("a")) {
list.remove(s);
// 修复遍历索引
i--;
}
}
System.out.println(list);
}
@Test
// JDK5.0之后 提供一组线程安全集合操作类
public void demo4() {
List<String> list = new CopyOnWriteArrayList<String>();
list.add("abc");
list.add("bcd");
list.add("asf");
list.add("ceg");
list.add("daf");
list.add("dfs");
// 以List的遍历为基础,取出每个元素,判断是否包含a 然后删除
for (String s : list) {
if (s.contains("a")) {
list.remove(s);
}
}
System.out.println(list);
}
}
java.util.ConcurrentModificationException 并发修改异常
原因: if (modCount != expectedModCount) 修改次数不等于预期修改次数
* 修改了list集合后,会在下一次循环调用next方法,执行next方法时 比较修改次数是否发生变化,如果变化 抛出异常
1、遍历List 创建Iterator int expectedModCount = modCount; 将修改次数保存 expectedModCount
2、在list遍历过程中,只要对list进行修改,modCount+1
3、在执行next方法,if (modCount != expectedModCount) 说明修改了,抛出 java.util.ConcurrentModificationException
第一种:不完全的解决方式,在删除元素后 阻止下一次next方法的执行 ------------ break
* break 缺点 只能修改一次
第二种:使用Iterator的 remove方法删除元素
* 在remove修复修改次数 expectedModCount = modCount;
第三种 :使用List的下标进行遍历,完成删除
* 删除元素后,修复遍历下标 i--
第四种: 使用线程安全 ArrayList : CopyOnWriteArrayList
特性六:可变参数
任意个数的参数 --- 当做数组对象操作
注意事项:可变参数必须位于参数列表最后
package cn.itcast.vararg;
import org.junit.Test;
/**
* JDK中哪些方法 使用可变参数
*
* @author seawind
*
*/
public class VarargTest {
void print(int a, int... args) {// 可变参数必须在最后
}
// 一个方法中 不可能含有两个可变参数
// void print(String... args, int... params) {}
@Test
// 自定义可变参数
public void demo2() {
int result1 = sum(10, 20);
System.out.println(result1);
int result2 = sum(10, 20, 30);
System.out.println(result2);
int result3 = sum();// 传递sum方法一个空数组
System.out.println(result3);
}
// 可变参数加法
public int sum(int... args) {
// 接收可变参数 ----- 当做数组操作
int sum = 0;
for (int i : args) {
sum += i;
}
return sum;
}
// 字符串格式化 方法使用可变参数
@Test
public void demo1() {
// 字符串格式化输出时,可以对字符串中变化部分采用占位符,搭配可变参数
String format = "I am %s, my age is %d";
// %s 任意字符串 %d 任意整数
System.out.printf(format, "小明", 20);
System.out.println();
String format2 = "I like %s";
System.out.printf(format2, "音乐");
System.out.println();
String format3 = "I am fine!";
System.out.printf(format3);
}
}