【List】判断集合相等、集合拷贝

【List】判断集合相等、集合拷贝

  • 【一】判断集合是否相等
      • 【1】☆使用list中的containAll
      • 【2】使用for循环遍历+contains方法
      • 【3】将list先排序再转为String进行比较
      • 【4】使用list.retainAll()方法
      • 【5】使用MD5加密方式
      • 【6】转换为Java8中的新特性steam流再进行排序来进行比较
  • 【二】准备一个判断集合是否相等的工具类
  • 【三】List的深拷贝和浅拷贝
      • 【1】什么是浅拷贝(Shallow Copy)和深拷贝(Deep Copy)?
      • 【2】浅拷贝
      • 【3】深拷贝
      • 【4】对象如何实现深拷贝?
  • 【四】List如何实现复制
      • 【1】浅拷贝
        • 【1】循环遍历复制(含测试方法)
        • 【2】使用 List 实现类的构造方法
        • 【3】使用 list.addAll() 方法
        • 【4】使用 java.util.Collections.copy() 方法
        • 【5】使用 Java 8 Stream API 将 List 复制到另一个 List 中
        • 【6】在 JDK 10 中的使用方式
      • 【2】深拷贝

【一】判断集合是否相等

【1】☆使用list中的containAll

此方法是判断list2是否是list的子集,即list2包含于list

    //方法一:使用list中的containsAll方法,此方法是判断list2是否是list的子集,即list2包含于listpublic static void compareByContainsAll(List<String> list,List list2){boolean flag = false;if (list.size()==list2.size()){if (list.containsAll(list2)){flag = true;}}System.out.println("方法一:"+flag);}

【2】使用for循环遍历+contains方法

  //方法二:使用for循环遍历+contains方法public static void compareByFor(List<String> list,List list2){boolean flag = false;if (list.size()==list2.size()){for (String str :list){if (!list2.contains(str)){System.out.println(flag);return;}}flag = true;}System.out.println("方法二:"+flag);}

【3】将list先排序再转为String进行比较

(此方法由于涉及同集合内的排序,因此需要该集合内数据类型一致)

    //方法三:将list先排序再转为String进行比较(此方法由于涉及同集合内的排序,因此需要该集合内数据类型一致)public static void compareByString(List<String> list,List list2){boolean flag = false;if (list.size()==list2.size()){//使用外部比较器Comparator进行排序,并利用Java8中新添加的特性方法引用来简化代码list.sort(Comparator.comparing(String::hashCode));//使用集合的sort方法对集合进行排序,本质是将集合转数组,再使用比较器进行排序Collections.sort(list2);if (list.toString().equals(list2.toString())){flag = true;}}System.out.println("方法三:"+flag);}

如果涉及到引用数据的排序比如里面的一个个对象数据,则需要实现Comparable接口,并重写CompareTo方法,在此方法中指定排序原则

package com.example.demo.utils;import lombok.Data;/*** @author zhangqianwei* @date 2021/9/7 17:25*/
@Data
public class Student  implements Comparable<Student>{private int id;private String name;private int age;private String sex;public Student() {}public Student(int id, String name, int age, String sex) {this.id = id;this.name = name;this.age = age;this.sex = sex;}@Overridepublic int compareTo(Student o) {//按照年龄排序int result=this.getAge()-o.getAge();return result;}
}
    //如果涉及到引用数据的排序比如里面的一个个对象数据,则需要实现Comparable接口,并重写CompareTo方法,在此方法中指定排序原则public static void compareBySort(){ArrayList<Student> stus=new ArrayList<Student>();Student stu1=new Student(1,"张三",23,"男");Student stu2=new Student(2,"李四",21,"女");Student stu3=new Student(3,"王五",22,"女");Student stu4=new Student(4,"赵六",22,"女");stus.add(0,stu1);stus.add(1,stu2);stus.add(2,stu3);stus.add(3,stu4);System.out.println("原始顺序:"+stus);Collections.sort(stus);System.out.println("排序后:"+stus);}

【4】使用list.retainAll()方法

如果集合list2中的元素都在集合list中则list2中的元素不做移除操作,反之如果只要有一个不在list中则会进行移除操作。即:list进行移除操作返回值为:true反之返回值则为false。

    //方法四:使用list.retainAll()方法,此方法本质上是判断list是否有移除操作,如果list2是list的子集则不进行移除返回false,否则返回true//如果集合list2中的元素都在集合list中则list2中的元素不做移除操作,反之如果只要有一个不在list中则会进行移除操作。即:list进行移除操作返回值为:true反之返回值则为false。public static void compareByRetainAll(List<String> list,List list2){boolean flag = false;if (list.size()==list2.size()){if (!list.retainAll(list2)){flag = true;}System.out.println("方法四:"+flag);}}

【5】使用MD5加密方式

使用MD5加密方式判断是否相同,这也算是list转String的一个变化,将元素根据加密规则转换为String加密字符串具有唯一性故可以进行判断;
根据唯一性可以想到map中的key也是具有唯一性的,将list中的元素逐个添加进map中作为key然后遍历比较list2中的元素是否都存在其中,不过这个要求list中的元素不重复

【6】转换为Java8中的新特性steam流再进行排序来进行比较

public static void compareBySteam(List<String> list,List list2){boolean flag = false;if (list.size() == list2.size()){String steam = list.stream().sorted().collect(Collectors.joining());String steam2 = (String) list2.stream().sorted().collect(Collectors.joining());if (steam.equals(steam2)){flag = true;}}System.out.println("方法六:"+flag);
}

【二】准备一个判断集合是否相等的工具类

静态方法,全局调用

package com.example.demo.utils;import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;/*** @author zhangqianwei* @date 2021/10/8 11:46*/
public class compareList {//比较两个集合是否相同public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("南京");list.add("苏州");list.add("常州");List list2 = new ArrayList<>();list2.add("常州");list2.add("苏州");list2.add("南京");compareByContainsAll(list,list2);compareByFor(list,list2);compareByString(list,list2);compareBySort();compareByRetainAll(list,list2);compareBySteam(list,list2);}//方法一:使用list中的containsAll方法,此方法是判断list2是否是list的子集,即list2包含于listpublic static void compareByContainsAll(List<String> list,List list2){boolean flag = false;if (list.size()==list2.size()){if (list.containsAll(list2)){flag = true;}}System.out.println("方法一:"+flag);}//方法二:使用for循环遍历+contains方法public static void compareByFor(List<String> list,List list2){boolean flag = false;if (list.size()==list2.size()){for (String str :list){if (!list2.contains(str)){System.out.println(flag);return;}}flag = true;}System.out.println("方法二:"+flag);}//方法三:将list先排序再转为String进行比较(此方法由于涉及同集合内的排序,因此需要该集合内数据类型一致)public static void compareByString(List<String> list,List list2){boolean flag = false;if (list.size()==list2.size()){//使用外部比较器Comparator进行排序,并利用Java8中新添加的特性方法引用来简化代码list.sort(Comparator.comparing(String::hashCode));//使用集合的sort方法对集合进行排序,本质是将集合转数组,再使用比较器进行排序Collections.sort(list2);if (list.toString().equals(list2.toString())){flag = true;}}System.out.println("方法三:"+flag);}//如果涉及到引用数据的排序比如里面的一个个对象数据,则需要实现Comparable接口,并重写CompareTo方法,在此方法中指定排序原则public static void compareBySort(){ArrayList<Student> stus=new ArrayList<Student>();Student stu1=new Student(1,"张三",23,"男");Student stu2=new Student(2,"李四",21,"女");Student stu3=new Student(3,"王五",22,"女");Student stu4=new Student(4,"赵六",22,"女");stus.add(0,stu1);stus.add(1,stu2);stus.add(2,stu3);stus.add(3,stu4);System.out.println("原始顺序:"+stus);Collections.sort(stus);System.out.println("排序后:"+stus);}//方法四:使用list.retainAll()方法,此方法本质上是判断list是否有移除操作,如果list2是list的子集则不进行移除返回false,否则返回true//如果集合list2中的元素都在集合list中则list2中的元素不做移除操作,反之如果只要有一个不在list中则会进行移除操作。即:list进行移除操作返回值为:true反之返回值则为false。public static void compareByRetainAll(List<String> list,List list2){boolean flag = false;if (list.size()==list2.size()){if (!list.retainAll(list2)){flag = true;}System.out.println("方法四:"+flag);}}//方法五:使用MD5加密方式判断是否相同,这也算是list转String的一个变化,将元素根据加密规则转换为String加密字符串具有唯一性故可以进行判断//根据唯一性可以想到map中的key也是具有唯一性的,将list中的元素逐个添加进map中作为key然后遍历比较list2中的元素是否都存在其中,不过这个要求list中的元素不重复//方法六:转换为Java8中的新特性steam流再进行排序来进行比较public static void compareBySteam(List<String> list,List list2){boolean flag = false;if (list.size() == list2.size()){String steam = list.stream().sorted().collect(Collectors.joining());String steam2 = (String) list2.stream().sorted().collect(Collectors.joining());if (steam.equals(steam2)){flag = true;}}System.out.println("方法六:"+flag);}}

【三】List的深拷贝和浅拷贝

【1】什么是浅拷贝(Shallow Copy)和深拷贝(Deep Copy)?

浅拷贝只复制某个对象的引用,而不复制对象本身,新旧对象还是共享同一块内存。深拷贝会创造一个一模一样的对象,新对象和原对象不共享内存,修改新对象不会改变原对象。

假设 B 复制了 A,当修改 A 时,看 B 是否会发生变化。如果 B 也跟着变了,说明这是浅拷贝,如果 B 没变,那就是深拷贝。

【2】浅拷贝

对于数据类型是基本数据类型(整型:byte、short、int、long;字符型:char;浮点型:float、double;布尔型:boolean)的成员变量,浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象。因为是两份不同的数据,所以对其中一个对象的该成员变量值进行修改,不会影响另一个对象拷贝得到的数据。

对于数据类型是引用数据类型(比如说成员变量是某个数组、某个类的对象等)的成员变量,浅拷贝会进行引用传递,也就是只是将该成员变量的引用值(内存地址)复制一份给新的对象。因为实际上两个对象的该成员变量都指向同一个实例,在这种情况下,在一个对象中修改该成员变量会影响到另一个对象的该成员变量值。

【3】深拷贝

相对于浅拷贝而言,深拷贝对于引用类型的修改,并不会影响到对应的拷贝对象的值。

备注:一般在讨论深拷贝和浅拷贝时,通常是针对引用数据类型而言的。因为基本数据类型在进行赋值操作时(也就是拷贝)是直接将值赋给了新的变量,也就是该变量是原变量的一个副本,这个时候你修改两者中的任何一个的值都不会影响另一个。而对于引用数据类型来说,在进行浅拷贝时,只是将对象的引用复制了一份,也就是内存地址,即两个不同的变量指向了同一个内存地址,那么改变任一个变量的值,都是改变这个内存地址所存储的值,所以两个变量的值都会改变。

Java 对对象和基本数据类型的处理是不一样的。在 Java 中,用对象作为入口参数传递时,缺省为 “引用传递”,也就是说仅仅传递了对象的一个”引用”。当方法体对输入变量修改时,实质上就是直接操作这个对象。 除了在函数传值的时候是”引用传递”,在任何用 ”=” 向对象变量赋值的时候都是”引用传递”。

将对象序列化为字节序列后,再通过反序列化即可完美地实现深拷贝。

【4】对象如何实现深拷贝?

Object 对象声明了 clone() 方法,如下代码所示。

	/*** Creates and returns a copy of this object.  The precise meaning* of "copy" may depend on the class of the object. The general* intent is that, for any object {@code x}, the expression:* <blockquote>* <pre>* x.clone() != x</pre></blockquote>* will be true, and that the expression:* <blockquote>* <pre>* x.clone().getClass() == x.getClass()</pre></blockquote>* will be {@code true}, but these are not absolute requirements.* While it is typically the case that:* <blockquote>* <pre>* x.clone().equals(x)</pre></blockquote>* will be {@code true}, this is not an absolute requirement.* <p>* By convention, the returned object should be obtained by calling* {@code super.clone}.  If a class and all of its superclasses (except* {@code Object}) obey this convention, it will be the case that* {@code x.clone().getClass() == x.getClass()}.* <p>* By convention, the object returned by this method should be independent* of this object (which is being cloned).  To achieve this independence,* it may be necessary to modify one or more fields of the object returned* by {@code super.clone} before returning it.  Typically, this means* copying any mutable objects that comprise the internal "deep structure"* of the object being cloned and replacing the references to these* objects with references to the copies.  If a class contains only* primitive fields or references to immutable objects, then it is usually* the case that no fields in the object returned by {@code super.clone}* need to be modified.* <p>* The method {@code clone} for class {@code Object} performs a* specific cloning operation. First, if the class of this object does* not implement the interface {@code Cloneable}, then a* {@code CloneNotSupportedException} is thrown. Note that all arrays* are considered to implement the interface {@code Cloneable} and that* the return type of the {@code clone} method of an array type {@code T[]}* is {@code T[]} where T is any reference or primitive type.* Otherwise, this method creates a new instance of the class of this* object and initializes all its fields with exactly the contents of* the corresponding fields of this object, as if by assignment; the* contents of the fields are not themselves cloned. Thus, this method* performs a "shallow copy" of this object, not a "deep copy" operation.* <p>* The class {@code Object} does not itself implement the interface* {@code Cloneable}, so calling the {@code clone} method on an object* whose class is {@code Object} will result in throwing an* exception at run time.** @return     a clone of this instance.* @throws  CloneNotSupportedException  if the object's class does not*               support the {@code Cloneable} interface. Subclasses*               that override the {@code clone} method can also*               throw this exception to indicate that an instance cannot*               be cloned.* @see java.lang.Cloneable*/protected native Object clone() throws CloneNotSupportedException;

Object 的 clone() 方法本身是一个浅拷贝的方法,但是我们可以通过实现 Cloneable 接口,重写该方法来实现深拷贝,除了调用父类中的 clone() 方法得到新的对象, 还要将该类中的引用变量也 clone 出来。如果只是用 Object 中默认的 clone() 方法,是浅拷贝的。

如下代码所示,我们创建一个测试类 TestClone,实现深拷贝。

package com.example.test;import lombok.Data;
import lombok.SneakyThrows;@Data
public class TestClone implements Cloneable {private String a;// 构造函数TestClone(String str) {this.a = str;}@Overrideprotected TestClone clone() throws CloneNotSupportedException {TestClone newTestClone = (TestClone) super.clone();newTestClone.setA(this.a);return newTestClone;}@SneakyThrowspublic static void main(String[] args) {TestClone clone1 = new TestClone("a");TestClone clone2 = clone1.clone();System.out.println(clone2.a);     // aclone2.setA("b");System.out.println(clone1.a);     // aSystem.out.println(clone2.a);     // b}
}

【四】List如何实现复制

List 复制时有深拷贝和浅拷贝两类方式,分述如下。

【1】浅拷贝

List 其本质就是数组,而其存储的形式是地址,如下图所示。
在这里插入图片描述
将 listA 列表浅拷贝为 listB 时,listA 与 listB 指向同一地址,造成的后果就是,改变 listB 的同时也会改变 listA,因为改变listB 就是改变 listB 所指向的地址的内容,由于 listA 也指向同一地址,所以 listA 与 listB 一起改变。其常见的实现方式有如下几种(以上述代码中的 TestClone 为测试类)。

【1】循环遍历复制(含测试方法)
	@SneakyThrowspublic static void main(String[] args) {List<TestClone> listA = new ArrayList<>();TestClone testClone = new TestClone("a");listA.add(testClone);System.out.println(listA);  // [TestClone(a=a)]List<TestClone> listB = new ArrayList<>(listA.size());for (TestClone clone : listA) {listB.add(clone);}System.out.println(listB);  // [TestClone(a=a)]listA.get(0).setA("b");System.out.println(listA);  // [TestClone(a=b)]System.out.println(listB);  // [TestClone(a=b)]}
【2】使用 List 实现类的构造方法
@SneakyThrows
public static void main(String[] args) {List<TestClone> listA = new ArrayList<>();TestClone testClone = new TestClone("a");listA.add(testClone);List<TestClone> listB = new ArrayList<>(listA);
}
【3】使用 list.addAll() 方法
	@SneakyThrowspublic static void main(String[] args) {List<TestClone> listA = new ArrayList<>();TestClone testClone = new TestClone("a");listA.add(testClone);List<TestClone> listB = new ArrayList<>();listB.addAll(listA);}
【4】使用 java.util.Collections.copy() 方法
	public static void main(String[] args) {List<TestClone> listA = new ArrayList<>();TestClone clone = new TestClone("a");listA.add(clone);List<TestClone> listB = new ArrayList<>();listB.add(new TestClone("c"));System.out.println(listB);      // [TestClone(a=c)]Collections.copy(listB, listA);System.out.println(listB);      // [TestClone(a=a)]listA.get(0).setA("b");System.out.println(listA);      // [TestClone(a=b)]System.out.println(listB);      // [TestClone(a=b)]}
【5】使用 Java 8 Stream API 将 List 复制到另一个 List 中
	public static void main(String[] args) {List<TestClone> listA = new ArrayList<>();TestClone clone = new TestClone("a");listA.add(clone);List<TestClone> listB = listA.stream().collect(Collectors.toList());System.out.println(listB); // [TestClone(a=a)]listA.get(0).setA("b");System.out.println(listA); // [TestClone(a=b)]System.out.println(listB); // [TestClone(a=b)]}
【6】在 JDK 10 中的使用方式
	public static void main(String[] args) {List<TestClone> listA = new ArrayList<>();TestClone clone = new TestClone("a");listA.add(clone);List<TestClone> listB = List.copyOf(listA);listA.get(0).setA("b");System.out.println(listA);                  // [TestClone@76ed5528]System.out.println(listA.get(0).getA());    // bSystem.out.println(listB);                  // [TestClone@76ed5528]System.out.println(listB.get(0).getA());    // b}

【2】深拷贝

在这里插入图片描述
如图,深拷贝就是将 listA 复制给 listB 的同时,给 listB 创建新的地址,再将地址 A 的内容传递到地址 B。listA 与 listB 内容一致,但是由于所指向的地址不同,所以各自改变内容不会影响对方。深拷贝时,向新列表添加的是原列表中的元素执行 clone() 方法后的新对象。

	@SneakyThrowspublic static void main(String[] args) {List<TestClone> listA = new ArrayList<>();TestClone testClone = new TestClone("a");listA.add(testClone);List<TestClone> listB = new ArrayList<>();listB.add(listA.get(0).clone());System.out.println(listB);  // [TestClone(a=a)]listA.get(0).setA("b");System.out.println(listA);  // [TestClone(a=b)]System.out.println(listB);  // [TestClone(a=a)]}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI数字人直播源码出售价格公布!

随着数字人行业的兴起&#xff0c;以数字人直播为代表的应用场景逐渐成为人们日常生活中不可分割的一部分&#xff0c;再加上艾媒研究数据显示&#xff0c;超五成以上的被调查群体的企业使用过虚拟人技术&#xff0c;超三成被调查群体的企业计划使用虚拟人技术等结论的公布&…

python-图像模糊处理(赛氪OJ)

[题目描述] 给定 n 行 m 列的图像各像素点的灰度值&#xff0c;要求用如下方法对其进行模糊化处理&#xff1a; 1. 四周最外侧的像素点灰度值不变。 2. 中间各像素点新灰度值为该像素点及其上下左右相邻四个像素点原灰度值的平均&#xff08;四舍五入&#xff09;输入&#xff…

【C语言】inline 关键字

在C语言中&#xff0c;inline关键字用于建议编译器对函数进行内联展开&#xff0c;而不是像普通函数一样调用。内联函数的目的是减少函数调用的开销&#xff0c;特别是对于简单的、频繁调用的函数。 内联函数的定义和使用 定义内联函数 要定义一个内联函数&#xff0c;需要在…

《代号鸢》国服,能否推动国乙市场重新洗牌?

灵犀互娱《如鸢》顺利拿到版号&#xff0c;再次搅浑了国乙市场这潭水。 六月份游戏版号审批公布后&#xff0c;灵犀互娱运营的《如鸢》引起了关注&#xff0c;这个与《代号鸢》原名《三国志如鸢》雷同的名字&#xff0c;竟然让《代号鸢》玩家大面积破防了。 其实目前关于《如…

for循环中list触发fast-fail或不触发的原理和方法

Iterable和Iterator Iterator接口位于的位置是java.util.Iterator&#xff0c;它主要有两个抽象方法供子类实现。hasNext()用来判断还有没有数据可供访问&#xff0c;next()用来访问下一个数据。 集合Collection不是直接去实现Iterator接口&#xff0c;而是去实现Iterable接口…

【Python】字典练习

python期考练习 目录 1. 首都名​编辑 2. 摩斯电码 3. 登录 4. 学生的姓名和年龄​编辑 5. 电商 6. 学生基本信息 7. 字母数 1. 首都名 初始字典 (可复制) : d{"China":"Beijing","America":"Washington","Norway":…

HCM智能人力资源系统存在命令执行漏洞Getshell

0x01 阅读须知 技术文章仅供参考&#xff0c;此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成…

防爆对讲终端是什么?在哪些行业中应用广泛?

防爆对讲终端是一种特殊设计的通信设备&#xff0c;它具备防爆性能和可靠的通信功能&#xff0c;确保在存在爆炸性气体或粉尘的危险环境中使用时不会引发爆炸或火灾等危险情况。这种设备通过特殊的设计和防护措施&#xff0c;如采用防爆材料、防静电、绝缘、阻燃材料等&#xf…

ABAQUS软件天津正版代理商亿达四方:创新技术,驱动产业升级

在环渤海经济圈的核心地带——天津&#xff0c;随着智能制造与高新技术产业的蓬勃发展&#xff0c;对高端仿真软件的需求日益增长。亿达四方&#xff0c;作为ABAQUS在天津的官方正版代理商&#xff0c;凭借其深厚的行业经验和卓越的服务体系&#xff0c;正为这片热土上的科研机…

2024年度潍坊市职业技能大赛——网络搭建(网络与信息安全管理员)职业技能竞赛样题

2024年度潍坊市职业技能大赛 ——网络搭建&#xff08;网络与信息安全管理员&#xff09;职业技能竞赛样题 网络搭建职业技能竞赛组委会 2024年6月 一、项目简介 &#xff08;一&#xff09;竞赛须知 1.技能操作比赛时间150分钟&#xff0c;你需要合理分配时间。 2.如果没…

Hive常用的内置函数

文章目录 聚合类1.指定列值的数目2.指定列值求和3.最大值4.最小值5.平均值6.中位数函数7.分位数函数 数值类1.取整函数Round(a)2.指定精度取整ROUND(double a,int b)3.向上取整FLOOR()4.向下取整CEIL()5.随机数 rand()6.绝对值函数 日期类获取当前日期获取当前时间戳日期前后日…

基于Java的外卖点餐系统设计与实现

作者介绍&#xff1a;计算机专业研究生&#xff0c;现企业打工人&#xff0c;从事Java全栈开发 主要内容&#xff1a;技术学习笔记、Java实战项目、项目问题解决记录、AI、简历模板、简历指导、技术交流、论文交流&#xff08;SCI论文两篇&#xff09; 上点关注下点赞 生活越过…

java+mysql教师管理系统

完整源码地址 教师信息管理系统使用命令行交互的方式及数据库连接实现教师信息管理系统&#xff0c;该系统旨在实现教师信息的管理&#xff0c;并根据需要进行教师信息展示。该软件的功能有如下功能 (1)基本信息管理(教师号、姓名、性别、出生年月、职称、学历、学位、教师类型…

25西安电子科技大学研究生政策(最新)

25西安电子科技大学研究生政策&#xff08;最新&#xff09; 01全国研究生报名情况 全国研究生报名人数438万&#xff0c;首次下降超36万人。 02西电研究生全日制/非全日制报名情况 西电硕士研究生报考录取情况&#xff08;包含全日制、非全日制&#xff09;&#xff0c;2024年…

python-数据容器对比总结

基于各类数据容器的特点&#xff0c;它们的应用场景如下&#xff1a; 数据容器的通用操作 - 遍历 数据容器的通用统计功能 容器的通用转换功能 容器通用排序功能 容器通用功能总览

一文彻底搞懂Transformer - Input(输入)

一、输入嵌入&#xff08;Input Embedding&#xff09; 词嵌入&#xff08;Word Embedding&#xff09;&#xff1a;词嵌入是最基本的嵌入形式&#xff0c;它将词汇表中的每个单词映射到一个固定大小的向量上。这个向量通常是通过训练得到的&#xff0c;能够捕捉单词之间的语义…

HTTP入门

入门HTTP协议 1. 原理介绍 爬虫就是用程序模拟浏览器的行为&#xff0c;发送请求给服务器&#xff0c;获取网页的内容&#xff0c;解析网页数据。 要学会爬虫&#xff0c;先要了解浏览器是如何和服务器交流的。浏览器通过HTTP协议和服务器交流。 2. HTTP协议简介 2.1…

The Forest Enemy Pack(2D动画角色游戏模型)

这个包包含14个适用于platformer和2d rpg游戏的动画角色。 动画总帧数:1785 用于动画的所有精灵都具有透明背景,并准备有1500x1200和750x600两种尺寸。 对于每个角色,你也可以找到具有单独身体部位的精灵表,这样你就可以轻松地制作自己的动画。它们有PNG和PSD格式。 示例场…

强化学习-5 策略梯度、Actor-Critic 算法

文章目录 1 基于价值&#xff08; value-based \text{value-based} value-based &#xff09;算法的缺点2 策略梯度算法2.1 解释2.1.1 分母和分子相消2.1.2 对数函数的导数2.1.3 组合公式2.1.4 总结 3 REINFORCE算法4 策略梯度推导进阶4.1 平稳分布4.2 基于平稳分布的策略梯度…

HSP_13章 Python_魔术方法

文章目录 P132 魔术方法1. 魔术方法的基本介绍2. 常见的魔术方法2.1 __str__2.2 __eq__2.3 其它的几个魔术方法 P132 魔术方法 参考文档 1. 魔术方法的基本介绍 2. 常见的魔术方法 2.1 str # 请输出Monster[name&#xff0c;job&#xff0c;sal]对象的属性信息 #可以根据需要…