第11章 集合与迭代器

目录

目录

目录

11.1 Collection集合

11.1.1 集合的概念

11.1.2 Collection接口

1、添加元素

2、删除元素

3、查询与获取元素

11.2 List 有序集合

11.2.1 新增方法

11.2.2 ArrayList

11.2.3 LinkedList

1、单向链表

2、双向链表

3、删除元素

11.3 Set 无序集合

11.3.1 HashSet

1、HashSet 的特点

11.3.2 TreeSet

11.5 Collections工具类



11.1 Collection集合

11.1.1 集合的概念

集合是java中提供的一种容器,可以用来存储多个数据。

集合和数组既然都是容器,它们有啥区别呢?

数组的长度是固定的,集合的长度是可变的。

数组中可以存储基本数据类型值,也可以存储对象,而集合中只能存储对象 。

集合主要分为两大系列:CollectionMap,Collection 表示一组对象,Map表示一组映射关系或键值对。

11.1.2 Collection接口

Collection 层次结构中的根接口。 Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接实现:它提供更具体的子接口(如 Set无序集合 和 List有序集合、Queue队列)实现。此接口通常用来传递 collection,并在需要最大普遍性的地方操作这些 collection。

Collection<E>是所有单列集合的父接口,因此在Collection中定义了单列集合(List和Set)通用的一些方法,这些方法可用于操作所有的单列集合。方法如下:

1、添加元素

(1)add(E obj):添加元素对象到当前集合中

(2)addAll(Collection<? extends E> other):添加other集合中的所有元素对象到当前集合中,即this = this ∪ other

  @Test
    public void test01(){
//        添加元素
// (1)add(E obj):添加元素对象到当前集合中
        Collection<Integer> number = new ArrayList<>();
        number.add(10);
        System.out.println(number);
//        (2)addAll(Collection<? extends E> other):
//        添加other集合中的所有元素对象到当前集合中,
//        即this = this ∪ other
        Collection<Integer> number1 =new ArrayList<>();
        number1.add(10);
        number1.add(20);
        number1.add(30);
        number1.addAll(number);
        System.out.println(number1);
    }

2、删除元素

(1) boolean remove(Object obj) :从当前集合中删除第一个找到的与obj对象equals返回true的元素。

@Test
    public void test02(){
//        (1) boolean remove(Object obj) :
//        从当前集合中删除第一个找到的与obj对象equals返回true的元素。
        List<String> list = new ArrayList<>();
        list.add("yang");
        list.add("asdlfj");
        list.add("qweoqiwue");
        list.remove("yang");
        System.out.println(list);
    }

  (2)boolean removeAll(Collection<?> coll):从当前集合中删除所有与coll集合中相同的元素。即this = this - this ∩ coll

 @Test
    public void test03(){
        /* (2)boolean removeAll(Collection<?> coll):
        从当前集合中删除所有与coll集合中相同的元素。
        即this = this - this ∩ coll*/
        Collection<String> str =new ArrayList<>();
        str.add("zhangsan");
        str.add("zhangsan");
        str.add("王五");
        str.add("李四");
        str.add("zhangsan");
        str.add("赵六");
        str.add("猪猪侠");
        System.out.println(str);
        Collection<String> str1 = new ArrayList<>();
        str1.add("zhangsan");
        System.out.println(str1);
        str.removeAll(str1);
        System.out.println(str);
    }

(3)boolean removeIf(Predicate<? super E> filter) :删除满足给定条件的此集合的所有元素。

 @Test
    public void test04() {
        /*
         * (3)boolean removeIf(Predicate<? super E> filter) :
         * 删除满足给定条件的此集合的所有元素。
         * */
        Collection<String> list = new ArrayList<>();
        list.add("张三");
        list.add("张a");
        list.add("张三");
        list.add("张三");
        list.add("张三");
        Collection<String> list1 = new ArrayList<>();
        list1.add("张三");
        list1.add("张a");
        list1.add("张三");
        list1.add("张三");
        list1.add("张三");
        list.addAll(list1);//把list1添加到list里面
        list.removeIf(new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.contains("张a");
            }
        });
        list.removeIf(new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return false;
            }
        });
        System.out.println(list);
    }

(4)boolean retainAll(Collection<?> coll):从当前集合中删除两个集合中不同的元素,使得当前集合仅保留与c集合中的元素相同的元素,即当前集合中仅保留两个集合的交集,即this = this ∩ coll;

@Test
    public void test05(){
        /*
        * (4)boolean retainAll(Collection<?> coll):
        * 从当前集合中删除两个集合中不同的元素,
        * 使得当前集合仅保留与c集合中的元素相同的元素,
        * 即当前集合中仅保留两个集合的交集,即this  = this ∩ coll;
        * */
        Collection<String> str = new ArrayList<>();
        str.add("张三");
        str.add("王五");
        str.add("李四");
        str.add("asd四");
        str.add("a四");
        str.add("asd四");
        System.out.println(str);
        Collection<String> str1 = new ArrayList<>();
        str1.add("张三1");
        str1.add("王五2");
        str1.add("李四");
        str1.add("asd四");
        str1.add("a四");
        str1.add("asd四");
        System.out.println(str1);
        str.retainAll(str1);
        System.out.println("取交集后:"+str);
        str1.retainAll(str);
        System.out.println("取交集后:"+str1);
    }
3、查询与获取元素

(1)boolean isEmpty():判断当前集合是否为空集合。

  @Test
    public void test06() {
//            (1)boolean isEmpty():判断当前集合是否为空集合。
        Collection<String> str =new ArrayList<>();
        str.add("asdf");
        System.out.println(str.isEmpty());
    }

(2)boolean contains(Object obj):判断当前集合中是否存在一个与obj对象equals返回true的元素。

 @Test
    public void test07(){
//        (2)boolean contains(Object obj):
//        判断当前集合中是否存在一个与obj对象equals返回true的元素。
        Collection<String> str= new ArrayList<>();
        str.add("啊撒旦解放");
        str.add("啊撒旦");
        str.add("啊解放");
    }

(3)boolean containsAll(Collection<?> c):判断c集合中的元素是否在当前集合中都存在。即c集合是否是当前集合的“子集”。

 @Test
    public void test08(){
//        (3)boolean containsAll(Collection<?> c):
//        判断c集合中的元素是否在当前集合中都存在。
//        即c集合是否是当前集合的“子集”。
        Collection<String> str = new ArrayList<>();
        str.add("asdfasg");
        str.add("dfasg");
        str.add("afasg");
        str.add("asdsg");
        str.add("aasg");
        str.add("fasg");
        Collection<String> str1= new ArrayList<>();
        str1.add("aesfas");
        System.out.println(str.containsAll(str1));
    }

(4)int size():获取当前集合中实际存储的元素个数

(5)Object[] toArray():返回包含当前集合中所有元素的数组

 @Test
    public void test09(){
        /*
        *
        * (4)int size():获取当前集合中实际存储的元素个数*/
        Collection<String> str = new ArrayList<>();
        str.add("sajf");
        str.add("sajf");
        str.add("sajf");
        str.add("sajf");
        System.out.println(str.size());
//        (5)Object[] toArray():
//        返回包含当前集合中所有元素的数组
        Collection<String> list = new ArrayList<>();
        list.add("asdljkflaks");
        list.add("asdljkflaks");
        list.add("sdaf");
        list.add("sdaf");
        list.add("sdaf");
        list.add("sdaf");
        System.out.println(list.toArray());/*[Ljava.lang.Object;@6ee52dcd*/
        Object[] array =list.toArray();
//        iter//快捷键
//      itar//

        for (Object o : array) {
            System.out.println(o);
        }

    }

11.2 List 有序集合

List集合代表一个元素有序、可重复的集合。集合中每个元素都有对应的顺序索引。

11.2.1 新增方法

作为Collection子接口,自然可以使用父接口的所有方法,当然也有新增的方法

方法名说明
add(E e)增加单个数据
addAll(Collection<? extends E> c)将一个 Collection 集合的数据添加到现在的集合中
remove(Object o)删除指定的元素
contains(Object o)判断集合是否包含指定的元素
size()得到集合的数据总数
isEmpty()判断集合是否有数据
get(int index)通过索引获取对应的数据元素
set(int index, E element)通过索引和新的元素替换原有内容
toArray()将List转为对象数组

11.2.2 ArrayList

ArrayList 是List 接口的大小可变数组的实现。实现了所有可选列表操作, 并允许包括null 在内的所有元素。除了实现List 接口外, 此类还提供一些方法来操作内部用来存储列表的数组的大小( 此类大致上等同于 vector 类, 但 vector 是同步的) 。

ArrayList 底层使用数组实现,特点就和数组一致:查询速度快,增删速度慢。

11.2.3 LinkedList

LinkedList 和ArrayList不同,是一个链表结构。可当作堆栈、队列、双端队列 。链表是一种在物理上非连续、非顺序的数据结构,由若干节点(node)所组成。链表有单链表和双链表之分。

1、单向链表

单向链表的每一个节点包含两部分,一部分是存放数据的变量data,另一部分是指向下一个节点的指针next。正如地下党的联络方式,一级一级,单线传递 。

2、双向链表

双向链表比单向链表稍微复杂一些,它的每一个节点除了拥有data和next指针,还拥有指向前置节点的 prev 指针

3、删除元素

11.3 Set 无序集合

Set 集合就像是一个罐子,将数据丢进来就行,因为是丢进来的,Set集合通常不会记忆元素的添加顺序(无序)。 Set接口的方法和Collection基本相同,但Set不允许包含重复的元素。

11.3.1 HashSet

HashSet是Set接口的典型实现,大多时候使用Set集合的时候都是使用这个实现类。因为使用Hash算法来储存元素,因此有很好的存储于查找性能。

1、HashSet 的特点

不能保证元素的排列顺序, 顺序可能与添加顺序不同, 顺序也有可能发生变化 HashSet 不是同步的, 如果多个线程同时访问一个HashSet , 假设有两个或者两个以上线程同时修改了HashSet 集合时, 则必须通过代码来保证其同步 集合元素值可以是null 。

当向HashSet 集合中存入一个元素时,会调用该对象的hashCode() 方法来得到该对象的hashCode 值,然后根据该hashCode 值决定该对象在HashSet 中的存储位置。

如果有两个元素通过equals() 方法比较返回true,但它们的hashCode()方法返回值不相等, HashSet 将会把它们存储在不同的位置,依然可以添加成功。

也就是说 HashSet 集合判断两个元素相等的标准是两个对象通过equals() 方法比较相等, 并且两个对象的hashCode() 方法返回值也相等。

@Test
    public void test01(){
    Set<String> set = new HashSet<>();
    set.add("张三");
    set.add("李四");
    set.add("李四");
    set.add("李四");
    set.add("王五");
    System.out.println(set);
//    总结HashSet没有顺序,而且不会重复
}

11.3.2 TreeSet

介绍Set集合的时候说过,Set基本是无序的,但凡事总有例外,TreeSet就是Set中的例外,它储存的数据是有序的!

@Test
    public void test02(){
    TreeSet<String> tree = new TreeSet<>();
    tree.add("小吴");
    tree.add("小蓝");
    tree.add("小绿");
    System.out.println(tree);
//    String中的排序方法
}
@Test
    public void test03(){
    TreeSet<String> tree = new TreeSet<>(new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            return o1.length()-o2.length();
        }
    });
    tree.add("asdfasdfa");
    tree.add("asasdfa");
    tree.add("asdffa");
    tree.add("dasdfa");
    System.out.println(tree);
}
@Test
    public void test04(){
    TreeSet<Student> tree = new TreeSet<>(new Comparator<Student>() {
        @Override
        public int compare(Student o1, Student o2) {
            int num = o1.getAge()-o2.getAge();
            return num==0?o1.getId()-o2.getId():num;
        }
    });
    tree.add(new Student(2,"张三",45));
    tree.add(new Student(1,"张三",24));
    tree.add(new Student(3,"张三",15));
    tree.add(new Student(5,"张三",43));
    tree.add(new Student(4,"张三",43));
    System.out.println(tree);
}

11.5 Collections工具类

参考操作数组的工具类:Arrays。

Collections 是一个操作 Set、List 和 Map 等集合的工具类。Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法:

  • public static <T> boolean addAll(Collection<? super T> c,T... elements)将所有指定元素添加到指定 collection 中。

  • public static <T> int binarySearch(List<? extends Comparable<? super T>> list,T key)在List集合中查找某个元素的下标,但是List的元素必须是T或T的子类对象,而且必须是可比较大小的,即支持自然排序的。而且集合也事先必须是有序的,否则结果不确定。

  • public static <T> int binarySearch(List<? extends T> list,T key,Comparator<? super T> c)在List集合中查找某个元素的下标,但是List的元素必须是T或T的子类对象,而且集合也事先必须是按照c比较器规则进行排序过的,否则结果不确定。

  • public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)在coll集合中找出最大的元素,集合中的对象必须是T或T的子类对象,而且支持自然排序

  • public static <T> T max(Collection<? extends T> coll,Comparator<? super T> comp)在coll集合中找出最大的元素,集合中的对象必须是T或T的子类对象,按照比较器comp找出最大者

  • public static void reverse(List<?> list)反转指定列表List中元素的顺序。

  • public static void shuffle(List<?> list) List 集合元素进行随机排序,类似洗牌

  • public static <T extends Comparable<? super T>> void sort(List<T> list)根据元素的自然顺序对指定 List 集合元素按升序排序

  • public static <T> void sort(List<T> list,Comparator<? super T> c)根据指定的 Comparator 产生的顺序对 List 集合元素进行排序

  • public static void swap(List<?> list,int i,int j)将指定 list 集合中的 i 处元素和 j 处元素进行交换

  • public static int frequency(Collection<?> c,Object o)返回指定集合中指定元素的出现次数

  • public static <T> void copy(List<? super T> dest,List<? extends T> src)将src中的内容复制到dest中

  • public static <T> boolean replaceAll(List<T> list,T oldVal,T newVal):使用新值替换 List 对象的所有旧值

  • Collections 类中提供了多个 synchronizedXxx() 方法,该方法可使将指定集合包装成线程同步的集合,从而可以解决多线程并发访问集合时的线程安全问题

  • Collections类中提供了多个unmodifiableXxx()方法,该方法返回指定 Xxx的不可修改的视图。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/636398.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度学习-转置卷积

转置卷积 转置卷积&#xff08;Transposed Convolution&#xff09;&#xff0c;也被称为反卷积&#xff08;Deconvolution&#xff09;&#xff0c;是深度学习中的一种操作&#xff0c;特别是在卷积神经网络&#xff08;CNN&#xff09;中。它可以将一个低维度的特征图&#x…

深入 Rust 标准库,Rust标准库源代码系统分析

系列文章目录 送书第一期 《用户画像&#xff1a;平台构建与业务实践》 送书活动之抽奖工具的打造 《获取博客评论用户抽取幸运中奖者》 送书第二期 《Spring Cloud Alibaba核心技术与实战案例》 送书第三期 《深入浅出Java虚拟机》 送书第四期 《AI时代项目经理成长之道》 …

智能猫眼锁核心解决方案以及芯片简介SSD222

书接上回&#xff0c;前篇文章我们诠释了IP 网络摄像系统的定义以及组成部分的功能&#xff0c;也大概的讲了一下所针对的市场以及举例介绍了一款相关芯片&#xff0c;详情可点击下面卡片浏览高集成IP摄像SOC处理方案简介https://blog.csdn.net/Chipsupply/article/details/139…

PDF Reader Pro for Mac 直装激活版:专业PDF阅读编辑软件

在数字化时代&#xff0c;PDF文件已成为我们日常工作和学习中不可或缺的一部分。然而&#xff0c;如何高效、便捷地阅读、编辑和管理这些PDF文件&#xff0c;却一直是许多人面临的难题。现在&#xff0c;有了PDF Reader Pro for Mac&#xff0c;这些难题将迎刃而解。 PDF Reade…

谷歌快速收录怎么做?

快速收录顾名思义&#xff0c;就是让新的的网页内容能够迅速被谷歌搜索引擎抓取、索引和显示在搜索结果中&#xff0c;这对于做seo来说非常重要&#xff0c;因为它有助于新发布的内容尽快出现在谷歌的搜索结果中&#xff0c;从而增加网站的流量 想做谷歌快速收录谷歌推荐了几种…

AD162A低功耗语音解码芯片,助眠耳机方案推荐—云信通讯

睡眠一直是很多人所追寻的目标&#xff0c;无论是因为工作压力过大&#xff0c;还是日常烦扰的思绪&#xff0c;一个好的睡眠质量对每个人来说都至关重要。为了解决这个问题&#xff0c;一些科技公司开发了高品质的助眠耳机&#xff0c;通过音乐和声音来帮助入睡&#xff0c;为…

华为大咖说 | 企业应用AI大模型的“道、法、术” ——道:认知篇

本文作者&#xff1a;郑岩&#xff08;华为云AI变革首席专家&#xff09;全文约3313字&#xff0c;阅读约需8分钟&#xff0c;请仔细看看哦~ 前阵子&#xff0c;我在公司内部发了一篇Sora的科普贴&#xff0c;本来只是个简单的技术总结&#xff0c;但让我意外的是&#xff0c;…

linux系统安全加固

目录 1、账户安全基本措施 1&#xff09;系统账户清理 2&#xff09;密码安全控制 3&#xff09;命令历史限制 2、用户切换及提权 1&#xff09;使用 su命令切换用户 2&#xff09;使用sudo机制提升权限 3、系统引导和安全登录控制 1&#xff09;开机安全控制 2&…

docker如何拉取nginx最新镜像并运行

要拉取Docker Hub上的最新Nginx镜像&#xff0c;您可以使用以下命令&#xff1a; docker pull nginx 这个命令会从Docker Hub下载最新版本的Nginx镜像。如果您想要拉取特定版本的Nginx镜像&#xff0c;可以指定版本号&#xff0c;例如&#xff1a; docker pull nginx:1.18.0 拉…

实在智能签约世界机械500强特变电工 ,加速能源装备巨头智能化升级

近日&#xff0c;世界机械500强、中国企业500强特变电工集团正式与实在智能达成战略合作&#xff0c;由实在智能为其部署RPA数字员工解决方案&#xff0c;助力集团公司各级财务部门提升自动化水平&#xff0c;进一步实现集团内降本增效目标。 关于特变电工 特变电工是国家级高…

AI工具推荐:提升工作效率与生活质量

有哪些好用&#xff0c;且国内可用的AI工具&#xff1f; 副本 在AI大发展的年代&#xff0c;还有人在工作、生活中没有使用过AI吗&#xff1f; 今天为大家推荐几款国内可用、好用的AI工具&#xff0c;不论是自媒体文案写作、打工人汇报PPT、还是论文、公文写作&#xff0c;总…

Centos7离线安装RabbitMQ教程

目录 安装包准备开始安装1. 创建目录2. 上传文件3. 安装erlang语言4. 安装socat5. 安装rabbitmq6. 启动、停止rabbitmq7. 设置开机启动8. 开启web界面管理工具9. 开启防火墙(root)10. 访问页面11. 附录 安装包准备 &#xff08;1&#xff09;准备RabbitMQ的安装包&#xff08;…

使用中心点检测进行对象检测、3D 检测和姿态估计:

检测将对象识别为图像中轴对齐的框。大多数成功的物体检测器都枚举了几乎详尽的潜在物体位置列表&#xff0c;并对每个位置进行分类。这是浪费、低效的&#xff0c;并且需要额外的后处理。在本文中&#xff0c;我们采用了不同的方法。我们将一个对象建模为一个点&#xff0c;即…

张驰咨询:告别杂乱无章,让精益生产培训帮你搞定一切!

在当今快速变化和竞争激烈的市场环境中&#xff0c;企业要想持续发展&#xff0c;提升生产效率和降低成本是关键。精益生产培训作为一种高效的生产方式和管理哲学&#xff0c;为企业提供了实现这些目标的有效途径。以下是张驰咨询对精益生产培训核心理念、实践方法及其对企业持…

关于光照模型

关于光照模型 早期学习笔记&#xff0c;转载自早期Excel。 存在大量格式错误、可读性非常低&#xff0c;建议等待作者修复后阅读、或者作为查找性材料使用。 中文名英文名/缩写说明长什么样兰伯特光照模型Lambert Lighting1.兰伯特反射(Lambert)是最常见的一种漫反射&#x…

C++ const_cast学习

语法&#xff0c; const_cast<type_name>(expression) type_name是转换的类型&#xff0c;expression是被转换的对象或者表达式&#xff1b; const_case有两个功能&#xff0c;分别是去掉const和加上const&#xff0c;更多用于去掉const&#xff0c;修改被const修…

亚马逊卖家账号注册复杂吗?需要什么辅助工具吗?

在当今数字化的商业世界中&#xff0c;亚马逊作为全球最大的电商平台之一&#xff0c;吸引着无数的卖家和买家。对于想要进入亚马逊销售市场的卖家来说&#xff0c;首先要完成的一项重要任务就是注册亚马逊卖家账号。本文将详细介绍亚马逊注册的步骤、所需时间&#xff0c;以及…

软件无线电学习-第二代移动通信系统过程理解

本文知识内容摘自《软件无线电原理和应用》 无线通信领域让大家感受最深的是民用移动通信的快速发展。民用移动通信在短短的二十年时间里已发展了三代&#xff1a;20世纪80年代的模拟体制(TACS/AMPS)为第一代移动通信(简称1G)&#xff1b;20世纪90年代的数字体制(GSMCDMATDMA)…

Git原理及常用命令小结——实用版(ing......)、Git设置用户名邮箱

Git基本认识 Git把数据看作是对小型文件系统的一组快照&#xff0c;每次提交更新&#xff0c;或在Git中保存项目状态时&#xff0c;Git主要对当时的全部文件制作一个快照并保存这个快照的索引。同时&#xff0c;为了提高效率&#xff0c;如果文件没有被修改&#xff0c;Git不再…

招展工作全面启动!2024深圳国际数字能源展览会

2024深圳国际数字能源展览会 2024 International Digital Energy Expo 时间:2024年9月8-11日 地点:深圳会展中心 指导单位&#xff1a; 国家能源局 深圳市人民政府 中国电力企业联合会 主办单位&#xff1a; 深圳市投资控股有限公司 深圳能源集团股份有限公司 深圳市资…