JavaSe—集合框架、Collection集合

目录

1、认识集合框架

2、Collection集合

2.1、Collection的常用功能

[2.2 Collection的遍历方式](#2.2 Collection的遍历方式)

[2.2.1 方式1 迭代器遍历](#2.2.1 方式1 迭代器遍历)

[2.2.2 方法2 增强for循环](#2.2.2 方法2 增强for循环)

[2.2.3 方法3 Lambda表达式](#2.2.3 方法3 Lambda表达式)

[2.2.4 Collection三种遍历方式的区别](#2.2.4 Collection三种遍历方式的区别)


1、认识集合框架

  • 集合是一种容器,用来装数据的。类似与数组,但集合的大小可变,开发中也非常常用

集合体系归类

集合系列结构

代码1:整体认识一下集合体系结构

java 复制代码
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class CollectionDemo2 {
    public static void main(String[] args) {
        //List系列集合:添加的元素是有序的,可重复,有索引
        List<String> list = new ArrayList<>();
        list.add("hello");
        list.add("world");
        list.add("java");
        list.add("world");
        list.add("world");
        System.out.println("有序的,可重复->: " + list);
        System.out.println("通过get方法,索引->: " + list.get(0));

        System.out.println("set系列");
        //HashSet 无序,不可重复,无索引
        Set<String> set = new HashSet();
        set.add("hello");
        set.add("world");
        set.add("java");
        set.add("world");
        System.out.println("无序,不可重复->: " + set);
    }
}

2、Collection集合

2.1、Collection的常用功能

为什么要先学Collection呢?

  • Collection是单例集合的祖宗**接口,,**它规定的方法(功能)是全部单例集合都会继承的。所以学习完Collection功能其他下面子类的一些功能也就会用了。

代码2:测试上面Collection通用功能

java 复制代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;  //Collection 单例类的祖宗接口

public class CollectionDemo3 {
    public static void main(String[] args) {
        //认识Collection的通用功能
        Collection<String> list = new ArrayList();  //接口 的实例化
        //把给定的元素添加到相应的集合
        System.out.println("_________________添加元素_________________");
        list.add("hello");
        list.add("world");
        list.add("java");
        System.out.println(list);
        System.out.println("_________________删除元素_________________");
        list.remove("world");  //删除指定元素
        System.out.println(list);
        System.out.println("_________判断集合中是否有指定的对象__________");
        System.out.println(list.contains("hello"));
        System.out.println(list.contains("world"));
        System.out.println("______________判断集合是否为空______________");
        System.out.println(list.isEmpty());
        System.out.println("_______________返回集合的大小_______________");
        System.out.println(list.size());
        System.out.println("________________清空集合___________________");
        list.clear();
        System.out.println(list);
        System.out.println("_____________把集合中的元素存储到数组_________");
        list.add("hello");
        list.add("world");
        list.add("java");
        String [] arr = list.toArray(new String[0]); //这里是JDK1.8下
        System.out.println(Arrays.toString(arr));  //输出数组

    }
}
/*
_________________添加元素_________________
[hello, world, java]
_________________删除元素_________________
[hello, java]
_________判断集合中是否有指定的对象__________
true
false
______________判断集合是否为空______________
false
_______________返回集合的大小_______________
2
________________清空集合___________________
[]
_____________把集合中的元素存储到数组_________
[hello, world, java]
/

2.2 Collection的遍历方式

2.2.1 方式1 迭代器遍历

  • 迭代器是用来遍历集合的专用方式(数组没有迭代器),在Java中迭代器代表是Iterator。

  • 包路径java.util.Iterator

  • 作用 :用于遍历 Collection 类型的集合(如 ListSetQueue 等)。

  • 特点

    • 只能单向遍历(从前到后)。
    • 支持在遍历过程中安全删除元素
    • 避免 ConcurrentModificationException(如果使用正确)。

Iterator迭代器

Collection集合获取迭代器的方法

| 方法名称 | 说明 |

Iterator<E> iterator() 返回集合的迭代器对象,该迭代器对象默认指向当前集合的第一个元素

Iterator迭代器中的常用方法

| 方法 | 返回类型 | 说明 |
| hasNext() | boolean | 询问当前位置是否有元素存在,存在返回true,不存在返回false |
| next() | E | 获取当前位置的元素,并同时将迭代器对象执向下一个元素处。 |
| remove() | void | 可选操作 。从底层集合中移除 next() 方法返回的最后一个元素。此方法只能在每次调用 next() 之后调用一次。如果在没有调用 next() 的情况下调用,或者连续调用两次 remove(),会抛出 IllegalStateException。 |

remove() void 可选操作 。从底层集合中移除 next() 方法返回的最后一个元素。此方法只能在每次调用 next() 之后调用一次。如果在没有调用 next() 的情况下调用,或者连续调用两次 remove(),会抛出 IllegalStateException

代码3:迭代器遍历演示

java 复制代码
import java.util.ArrayList;
import java.util.Iterator;

public class CollectionIteratorDemo4 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();
        list.add("hello");
        list.add("world");
        list.add("java");
        list.add("kk");
        Iterator< String> it = list.iterator();
        while(it.hasNext()){
            System.out.printf(it.next() + "  ");
        }
        System.out.println();
    }
}
/*
hello  world  java  kk  
 */

2.2.2 方法2 增强for循环

代码4:增强for遍历演示

java 复制代码
import java.util.ArrayList;
public class CollectionForMaxDemo5 {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        for (int i: list){
            System.out.printf("%d ", i);
        }
        System.out.println();
    }
}
/*
1 2 3 4 
 */

2.2.3 方法3 Lambda表达式

代码5:forEach遍历演示

java 复制代码
import java.util.ArrayList;
import java.util.function.Consumer;

public class CollectionLambdaDemo6 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("hello");
        list.add("world");
        list.add("java");
        list.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });
        //Lambda简化
        list.forEach(s-> System.out.println(s));
        //方法引用
        list.forEach(System.out::println);
    }
}
/*
hello
world
java
hello
world
java
hello
world
java
 */

2.2.4 Collection三种遍历方式的区别

认识并发修改异常问题

  • 遍历集合的同时又存在增删集合元素的行为时可能出现业务异常,这种现象被称之为并发修改异常问题。

代码6:区别3中种遍历

java 复制代码
import java.util.ArrayList;
import java.util.*;

public class CollectionTest7 {
    public static void main(String[] args) {
       //搞清楚并发修改异常问题
        ArrayList<String> list = new ArrayList<>();
        list.add("Java");
        list.add("宁夏枸杞");
        list.add("黑枸杞");
        list.add("枸杞子");
        list.add("红枸杞");
        list.add("枸杞");
        list.add("C++");
//        System.out.println(list);
//
//
//        for(int i = 0;i < list.size();i++){
//            String s = list.get(i);
//            if(s.contains("枸杞")){
//                list.remove(s);
//            }
//        }
//        System.out.println( list); //发现并不满足要求 [Java, 黑枸杞, 红枸杞, C++]
        /*
       解决方案一:前提支持索引
        删除集合中包含枸杞的元素,倒着遍历能够解决修改异常问题
         */
        ArrayList<String> list2 = new ArrayList<>();
        list2.add("Java");
        list2.add("宁夏枸杞");
        list2.add("黑枸杞");
        list2.add("枸杞子");
        list2.add("红枸杞");
        list2.add("枸杞");
        list2.add("C++");
        System.out.println("===================================");
        for(int i = list2.size() - 1;i >= 0;i--){
            String s = list2.get(i);
            if(s.contains("枸杞")){
                list2.remove(s);
            }
        }
        System.out.println( list2);
        System.out.println("===================================");
        /*
        解决方案二:i--;前提支持索引
         */
        ArrayList<String> list3 = new ArrayList<>();
        list3.add("Java");
        list3.add("宁夏枸杞");
        list3.add("黑枸杞");
        list3.add("枸杞子");
        list3.add("红枸杞");
        list3.add("枸杞");
        list3.add("C++");
        for(int i = 0; i< list3.size();i++){
            if(list3.get(i).contains("枸杞")){
                list3.remove(i);
                i--;
            }
        }
        System.out.println( list3);
        System.out.println("==============使用迭代器=============");
        /*
        当集合没有索引的使用
        方案1:使用迭代器,迭代器遍历并删除也会存在并发修改异常问题
        可以解决:使用迭代器自己的remove()方法
         */
        ArrayList<String> list4 = new ArrayList<>();
        list4.add("Java");
        list4.add("宁夏枸杞");
        list4.add("黑枸杞");
        list4.add("枸杞子");
        list4.add("红枸杞");
        list4.add("枸杞");
        list4.add("C++");
        Iterator< String> it = list4.iterator();
        while(it.hasNext()){
            String s = it.next();
            if(s.contains("枸杞")){
                it.remove();  //注意:这里的remove()方法是迭代器的方法,不是集合的remove()方法
            }
        }
        System.out.println( list4);

        System.out.println("===================================");
        /*
        使用for 和 Lambda当没有索引的时候,删除集合中包含枸杞的元素
        不能解决:并发修改异常问题
         */
        ArrayList<String> list5 = new ArrayList<>();
        list5.add("Java");
        list5.add("宁夏枸杞");
        list5.add("黑枸杞");
        list5.add("人字拖");
        list5.add("枸杞子");
        list5.add("红枸杞");
        list5.add("枸杞");
        list5.add("C++");
//        for(String s : list5){
//            if(s.contains("枸杞")){
//                list5.remove(s);
//            }
//        }
//        list5.forEach(s->{
//            if(s.contains("枸杞")){
//                list5.remove(s);
//            }
//        });
//        System.out.println( list5);
    }
}
/*
===================================
[Java, C++]
===================================
[Java, C++]
==============使用迭代器=============
[Java, C++]
===================================
 */

总结:解决并发修改异常问题的方案


Ok关于List和Set集合后期会持续更新。

相关推荐
霸道流氓气质2 小时前
Java中Stream使用示例-对实体List分组且保留原数据顺序并对分组后的每组内的数据进行部分业务逻辑修改操作
java·list
钢门狂鸭2 小时前
go开发规范指引
开发语言·驱动开发·golang
2301_795167202 小时前
玩转Rust高级应用 如何进行理解Refutability(可反驳性): 模式是否会匹配失效
开发语言·算法·rust
java1234_小锋2 小时前
Spring事件监听的核心机制是什么?
java·spring·面试
lllsure2 小时前
【Python】Dict(字典)
开发语言·python
云知谷2 小时前
【C/C++基本功】C/C++江湖风云录:void* 的江湖传说
c语言·开发语言·c++·软件工程·团队开发
脚踏实地的大梦想家3 小时前
【Go】P19 Go语言并发编程核心(三):从 Channel 安全到互斥锁
开发语言·安全·golang
逻极3 小时前
Rust数据类型(下):复合类型详解
开发语言·后端·rust
星释3 小时前
Rust 练习册 12:所有权系统
开发语言·后端·rust