Java5.0 共有九个新的特性(2)

特性三 静态导入


 import 导入目标包的指定类
 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);
  }
 }
 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值