1. 集合类和数组不一样,数组元素既可以是基本类型的值,也可以是对象(实际上保存的是对象的引用变量);而集合里只能保存对象(实际上只是保存对象的引用变量,但通常习惯上认为集合里保存的是对象)。
  2. 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;
    }
}

期待
3 声望1 粉丝

在校的一枚技术小新,欢迎大佬指正缺点


下一篇 »
java集合-List