草庐IT

Collections类详解

不爱吃苹果’‘ 2023-04-28 原文

目录

一.Collections概述:

   1.1什么是Collections类:

   1.2 Collections类和collection的区别和联系:

二. Collections类的主要方法:

一.Collections概述:

     1.1  什么是Collections类:

  • Java.util.Collections是一个集合工具类,用于操作LIst,Set,Map等集合。

  • Collections类提供了一系列的静态方法,可以实现对集合元素的排序,添加一些元素,随机排序,替换等操作。

       注意:Collections类不能new对象,不是因为没有构造方法,而是因为Collections的构造方法被私有化处理了。但是调用方法可以直接通过类名调用Collections类的方法,因为Collections类中的方法都是被static修饰了,可以直接用类名调用。

   1.2 Collections类和collection的区别和联系:

区别:

  • Collections是一个工具类,有属性和静态方法
  • Collection是一个根接口,下面有List和Set接口,两个接口各有他们具体的实现类。
  • 他们只有一个字母的区别,但是两者是完全不同的概念。

联系:

  • Collctions中提供给collection接口下的Set和List集合许多方法,方便对集合中的元素更好的处理。

二. Collections类的主要方法:

Collections中的方法都是静态方法,可以通过类名.方法名直接调用。

1.public static void shuffle(List)。混乱排序   

2.public static <T> boolean addAll(Collection<T> c, T... elements)。添加一些元素

3.public static <T> void sort(List<T> list,Comparator<? super T> )。  排序,将集合中元素按照指定规则排序

4.public static <T extends Comparable<? super T>> void sort(List<T> list)。  排序,将集合中元素按照默认规则排序。

5.public static int binarySearch(List list, Object key)。查找,使用二分搜索法搜索指定的 List 集合,以获得指定对象在 List 集合中的索引。如果要使该方法可以正常工作,则必须保证 List 中的元素已经处于有序状态。

6.public static void copy(List <? super T> dest,List<? extends T> src)  复制, 用于将指定集合中的所有元素复制到另一个集合中。

7.public static void replaceAll()。替换,替换集合中所有的旧元素为新元素

1.shuffle()随机排序:

shuffle方法用于将集合中的元素,随机打乱原来的顺序。

          注意:shuffle中的集合只能是List集合。Set集合会报错。

使用案例:

import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;

public class CollectionsTest {
    public static void main(String[] args) {

//创建一个Linkedlist集合
     LinkedList linkedList = new LinkedList();
        inkedList.add(123);
        linkedList.add(456);
        linkedList.add(234);
        linkedList.add(567);
 for (int i = 0; i <linkedList.size() ; i++) {
            System.out.println(linkedList.get(i));
        }

        //打乱顺序
        Collections.shuffle(linkedList);
        System.out.println("===========");
        System.out.println("打乱顺序之后:");
  for (int i = 0; i <linkedList.size() ; i++) {
            System.out.println(linkedList.get(i));
        }
    }

}

运行结果:

2.  addAll()   添加一些元素:

作用:

addAll方法用于往集合中快速添加一些元素

用法:

第一个形参放集合对象,之后放参数1 ,参数2, 可变参数类型... 。

什么是可变参数类型呢?

方法中的某个参数在实际调用时,实参个数可以0个,或者1个,或者多个。这个参数就是可变参数。可变参数参数的意义:方便方法的调用,可以传入任意多个同类型的数据。

注意点:

  1. 如果方法中有多个参数,可变参数要放到最后。

  2. 一个方法只能有一个可变参数

使用案例:

1.创建多个学生对象。

2.把学生用addAll方法装入Linkedlist集合中

import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;

public class CollectionsTest {
    public static void main(String[] args) {
//创建一个linkedlist集合
        LinkedList linkedList = new LinkedList();
        Student student1 = new Student(1, "章1");
        Student student2 = new Student(6, "章2");
        Student student3 = new Student(9, "章3");
        Student student4 = new Student(1, "章4");
Collections.addAll(linkedList,student1,student2,student3,student4);
for (int i = 0; i <linkedList.size() ; i++) {
            System.out.println(linkedList.get(i));
        }

运行结果:

3. sort()自然排序:

作用:

把集合中的元素按照规则升序或者降序,再或者什么也不干。

注意点:

当使用sort方法时,该集合元素必须是Comparable的子类型,也就是集合中的元素必须实现comparable接口中的comparaTo方法。否则不能使用该方法。

public int compareTo(T o);

必须实现这个抽象方法,才能使用sort方法。但是由于我们一些基本的常用类如String,基本数据类型的包装类等,已经实现了该方法,所以我们不需要自己重写该方法了。自定义类型使用sort方法就必须实现comparaTo方法。

4.sort()自定义排序:

自定义类型,如学生类,有属性:年龄,姓名等。创建多个学生类对象,放入List集合中。自定义使用sort方法时就必须重写comparaTo方法。

@Override
    public int compareTo(Student2 o) {
        return this.age-o.age;
    }

重写之后的comparaTo方法。 

重载之后的sort():

sort()方法还有第二种类型(collection,new Comparator<Object>)

Comparator是一个接口,实际上是new了Comparator的实现类,但是要实现里面的抽象方法。

使用案例:

1.自定义一个学生类,有年龄,姓名,成绩属性。

2.创建5个学生对象,然后根据他们年龄大小实现年龄升序和成绩降序输出。

import java.util.Collections;
import java.util.LinkedList;

public class CollectionsTest2 {
    public static void main(String[] args) {
        LinkedList linkedList = new LinkedList();
        Student2 student1 = new Student2(10, "章1");
        Student2 student2 = new Student2(16, "章2");
        Student2 student3 = new Student2(19, "章3");
        Student2 student4 = new Student2(18, "章4");
        //把对象添加到集合中
        Collections.addAll(linkedList,student1,student2,student3,student4);
        Collections.sort(linkedList);
        for (int i = 0; i <linkedList.size() ; i++) {
            System.out.println(linkedList.get(i));
        }
    }
}
class Student2 implements Comparable<Student2>{
    int age;
    String name;
    public Student2(int age, String name) {
        this.age = age;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student2{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
    @Override
    public int compareTo(Student2 o) {
        return this.age-o.age;
    }
}

 

注意点:

1.按照某种规则排序,是重写comparaTo方法时,用什么属性去比较,这个比较的属性就是比较规则排序。

2.实现升序或者降序规则:this(当前调用方法的对象)  o(参数传入)
        所有比较最底层的逻辑都是发生两两比较逻辑,返回比较结果
        正数  this.age > o.age
        负数  this.age < o.age
        0     this.age==o.age。

6.copy()  复制:

 作用:将指定集合中的所有元素复制到另一个集合中。

 使用:

(List <? super T> dest,List<? extends T> src)

dest是目标集合,src是原集合。把原集合中的元素放到目标集合中。

使用注意点:

1。原集合复制到目标集合中去,原集合会覆盖掉目标集合中元素,这个覆盖从索引值为0开始覆盖,直到原集合复制完毕。

2.目标集合的长度至少和源集合的长度相同,如果目标集合的长度更长,则不影响目标集合中的其余元素。如果目标集合长度不够而无法包含整个源集合元素,程序将抛出 IndexOutOfBoundsException 异常。

3.copy方法也只能复制List集合,不能复制set集合

个人见解:由于会覆盖掉目标集合的元素,我觉得没有太多的用处

使用案例:

1.把集合1赋值到集合2中

import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;

public class CollectionsTest2 {
    public static void main(String[] args) {
        LinkedList linkedList = new LinkedList();
        LinkedList linkedList1 = new LinkedList();
//创建两个set集合
        HashSet hashSet = new HashSet();
        HashSet hashSet1 = new HashSet();

        linkedList1.add(123);
        linkedList1.add(222);
        linkedList.add(333);
        linkedList.add(444);
        linkedList.add(888);
        hashSet.add(234);
        hashSet1.add(666);
        Collections.copy(linkedList, linkedList1);
          //使用copy方法复制set会报错
//        Collections.copy(hashSet,hashSet1);
        for (int i = 0; i < linkedList.size(); i++) {
            System.out.println(linkedList.get(i));
//        }
        }
    }
}

运行结果:

7.replaceAll()。替换:

作用:替换集合中所有的旧元素为新元素

使用:

(List list, Object oldVal, Object newVal)

list需要替换的集合,oldval需要被替换的值,newval新的值

使用案例:

把集合中的333替换成字符串“8888”

import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;

public class CollectionsTest2 {
    public static void main(String[] args) {
        LinkedList linkedList = new LinkedList();
        linkedList.add(123);
        linkedList.add(222);
        linkedList.add(333);
        linkedList.add(444);
        linkedList.add(888);
        hashSet.add(234);
        hashSet1.add(666);
//替换
        Collections.replaceAll(linkedList,333,"8888");
        for (int i = 0; i < linkedList.size(); i++) {
            System.out.println(linkedList.get(i));
//        }
        }
    }
}

有关Collections类详解的更多相关文章

  1. java - Ruby 相当于 Java 的 Collections.unmodifiableList 和 Collections.unmodifiableMap - 2

    Java的Collections.unmodifiableList和Collections.unmodifiableMap在Ruby标准API中是否有等价物? 最佳答案 使用freeze应用程序接口(interface):Preventsfurthermodificationstoobj.ARuntimeErrorwillberaisedifmodificationisattempted.Thereisnowaytounfreezeafrozenobject.SeealsoObject#frozen?.Thismethodretur

  2. 物联网MQTT协议详解 - 2

    一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su

  3. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

  4. 【详解】Docker安装Elasticsearch7.16.1集群 - 2

    开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建

  5. 【Elasticsearch基础】Elasticsearch索引、文档以及映射操作详解 - 2

    文章目录概念索引相关操作创建索引更新副本查看索引删除索引索引的打开与关闭收缩索引索引别名查询索引别名文档相关操作新建文档查询文档更新文档删除文档映射相关操作查询文档映射创建静态映射创建索引并添加映射概念es中有三个概念要清楚,分别为索引、映射和文档(不用死记硬背,大概有个印象就可以)索引可理解为MySQL数据库;映射可理解为MySQL的表结构;文档可理解为MySQL表中的每行数据静态映射和动态映射上面已经介绍了,映射可理解为MySQL的表结构,在MySQL中,向表中插入数据是需要先创建表结构的;但在es中不必这样,可以直接插入文档,es可以根据插入的文档(数据),动态的创建映射(表结构),这就

  6. 最强Http缓存策略之强缓存和协商缓存的详解与应用实例 - 2

    HTTP缓存是指浏览器或者代理服务器将已经请求过的资源保存到本地,以便下次请求时能够直接从缓存中获取资源,从而减少网络请求次数,提高网页的加载速度和用户体验。缓存分为强缓存和协商缓存两种模式。一.强缓存强缓存是指浏览器直接从本地缓存中获取资源,而不需要向web服务器发出网络请求。这是因为浏览器在第一次请求资源时,服务器会在响应头中添加相关缓存的响应头,以表明该资源的缓存策略。常见的强缓存响应头如下所述:Cache-ControlCache-Control响应头是用于控制强制缓存和协商缓存的缓存策略。该响应头中的指令如下:max-age:指定该资源在本地缓存的最长有效时间,以秒为单位。例如:Ca

  7. IDEA 2022 创建 Spring Boot 项目详解 - 2

    如何用IDEA2022创建并初始化一个SpringBoot项目?目录如何用IDEA2022创建并初始化一个SpringBoot项目?0. 环境说明1.  创建SpringBoot项目 2.编写初始化代码0. 环境说明IDEA2022.3.1JDK1.8SpringBoot1.  创建SpringBoot项目        打开IDEA,选择NewProject创建项目。        填写项目名称、项目构建方式、jdk版本,按需要修改项目文件路径等信息。        选择springboot版本以及需要的包,此处只选择了springweb。        此处需特别注意,若你使用的是jdk1

  8. 详解Unity中的粒子系统Particle System (二) - 2

    前言上一篇我们简要讲述了粒子系统是什么,如何添加,以及基本模块的介绍,以及对于曲线和颜色编辑器的讲解。从本篇开始,我们将按照模块结构讲解下去,本篇主要讲粒子系统的主模块,该模块主要是控制粒子的初始状态和全局属性的,以下是关于该模块的介绍,请大家指正。目录前言本系列提要一、粒子系统主模块1.阅读前注意事项2.参考图3.参数讲解DurationLoopingPrewarmStartDelayStartLifetimeStartSpeed3DStartSizeStartSize3DStartRotationStartRotationFlipRotationStartColorGravityModif

  9. VMware虚拟机与本地主机进行磁盘共享(详解) - 2

    VMware虚拟机与本地主机进行磁盘共享前提虚拟机版本为Windows10(专业版,不是可能有问题)本地主机为家庭版或学生版(此版本会有问题,但有替代方式)最好是专业版VMware操作1.关闭防火墙,全部关闭。2.打开电脑属性3.点击共享-》高级共享-》权限4.如果没有everyone,就添加权限选择完全控制,然后应用确定。5.打开cmd输入lusrmgr.msc(只有专业版可以打开)如果不是专业版,可以跳过这一步。点击用户-》administrator密码要复杂密码,否则不行。推荐admaiN@1234类型的密码。设置完密码,点击属性,将禁用解开。6.如果虚拟机的windows不是专业版,可

  10. ruby-on-rails - rails/事件记录 : save changes to a model's associated collections - 2

    我是否必须保存对模型集合中单个项目的修改,或者是否有一种方法可以在我保存模型时调用以保存它们。#save似乎没有这样做。例如:irb>rental=#...#=>#irb>rental.dvd#=>#,sale_price:#>irb>rental.dvd.copies+=1#=>21irb>rental.save#=>trueirb>rental.dvd#=>#,sale_price:#>irb>Dvd.find_by_title('TheWomenofSummer')#=>#,sale_price:#>在上面的例子中,租赁的DVD副本似乎没有更新数据库中的副本(注意不同的副本数)。

随机推荐