从零开始学习 Java:简单易懂的入门指南之Objects、BigInteger、BigDecimal(十四)

常用API,Objects、BigInteger、BigDecimal

  • 5 Objects类
    • 5.1 概述
    • 5.2 常见方法
  • 6 BigInteger类
    • 6.1 引入
    • 6.2 概述
    • 6.3 常见方法
    • 6.4 底层存储方式:
  • 7 BigDecimal类
    • 7.1 引入
    • 7.2 概述
    • 7.3 常见方法
    • 7.4 底层存储方式:

5 Objects类

5.1 概述

tips:了解内容

查看API文档,我们可以看到API文档中关于Objects类的定义如下:

在这里插入图片描述

Objects类所在包是在java.util包下,因此在使用的时候需要进行导包。并且Objects类是被final修饰的,因此该类不能被继承。

Objects类提供了一些对象常见操作的方法。比如判断对象是否相等,判断对象是否为null等等。

接下来我们来查看一下API文档,看一下Objects类中的成员,如下所示:
在这里插入图片描述

我们可以发现Objects类中无无参构造方法,因此我们不能使用new关键字去创建Objects的对象。同时我们可以发现Objects类中所提供的方法都是静态的。因此我们可以通过类名直接去调用这些方法。

5.2 常见方法

tips:重点讲解内容

常见方法介绍

我们要重点学习的Objects类中的常见方法如下所示:

public static String toString(Object o) 					// 获取对象的字符串表现形式
public static boolean equals(Object a, Object b)			// 比较两个对象是否相等
public static boolean isNull(Object obj)					// 判断对象是否为null
public static boolean nonNull(Object obj)					// 判断对象是否不为null

我们要了解的Objects类中的常见方法如下所示:

public static <T> T requireNonNull(T obj)					// 检查对象是否不为null,如果为null直接抛出异常;如果不是null返回该对象;
public static <T> T requireNonNullElse(T obj, T defaultObj) // 检查对象是否不为null,如果不为null,返回该对象;如果为null返回defaultObj值
public static <T> T requireNonNullElseGet(T obj, Supplier<? extends T> supplier)	// 检查对象是否不为null,如果不为null,返回该对象;如果															 // 为null,返回由Supplier所提供的值

上述方法中的T可以理解为是Object类型。

案例演示

接下来我们就来通过一些案例演示一下Objects类中的这些方法特点。

案例1:演示重点学习方法

实现步骤:

  1. 创建一个学生类,提供两个成员变量(name , age);并且提供对应的无参构造方法和有参构造方法以及get/set方法,并且重写toString方法和equals方法
  2. 创建一个测试类(ObjectsDemo01), 在该类中编写测试代码

如下所示:

Student类

public class Student {private String name ;       // 姓名private String age ;        // 年龄// 其他代码略...}

ObjectsDemo01测试类

public class ObjectsDemo01 {public static void main(String[] args) {// 调用方法method_04() ;}// 测试nonNull方法public static void method_04() {// 创建一个学生对象Student s1 = new Student("it" , "14") ;// 调用Objects类中的nonNull方法boolean result = Objects.nonNull(s1);// 输出结果System.out.println(result);}// 测试isNull方法public static void method_03() {// 创建一个学生对象Student s1 = new Student("it" , "14") ;// 调用Objects类中的isNull方法boolean result = Objects.isNull(s1);// 输出结果System.out.println(result);}// 测试equals方法public static void method_02() {// 创建两个学生对象Student s1 = new Student("it" , "14") ;Student s2 = new Student("it" , "14") ;// 调用Objects类中的equals方法,比较两个对象是否相等boolean result = Objects.equals(s1, s2);     // 如果Student没有重写Object类中的equals方法,此处比较的还是对象的地址值// 输出结果System.out.println(result);}// 测试toString方法public static void method_01() {// 创建一个学生对象Student s1 = new Student("it" , "14") ;// 调用Objects中的toString方法,获取s1对象的字符串表现形式String result = Objects.toString(s1);       // 如果Student没有重写Object类中的toString方法,此处还是返回的对象的地址值// 输出结果System.out.println(result);}}

案例2:演示需要了解的方法

public class ObjectsDemo02 {public static void main(String[] args) {// 调用方法method_03();}// 演示requireNonNullElseGetpublic static void method_03() {// 创建一个学生对象Student s1 = new Student("it" , "14") ;// 调用Objects对象的requireNonNullElseGet方法,该方法的第二个参数是Supplier类型的,查看源码我们发现Supplier是一个函数式接口,// 那么我们就可以为其传递一个Lambda表达式,而在Supplier接口中所定义的方法是无参有返回值的方法,因此具体调用所传入的Lambda表达式如下所示Student student = Objects.requireNonNullElseGet(s1, () -> {return new Student("itcast", "14");});// 输出System.out.println(student);}// 演示requireNonNullElsepublic static void method_02() {// 创建一个学生对象Student s1 = new Student("itheima" , "14") ;// 调用Objects对象的requireNonNullElse方法Student student = Objects.requireNonNullElse(s1, new Student("itcast", "14"));// 输出System.out.println(student);}// 演示requireNonNullpublic static void method_01() {// 创建一个学生对象Student s1 = new Student("itheima" , "14") ;// 调用Objects对象的requireNonNull方法Student student = Objects.requireNonNull(s1);// 输出System.out.println(student);}}

6 BigInteger类

6.1 引入

​ 平时在存储整数的时候,Java中默认是int类型,int类型有取值范围:-2147483648 ~ 2147483647。如果数字过大,我们可以使用long类型,但是如果long类型也表示不下怎么办呢?

​ 就需要用到BigInteger,可以理解为:大的整数。

​ 有多大呢?理论上最大到42亿的21亿次方

​ 基本上在内存撑爆之前,都无法达到这个上限。

6.2 概述

查看API文档,我们可以看到API文档中关于BigInteger类的定义如下:

在这里插入图片描述

BigInteger所在包是在java.math包下,因此在使用的时候就需要进行导包。我们可以使用BigInteger类进行大整数的计算

6.3 常见方法

构造方法

public BigInteger(int num, Random rnd) 		//获取随机大整数,范围:[0 ~ 2的num次方-1]
public BigInteger(String val) 				//获取指定的大整数
public BigInteger(String val, int radix) 	//获取指定进制的大整数下面这个不是构造,而是一个静态方法获取BigInteger对象
public static BigInteger valueOf(long val) 	//静态方法获取BigInteger的对象,内部有优化

构造方法小结:

  • 如果BigInteger表示的数字没有超出long的范围,可以用静态方法获取。
  • 如果BigInteger表示的超出long的范围,可以用构造方法获取。
  • 对象一旦创建,BigInteger内部记录的值不能发生改变。
  • 只要进行计算都会产生一个新的BigInteger对象

常见成员方法

BigInteger类中使用最多的还是提供的进行四则运算的方法,如下:

public BigInteger add(BigInteger val)					//加法
public BigInteger subtract(BigInteger val)				//减法
public BigInteger multiply(BigInteger val)				//乘法
public BigInteger divide(BigInteger val)				//除法
public BigInteger[] divideAndRemainder(BigInteger val)	 //除法,获取商和余数
public  boolean equals(Object x) 					    //比较是否相同
public  BigInteger pow(int exponent) 					//次幂、次方
public  BigInteger max/min(BigInteger val) 				//返回较大值/较小值
public  int intValue(BigInteger val) 					//转为int类型整数,超出范围数据有误

代码实现:

package com.itheima.a06bigintegerdemo;import java.math.BigInteger;public class BigIntegerDemo1 {public static void main(String[] args) {/*public BigInteger(int num, Random rnd) 获取随机大整数,范围:[0~ 2的num次方-11public BigInteger(String val) 获取指定的大整数public BigInteger(String val, int radix) 获取指定进制的大整数public static BigInteger valueOf(long val) 静态方法获取BigInteger的对象,内部有优化细节:对象一旦创建里面的数据不能发生改变。*///1.获取一个随机的大整数/* Random r=new Random();for (int i = e; i < 100; i++) {BigInteger bd1 = new BigInteger(4,r);System.out.println(bd1);//[@ ~ 15]}}*///2.获取一个指定的大整数,可以超出long的取值范围//细节:字符串中必须是整数,否则会报错/* BigInteger bd2 = new BigInteger("1.1");System.out.println(bd2);*//*BigInteger bd3 = new BigInteger("abc");System.out.println(bd3);*///3.获取指定进制的大整数//细节://1.字符串中的数字必须是整数//2.字符串中的数字必须要跟进制吻合。//比如二进制中,那么只能写日和1,写其他的就报错。BigInteger bd4 = new BigInteger("123", 2);System.out.println(bd4);//4.静态方法获取BigInteger的对象,内部有优化//细节://1.能表示范围比较小,只能在long的取值范围之内,如果超出long的范围就不行了。//2.在内部对常用的数字: -16 ~ 16 进行了优化。//  提前把-16~16 先创建好BigInteger的对象,如果多次获取不会重新创建新的。BigInteger bd5 = BigInteger.valueOf(16);BigInteger bd6 = BigInteger.valueOf(16);System.out.println(bd5 == bd6);//trueBigInteger bd7 = BigInteger.valueOf(17);BigInteger bd8 = BigInteger.valueOf(17);System.out.println(bd7 == bd8);//false//5.对象一旦创建内部的数据不能发生改变BigInteger bd9 =BigInteger.valueOf(1);BigInteger bd10 =BigInteger.valueOf(2);//此时,不会修改参与计算的BigInteger对象中的借,而是产生了一个新的BigInteger对象记录BigInteger result=bd9.add(bd10);System.out.println(result);//3}
}
package com.itheima.a06bigintegerdemo;import java.math.BigInteger;public class BigIntegerDemo2 {public static void main(String[] args) {/*public BigInteger add(BigInteger val) 加法public BigInteger subtract(BigInteger val) 减法public BigInteger multiply(BigInteger val) 乘法public BigInteger divide(BigInteger val) 除法,获取商public BigInteger[] divideAndRemainder(BigInteger val) 除法,获取商和余数public boolean equals(Object x) 比较是否相同public BigInteger pow(int exponent) 次幂public BigInteger max/min(BigInteger val) 返回较大值/较小值public int intValue(BigInteger val) 转为int类型整数,超出范围数据有误*///1.创建两个BigInteger对象BigInteger bd1 = BigInteger.valueOf(10);BigInteger bd2 = BigInteger.valueOf(5);//2.加法BigInteger bd3 = bd1.add(bd2);System.out.println(bd3);//3.除法,获取商和余数BigInteger[] arr = bd1.divideAndRemainder(bd2);System.out.println(arr[0]);System.out.println(arr[1]);//4.比较是否相同boolean result = bd1.equals(bd2);System.out.println(result);//5.次幂BigInteger bd4 = bd1.pow(2);System.out.println(bd4);//6.maxBigInteger bd5 = bd1.max(bd2);//7.转为int类型整数,超出范围数据有误/* BigInteger bd6 = BigInteger.valueOf(2147483647L);int i = bd6.intValue();System.out.println(i);*/BigInteger bd6 = BigInteger.valueOf(200);double v = bd6.doubleValue();System.out.println(v);//200.0}
}

6.4 底层存储方式:

对于计算机而言,其实是没有数据类型的概念的,都是0101010101,数据类型是编程语言自己规定的,所以在实际存储的时候,先把具体的数字变成二进制,每32个bit为一组,存储在数组中。

数组中最多能存储元素个数:21亿多

数组中每一位能表示的数字:42亿多

理论上,BigInteger能表示的最大数字为:42亿的21亿次方。

但是还没到这个数字,电脑的内存就会撑爆,所以一般认为BigInteger是无限的。

存储方式如图所示:

在这里插入图片描述

7 BigDecimal类

7.1 引入

首先我们来分析一下如下程序的执行结果:

public class BigDecimalDemo01 {public static void main(String[] args) {System.out.println(0.09 + 0.01);}}

这段代码比较简单,就是计算0.09和0.01之和,并且将其结果在控制台进行输出。那么按照我们的想法在控制台输出的结果应该为0.1。那么实际的运行结果是什么呢?我们来运行一下程序,控制台的输出

结果如下所示:

0.09999999999999999

这样的结果其实就是一个丢失精度的结果。为什么会产生精度丢失呢?

在使用float或者double类型的数据在进行数学运算的时候,很有可能会产生精度丢失问题。我们都知道计算机底层在进行运算的时候,使用的都是二进制数据; 当我们在程序中写了一个十进制数据 ,在

进行运算的时候,计算机会将这个十进制数据转换成二进制数据,然后再进行运算,计算完毕以后计算机会把运算的结果再转换成十进制数据给我们展示; 如果我们使用的是整数类型的数据进行计算,那

么在把十进制数据转换成二进制数据的时候不会存在精度问题; 如果我们的数据是一个浮点类型的数据,有的时候计算机并不会将这个数据完全转换成一个二进制数据,而是将这个将其转换成一个无限的

趋近于这个十进数的二进制数据; 这样使用一个不太准确的数据进行运算的时候, 最终就会造成精度丢失;为了提高精度,Java就给我们提供了BigDecimal供我们进行数据运算。

7.2 概述

查看API文档,我们可以看到API文档中关于BigDecimal类的定义如下:

在这里插入图片描述

BigDecimal所在包是在java.math包下,因此在使用的时候就需要进行导包。我们可以使用BigDecimal类进行更加精准的数据计算。

7.3 常见方法

构造方法

要用BigDecimal类,那么就需要首先学习一下如何去创建BigDecimal的对象。通过查看API文档,我们可以发现Jdk中针对BigDecimal类提供了很多的构造方法,但是最常用的构造方法是:

在这里插入图片描述

了解完常见的构造方法以后,我们接下来就重点介绍一下常见的成员方法。

常见成员方法

BigDecimal类中使用最多的还是提供的进行四则运算的方法,如下:

public BigDecimal add(BigDecimal value)				// 加法运算
public BigDecimal subtract(BigDecimal value)		// 减法运算
public BigDecimal multiply(BigDecimal value)		// 乘法运算
public BigDecimal divide(BigDecimal value)			// 触发运算

接下来我们就来通过一些案例演示一下这些成员方法的使用。

案例1:演示基本的四则运算

代码如下所示:

public class BigDecimalDemo01 {public static void main(String[] args) {// 创建两个BigDecimal对象BigDecimal b1 = new BigDecimal("0.3") ;BigDecimal b2 = new BigDecimal("4") ;// 调用方法进行b1和b2的四则运算,并将其运算结果在控制台进行输出System.out.println(b1.add(b2));         // 进行加法运算System.out.println(b1.subtract(b2));    // 进行减法运算System.out.println(b1.multiply(b2));    // 进行乘法运算System.out.println(b1.divide(b2));      // 进行除法运算}}

运行程序进行测试,控制台输出结果如下:

4.3
-3.7
1.2
0.075

此时我们可以看到使用BigDecimal类来完成浮点数的计算不会存在损失精度的问题。

案例2:演示除法的特殊情况

如果使用BigDecimal类型的数据进行除法运算的时候,得到的结果是一个无限循环小数,那么就会报错:ArithmeticException。 如下代码所示:

public class BigDecimalDemo02 {public static void main(String[] args) {// 创建两个BigDecimal对象BigDecimal b1 = new BigDecimal("1") ;BigDecimal b2 = new BigDecimal("3") ;// 调用方法进行b1和b2的除法运算,并且将计算结果在控制台进行输出System.out.println(b1.divide(b2));}}

运行程序进行测试,控制台输出结果如下所示:

Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.at java.base/java.math.BigDecimal.divide(BigDecimal.java:1716)at com.itheima.api.bigdecimal.demo02.BigDecimalDemo02.main(BigDecimalDemo02.java:14)

针对这个问题怎么解决,此时我们就需要使用到BigDecimal类中另外一个divide方法,如下所示:

BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)

上述divide方法参数说明:

divisor:			除数对应的BigDecimal对象;
scale:				精确的位数;
roundingMode:		取舍模式;
取舍模式被封装到了RoundingMode这个枚举类中(关于枚举我们后期再做重点讲解),在这个枚举类中定义了很多种取舍方式。最常见的取舍方式有如下几个:
UP(直接进1) , FLOOR(直接删除) , HALF_UP(4舍五入),我们可以通过如下格式直接访问这些取舍模式:枚举类名.变量名

接下来我们就来演示一下这些取舍模式,代码如下所示:

public class BigDecimalDemo02 {public static void main(String[] args) {// 调用方法method_03() ;}// 演示取舍模式HALF_UPpublic static void method_03() {// 创建两个BigDecimal对象BigDecimal b1 = new BigDecimal("0.3") ;BigDecimal b2 = new BigDecimal("4") ;// 调用方法进行b1和b2的除法运算,并且将计算结果在控制台进行输出System.out.println(b1.divide(b2 , 2 , RoundingMode.HALF_UP));}// 演示取舍模式FLOORpublic static void method_02() {// 创建两个BigDecimal对象BigDecimal b1 = new BigDecimal("1") ;BigDecimal b2 = new BigDecimal("3") ;// 调用方法进行b1和b2的除法运算,并且将计算结果在控制台进行输出System.out.println(b1.divide(b2 , 2 , RoundingMode.FLOOR));}// 演示取舍模式UPpublic static void method_01() {// 创建两个BigDecimal对象BigDecimal b1 = new BigDecimal("1") ;BigDecimal b2 = new BigDecimal("3") ;// 调用方法进行b1和b2的除法运算,并且将计算结果在控制台进行输出System.out.println(b1.divide(b2 , 2 , RoundingMode.UP));}}

小结:后期在进行两个数的除法运算的时候,我们常常使用的是可以设置取舍模式的divide方法。

7.4 底层存储方式:

把数据看成字符串,遍历得到里面的每一个字符,把这些字符在ASCII码表上的值,都存储到数组中。

在这里插入图片描述

后记
👉👉💕💕美好的一天,到此结束,下次继续努力!欲知后续,请看下回分解,写作不易,感谢大家的支持!! 🌹🌹🌹

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

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

相关文章

Tesla Model S 3对比分析拆解图

文章来源&#xff1a;网络 需要特斯拉电驱样件的请&#xff1a;shbinzer &#xff08;拆车邦&#xff09; 5 款电机&#xff0c;其中扁线永磁同步电机最大功率从 202kW 提升至 220kW&#xff0c;最大扭矩从 404Nm提升至 440Nm。 Model S/X→Model 3/Y&#xff1a;双电机版本…

使用SpringBoot + Thymeleaf 完成简单的用户登录

&#x1f600;前言 本篇博文是关于Thymeleaf 的综合案例&#xff0c; 使用SpringBoot Thymeleaf 完成简单的用户登录-列表功能&#xff0c;希望你能够喜欢&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨…

PyTorch训练深度卷积生成对抗网络DCGAN

文章目录 DCGAN介绍代码结果参考 DCGAN介绍 将CNN和GAN结合起来&#xff0c;把监督学习和无监督学习结合起来。具体解释可以参见 深度卷积对抗生成网络(DCGAN) DCGAN的生成器结构&#xff1a; 图片来源&#xff1a;https://arxiv.org/abs/1511.06434 代码 model.py impor…

win系统部署Apollo-quick-start-2.1.0

win系统部署Apollo-quick-start-2.1.0 携程Apollo配置中心&#xff0c;官方部署包里提供了2个sql文件&#xff0c;需要刷入数据库。之后修改demo.sh里的数据库配置,最后使用git bash启动demo.sh刷sql脚本 官方部署包里提供了2个sql文件 修改demo.sh文件 使用git bash启动demo…

WinCC V7.5 中的C脚本对话框不可见,将编辑窗口移动到可见区域的具体方法

WinCC V7.5 中的C脚本对话框不可见&#xff0c;将编辑窗口移动到可见区域的具体方法 由于 Windows 系统更新或使用不同的显示器&#xff0c;在配置C动作时&#xff0c;有可能会出现C脚本编辑窗口被移动到不可见区域的现象。 由于该窗口无法被关闭&#xff0c;故无法进行进一步…

安防监控视频云存储EasyCVR平台H.265转码功能更新:新增分辨率配置

安防视频集中存储EasyCVR视频监控综合管理平台可以根据不同的场景需求&#xff0c;让平台在内网、专网、VPN、广域网、互联网等各种环境下进行音视频的采集、接入与多端分发。在视频能力上&#xff0c;视频云存储平台EasyCVR可实现视频实时直播、云端录像、视频云存储、视频存储…

微服务中间件-分布式缓存Redis

分布式缓存 a.Redis持久化1) RDB持久化1.a) RDB持久化-原理 2) AOF持久化3) 两者对比 b.Redis主从1) 搭建主从架构2) 数据同步原理&#xff08;全量同步&#xff09;3) 数据同步原理&#xff08;增量同步&#xff09; c.Redis哨兵1) 哨兵的作用2) 搭建Redis哨兵集群3) RedisTem…

小程序的数据绑定和事件绑定

小程序的数据绑定 1.需要渲染的数据放在index.js中的data里 Page({data: {info:HELLO WORLD,imgSrc:/images/1.jpg,randomNum:Math.random()*10,randomNum1:Math.random().toFixed(2)}, }) 2.在WXML中通过{{}}获取数据 <view>{{info}}</view><image src"{{…

设计模式之责任链模式

简介 责任链模式是一种行为设计模式&#xff0c; 允许你将请求沿着处理者链&#xff08;单向链表&#xff09;进行发送。 收到请求后&#xff0c; 每个处理者根据自身条件对请求进行处理&#xff0c; &#xff0c;如果处理不了则将其传递给链上的下个处理者&#xff0c;以此类…

【LVS】3、LVS+Keepalived群集

为什么用它&#xff0c;为了做高可用 服务功能 1.故障自动切换 2.健康检查 3.节点服务器高可用-HA Keepalived的三个模块&#xff1a; core&#xff1a;Keepalived的核心&#xff0c;负责主进程的启动、维护&#xff1b;调用全局配置文件进行加载和解析 vrrp&#xff1a;实…

5个高清视频素材网站

推荐5个高清视频素材网站&#xff0c;免费、付费、商用的都有&#xff0c;可根据自己需求去选择&#xff0c;赶紧收藏吧&#xff01; 菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky ​ 菜鸟图库网素材非常丰富&#xff0c;网站主要还是以设计类素材为主&#xff…

Spring-Bean的生命周期

目录 生命周期汇总 细分生命周期 1.实例化 2.属性赋值&#xff08;依赖注入&#xff09; 3.Aware接口 4.BeanPostProcessor接口 5.初始化 6.销毁 测试验证 类结构 业务类 测试类 生命周期汇总 Spring Bean 的生命周期见下图 &#xff08;一定记忆好下图&#x…

二进制数的左移和右移位运算numpy.left_shift()numpy.right_shift()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 二进制数的左移和右移位运算 numpy.left_shift() numpy.right_shift() [太阳]选择题 下列代码最后一次输出的结果是&#xff1f; import numpy as np a 8 print("【显示】a ", a)…

【编织时空四:探究顺序表与链表的数据之旅】

本章重点 链表的分类 带头双向循环链表接口实现 顺序表和链表的区别 缓存利用率参考存储体系结构 以及 局部原理性。 一、链表的分类 实际中链表的结构非常多样&#xff0c;以下情况组合起来就有8种链表结构&#xff1a; 1. 单向或者双向 2. 带头或者不带头 3. 循环或者非…

CANoe软件Tools中无法找到LDF Explorer

关联文章&#xff1a; LDF概述和LDF Explorer工具介绍 问题描述 使用CANoe软件的菜单栏Tools中无法找到LDF Explorer 原因分析/解决方案&#xff1a; ①查看CANoe硬件是否带LIN license&#xff0c;并且license在正常激活时间内。 ②查看CANoe是否配置了LIN通道&#xff0c;…

【链表】经典链表题LeetCode

文章目录 160. 相交链表 简单&#x1f525;206. 反转链表 简单&#x1f525;876. 链表的中间结点 简单234. 回文链表 简单&#x1f525;141. 环形链表 简单&#x1f525;142. 环形链表 II 中等&#x1f525;21. 合并两个有序链表 简单&#x1f525;2. 两数相加 中等&#x1f52…

【Unity】ShaderGraph应用(模型膨胀流动)

【Unity】ShaderGraph应用&#xff08;模型膨胀流动&#xff09; 实现效果 ShaderGraph是 unity的图形化 Shader 编程工具。本文介绍使用ShaderGraph实现模型的膨胀流动效果。该效果可以由于模拟流体在管线中的流动等相关功能。 一、实现的方法 1.使用节点介绍 关键节点 UV…

【Redis实践篇】使用Redisson 优雅实现项目实践过程中的5种场景

文章目录 1.前言2.使用方式1. 添加Redisson依赖&#xff1a;2. 配置Redis连接信息3. 使用场景3.1. 分布式锁3.2. 限流器&#xff08;Rate Limiter&#xff09;3.3. 可过期的对象&#xff08;Expirable Object&#xff09;3.4. 信号量&#xff08;Semaphore&#xff09;3.5. 分布…

首起针对国内金融企业的开源组件投毒攻击事件

简述 2023年8月9日&#xff0c;墨菲监控到用户名为 snugglejack_org (邮件地址&#xff1a;SnuggleBearrxxhotmail.com&#xff09;的用户发布到 NPM 仓库中的 ws-paso-jssdk 组件包具有发向 https://ql.rustdesk[.]net 的可疑流量&#xff0c;经过确认该组件包携带远控脚本&a…

PHP 从 URL(链接) 字符串中获取参数

PHP 从 URL&#xff08;链接&#xff09; 字符串中获取参数 //URL(链接)字符串 $url https://www.baidu.com/?name小洪帽i&sex男&age999; //parse_url 函数从一个 URL 字符串中获取参数 $urlparse_url($url); //输出获取到的内容 echo "<pre>"; pri…