一个月学会Java 第4天 运算符和数据转换
Day4 运算符和数据转换
今天来讲运算符,每个运算符的作用和现象,首先我们先复习一下数据类型,
day2讲过基本数据类型有八种,int、short、long、byte、char、boolean、float、double,分别为四个整型、一个字符型、一个布尔值、两个浮点型
第一章 数据类型转换
为了对数据类型更加的熟悉,我们再用一种列表的方式呈现
- 数据类型
- 整形
- byte、short、int、long
- 浮点
- float、double
- 布尔
- boolean
- 字符
- char
- 整形
数据类型转换正常情况只能同类型转换,多个数据类型互转也是可以的。
首先我们来说一下整形的这四个,分别是byte(1字节),short(2字节),int(4字节),long(8字节),我们直接写的数字例如 int i = 123
的这个123就是int类型,如果在不超范围的情况下我们是可以把这个赋值给更小的数据类型的,然后想要写long类型是稍微需要一点特殊手段比如在末尾加个 l或者L
,
比如 long l = 123456L
和 long l = 123456l
在我们给更小一点的数据类型,比如short和byte只要我们不超上限就可以使用int类型的数据直接赋值,但是如果超了的话就需要强制类型转换
public class Hello {public static void main(String[] args) {//很正常的声明和赋值int i = 456;//报错byte b = 456;}
}
明显可以看到直接就是一个报错,正确的写法是这样
public class Hello {public static void main(String[] args) {//这个就是强制类型转换,通过括号扩住里面写要转换的类型byte b = (byte) 456;//因为byte只有一个字节所以他的范围是-128~127,超了范围就不行//但是如果没有超出范围的话就是可以的byte b1 = 123;//对应的还有short//这里就会报错,但是我注释掉了,你们可以解除注释//short占2个字节也就是-32768~32767//short s = 45645;//所以需要这样short s1 = (short) 45645;System.out.println("b: " + b);System.out.println("b1: " + b1);System.out.println("s1: " + s1);}
}
出现了负数,但是你们先不要惊讶和失措,因为这个是正常现象,我们来分析一下,比如这个b一开始是不是456,但是我们进行了强制类型转换,从int的456变成了byte的456,因为byte是-128~
127所以是256个数,我们的456是溢出的所以就是456-256=200,但是200对于byte的正数上限127还是溢出的,所以200-256=-56
下面的s1也是同理,因为short的范围是-32768~32767,所以我们的也是用同样的做法,减去他的最大个数,45645-65535=-19891
其实还有一个数据类型我们还没有进行展示,那就是long类型,long类型比较特殊,因为他是八字节,所以最大值是9,223,372,036,854,775,807,所以他完全能包含int类型的四个字节,最大值是2,147,483,647,当我们直接写数字的时候,例如 456123
其实写的就是int类型,但是我们写超过int类型的最大值也就是(2^31)-1,那就是会出问题,我们来做个测试
public class Hello {public static void main(String[] args) {//正好就比最大值多了一个数int i = 2147483648;}
}
也是有问题的,所以这个时候我们就需要使用long类型去接收了,急着测试的小伙伴们先别急,你这下long替换掉int还是会出问题的,因为我们写的正常数就是int类型,本来就是超数据的
所以我们需要的操作就是把我们直接写的这个数变成了long类型的数,这个操作其实不难,很简单,只需要将数字的末尾上面加上一个 l
或者是 L
就行,我们之前在上面其实也讲过了,不知道还有多少小伙伴是记得住的,我们在写数字的时候直接加上这么一个L就可以解决直接写的数是int然后导致大于int最大值就无法赋值的的这个问题,不过自然我们还是可以原地tp的,看代码:
public class Hello {public static void main(String[] args) {//我们现在使用L进行赋值long i = 2147483648L;//自然我们使用int的时候也是需要使用强转的,因为直接写的是longint i2 = (int) 2147483648l;System.out.println("i: " + i);System.out.println("i2: " + i2);}
}
自然这个出现了-2147483648也是和之前一样的算法就能算出来,大家伙可以自己试一下不加这个强转会不会报错,答案是肯定会报错的
通过整型讲完的最复杂的转换方式,其他的大家伙应该可以很好理解了,现在我们要说的是浮点型的转换,我们还没有使用过浮点型,但是没有关系,接下来会使用大把大把的浮点型来写程序
首先先提一嘴,就是我们直接写的浮点类型就是double是八个字节的,也叫双精度浮点型,因为double的这个双,我们想要把他变成了float需要加一点东西,然后还有一个就是整型到浮点型的转换
public class Hello {public static void main(String[] args) {//注意看,我这里写的是123所以其实就是int类型//但是int类型是四个字节的,然后double是8个字节//所以可以轻松接收,即使我现在用float也是一样double d = 123;//也是没有任何的关系的,因为float本身也就是四个字节的//虽然其实你用long类型用float也可以接收,一般我的评价就是//浮点的事你少管,管好整型就好float f = 456;//现在要来说说什么情况才是double类型,就是这样//但凡你加上一个.x无论是什么数,都是可以变成浮点型的doubledouble d2 = 456.0;//但是我接下来写的这个就会导致报错,我希望你们能比较熟练的使用注释给他注释掉float f2 = 123.0;}
}
看看,兄弟们是不是报错了,因为这个其实就和你把int赋值给short和byte是一样的,把long赋值给int一样,自然是说大于他们最大值的时候的情况,然后这个为什么就加个.0就会出问题的
其实啊,即使就只是加上个.0也是说明是双精度的浮点,单精度还是容纳不下双精度的大小的,所以就会出问题,那么有些小伙伴就会有疑问了那我使用 (float) 123.0
然后再赋值是不是就可以了
我只能说,嘿小伙子你还真是个天才哈,是可以的,但是我们一般使用的解决方案并不是这个,虽然这个也可以但是我们有更简单的解决方案,就是在末尾加上一个 F
或者 f
和long一样,很明显能看出来long的那个L就是long的开头字母,这个也是就是float的开头字母
public class Hello {public static void main(String[] args) {float f = 15263.0F;System.out.println("f: " + f);}
}
是不是没有一点毛病
接下来就是一个既不是很难也不算很简单的点了,那就是char类型的转换,因为char类型是字符所以其实他写起来应该是这样的 'a'
,但是他的这个a本身又是一个数,详情可以查看ascii码因为这里还是处于ascii的范围内,现在用的unicode都是在ascii的基础上做添加的,这两个都是编码,然后他们又是有对应的数的就比如我现在要把char类型的 'a'
转换为int类型的数字也是可以的
public class Hello {public static void main(String[] args) {char c = 'a';//这里也是可以正常打印的,但是还是可以做其他的操作System.out.println(c);//比如将它转换为int类型然后再来打印,其实打印的就是数字了System.out.println((int) c);}
}
这里a显示97的原因大家可以查看这个
ascii的百度百科
,自然我也是把截图截下来了
所以大家只需要知道char类型和int类型是可以互相转换的这一点是比较重要需要记住的。
public class Hello {public static void main(String[] args) {int i = 98;System.out.println((char) i);}
}
是吧,98就可以直接换成b了,对照表上
还有一个特殊的,那就是布尔值,布尔值本来就只有true或者是false的两种选择,但是我们正常的数字和字符的强转和其他的都是变成不了为布尔的,需要用到接下来要学习的内容——运算符
还有一点我没讲的,但是是很简单的,比如我把 byte b = 123;
的b赋值给 short s = b;
这种就叫做隐式类型转换,把小的byte赋值给了大一点的short,值的类型从byte变成了short,还有 1+1.0
会是
2.0,因为int+double,然后double是八个字节,所以发生了隐式的类型转换,只有写上了 (类型)
的才是显式类型转换,也叫做强制转换
public class Hello {public static void main(String[] args) {byte b = 123;//刚刚说的把b赋值给s是将byte隐式转换为short//但是现在的操作是byte+int变成了int,但是值被锁定成了int//所以现在的就是需要把int强转变成short//我们需要把他运算完的结果进行强转,所以要加个括号,效果和数学里面是一样的short s = (short) (b + 7);//还有一个也是小+大变成大的,也是我上面说过的//这里我们直接打印,还记得吧,打印里面可以放运算式的System.out.println(1 + 1.0);//答案是2.0}
}
第二章 运算符
经过了类型转换的学习,对以后的学习和写代码都是很有帮助了,还是需要自己给自己出题然后训练,能做到这一点说明自学能力不错。
这一章我们要学习运算符,其实就是加减乘数然后再有一点新的内容
- 运算符
- 赋值运算符
- 算术运算符
- 自增、自减运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 复合赋值运算符
- 三元运算符
- 圆括号
赋值运算符
首先,我们说一下赋值运算符,其实在前面的演示也已经够多了因为就是一个等于号 =
,比如前面的 int i = 50
那这个等于号就相当于把右边的那个50赋值给了i,然后在等号的右边也可以是算式,比如 1 + 2
算术运算符
第二个,我们来说说算术运算符,其实就是加减乘数,用过电脑上的计算器的应该都会的,其实就是加减乘除 +
-
*
/
,还有一个 %
是取模,优先级和数学里面是一样的,先乘除后加减。
我来浅讲一下取模就是 余数,还记得小学学的东西吧,那个时候没有教小数的时候,比如5/2是不是就是5/2=2···1,就是余1,那就是1,这个就是取模的作用
自增、自减运算符
第三个,我们来说一下这个自增、自减,这个可是一个小难点,我先说一下写法 ++
和 --
,假如我们有这么一个数 int i = 1
,那我的使用了 ++i
和 i++
之后,最后的结果是一样的,但是我们放在式子里面去计算就不一样了,然后这个 --
的作用和 ++
是类似的,只是一个是加1,一个是减1罢了
public class Hello {public static void main(String[] args) {int i = 1;//不一样的从现在开始System.out.println("i++: " + i++);System.out.println("++i: " + ++i); //这里可能会有歧义,最好是把++i使用括号括起来/*现在我们来讲特殊的情况,第一个打印的i会是1,然后过了这个打印之后i的值就变成了2第二个打印,会打印3。不知道通过的我描述能不能看懂这两个++的作用呢我们把++放在后面的话,会做完一系列的计算啊和打印啊等等操作之后才会自加但是++在前面的时候,在做任何操作之前都会先自加,所以就导致了1和3的情况接下来我们看结果*/}
}
--
也是同理,比如我们现在有个数i的值是5,我先 --i
然后 i++
,如果打印的话,那就是 4
和 4
然后i的最终结果是 3
关系运算符
第四个,我们现在来说一下这个关系运算符,这个就和布尔值有关系了,那先来说说有什么关系运算符
- 关系运算符
- ==
- >=
- <=
- !=
- >
- <
直接读符号就能大概明白意思了,比如 ==
等于等于,连等那就是判断是否为相等,这个时候就需要说到布尔值的那两个了true和false,如果确实相等那就是true,如果不是那就是false,都是这么一个关系
>
读音就是大于,那就是判断是否为大于,正确返回true,错误返回false,比如 5 > 3
那就是true
<
读音就是小于,那就是判断是否为小于,如果正确返回true,错误返回false,同理,我就不举例了
>=
根据读音就是大于等于,就多个了等于操作
<=
小于等于,也是小于上面多了个等于的操作
!=
这个叹号代表非的意思,所以就是不等于的意思 5 != 3
那就是true, 5 != 5
那就是false
public class Hello {public static void main(String[] args) {//记住加上括号,如果没有括号的话,说明就是先拼接字符串然后拿字符串去和int类型判断了//这样自然是判断不了的System.out.println("5 >= 3: " + (5 >= 3));System.out.println("5 > 3: " + (5 > 3));System.out.println("5 <= 3: " + (5 <= 3));System.out.println("5 < 3: " + (5 < 3));System.out.println("5 != 3: " + (5 != 3));System.out.println("5 == 3: " + (5 == 3));}
}
逻辑运算符
第五个,就是逻辑运算符,逻辑运算符就只有三个,但是会导致非常多的逻辑,详情可以去看看逻辑电路😁,我们程序里面只有三个,短路与、短路或和非,为什么会有短路,是因为和正常的与或非不一样,他们的符号分别是
- 逻辑运算符
- 与
- &&
- 或
- ||
- 非
- !
- 与
我们换一种说法更能理解的,那就是与就是和,或就是或,非就是反,我们举个例子 &&
这个符号的作用就是连接两个
需要前后两遍的表达式都是true才会返回true,但凡有一个false那就是false,所以就是和
我们在看或是 ||
作用也是连接两个但是先后的关系是 或
的关系,两者表达式但凡有一个true那就是true
还有一个就是 !
其实就是取反,如果你出来的结果是true那就会变成false,如果你出来的结果是false,那就会被叹号变成true,比如 !true
那就是false
public class Hello {public static void main(String[] args) {System.out.println("true && true: " + (true && true));System.out.println("false && true: " + (false && true));System.out.println("false || true: " + (false || true));System.out.println("true || true: " + (true || true));System.out.println("!true: " + (!true));System.out.println("!false: " + (!false));}
}
位运算符
这个东西就是想当炸裂了,就是操作二进制的。我们先说明他的符号然后我们再做举例说明,然后我们再使用代码的方式给大家展示。
我们先说符号,分别是 &、|、^、~
分别的意思也是与、或、异或、非
。
然后我们举例说明,首先在举例之前还是需要学习一个东西,那就是二进制的编码,分别是三个码, 原码
, 反码
, 补码
,然后这三个码还分正数情况和负数情况,负数不一样,正数三个码都是一样的,负数在原码和正数不一样的只有符号位,然后在反码是除了符号位之外全部翻转,补码就是反码+1,然后计算机上的任何计算都是从补码进行计算的,如果你算完之后的结果的符号位还是1说明他是负数,还是需要做翻转。我知道现在看的人有点懵,但是你先别懵,看我后面的例子
源码的举例说明,我们举例5和-7这两个数,然后我们现在使用1个字节去储存这个数
我们先看5的编码
0000 0101 原码
0000 0101 反码
0000 0101 补码
看出来了吧这就是正数的三码合一,然后我们的负数又是不一样的,就是我上面说的情况,我们再来分析一下
-7的编码
1000 0111 原码,表示和正数一样,但是符号位是1,正数是0
1111 1000 反码,除了符号位之外全部翻转
1111 1001 补码,反码+1
我们还有一个工具可以来验证这个东西,就是我们的windows自带的计算器,的程序员功能,就像我说的,计算机中存储和运算都是通过补码的方式存储的,如下分别是5和-7
很好,你已经会看补码了,那我们说明完& | ^ ~
的作用后直接开始运算好吧,他们的运算都是上下对着运算,如果你让byte类型和int类型互相做位运算的话,他会补齐到int的32位也就是4字节进行运算
首先是 &
他的结果是这样的,同一出一,不同出零,这个意思就是理解为1和0乘法,1 & 1
那就是 1
,1 & 0
那就是 0
然后是 |
,
他的运算规则就是,有一出一,全零出零,可以理解为加法,但是最大值是1所以 1 | 1
= 1
, 1 | 0
= 1
, 0 | 0
= 0
第三个就是 ^
,他的运算规则是,不同出一,相同出零, 1 ^ 0
= 1
, 0 ^ 0
= 0
, 1 ^ 1
= 1
最后一个就是 ~
,他就是取反,但是他的取反和负数的反码对原码取反不一样,因为他是将符号位也取反
很好,现在你们已经会了,可以写题目了,就写一点题
5 & 15
5 & -7
6 | -8
~5
我们先来看第一题,因为都是正数,所以三码合一都可以是补码5 & 15
0000 0101
0000 1111 &
0000 0101
5
第二题 5 & -7
1000 0111 -7的原码
1111 1000 -7的反码
1111 1001 -7的补码,现在可以开始计算了
0000 0101 &
0000 0001
1
第三题 6 | -8
1000 1000 -8的原码
1111 0111 -8的反码
1111 1000 -8的补码
0000 0110 |
1111 1110 结果的补码
1111 1101 结果的反码
1000 0010 结果的原码
-2
第四题 ~5
0000 0101 ~
1111 1010 补码
1111 1001 反码
1000 0110 原码
-6
public class Hello {public static void main(String[] args) {System.out.println("5 & 15: " + (5 & 15));System.out.println("5 & -7: " + (5 & -7));System.out.println("6 | -8: " + (6 | -8));System.out.println("~5: " + (~5));}
}
相信大家都已经会用了,可以通过程序计算然后自己也计算去计算一下其他的数,然后我举的例子里面少了异或,在我写完的时候才想到,想想算了,大家伙应该已经会了,只要跟着规则来都是不会出问题的,毕竟计算机是肯定会去计算出一个准确的结果的
但是还有一件事要告诉大家,其实位运算还是没有学完,因为只是学完了最难的四个,其实还有三个分别是 <<
>>
>>>
,分别是左移、右移和无符号右移
public class Hello {public static void main(String[] args) {System.out.println(50 << 1);System.out.println(50 >> 1);System.out.println(50 >>> 1);System.out.println(-8 >> 1);System.out.println(-8 >>> 1);}
}
分别是左移(乘2,因为底层是除了符号位整体左移1位),右移(除以二,整体除符号位右移1位),无符号右移(
整体右移1位,这个就要看底层了),自然把1给改成2就是乘4或者是除以4了,这个可以自己摸索一下,原理不难
复合赋值运算符
最难的部分,位运算符已经攻克了,所以现在来学习一个简单一点的东西来放松一下吧
顾名思义,就是复合赋值,比如说,i = i + 1
,那就是把i+1了之后的结果赋值给i,这个复合起来写,可以不写i+,就是写成 i += 1
就是i = i + 1
,加减乘除,左右移,位运算这些。
三元运算符
这个比较有意思
首先先说一点,三元运算符是一个整体,然后他的结构我来介绍一下是这样 表达式1 ? 表达式2 : 表达式3
表达式1 是返回布尔值的也就是返回true或者false,表达式2是在表达式1返回true的时候才会执行,然后返回false的话就会执行表达式3。
public class Hello {public static void main(String[] args) {System.out.println(true ? 5 : 3);System.out.println(false ? 5 : 3);}
}
然后他是一个整体,也是会进行隐式类型转换的,比如 true ? 1 : 2.0
,那他的结果会是1.0
圆括号
这个玩意讲都可以不用讲了,括号括上优先级直接飙升,就这样
也很长了,差不多结束了
相关文章:

一个月学会Java 第4天 运算符和数据转换
Day4 运算符和数据转换 今天来讲运算符,每个运算符的作用和现象,首先我们先复习一下数据类型, day2讲过基本数据类型有八种,int、short、long、byte、char、boolean、float、double,分别为四个整型、一个字符型、一个布…...

Stream流的终结方法(一)
1.Stream流的终结方法 2.forEach 对于forEach方法,用来遍历stream流中的所有数据 package com.njau.d10_my_stream;import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.function.Consumer; import java.util…...

GO网络编程(二):客户端与服务端通信【重要】
本节是新知识,偏应用,需要反复练习才能掌握。 目录 1.C/S通信示意图2.服务端通信3.客户端通信4.通信测试5.进阶练习:客户端之间通信 1.C/S通信示意图 客户端与服务端通信的模式也称作C/S模式,流程图如下 其中P是协程调度器。可…...

快速熟悉Nginx
一、Nginx是什么? Nginx是一款高性能、轻量级的Web服务器和反向代理服务器。 特点:Nginx采用事件驱动的异步非阻塞处理框架,内存占用少,并发能力强,资源消耗低。功能:Nginx主要用作静态文件服…...
VikParuchuri/marker 学习简单总结
核心代码 VikParuchuri/marker 的核心是使用https://github.com/VikParuchuri/surya的 pdf 模型,注意不仅仅是ocr,在marker的代码里面有标注ocr 是option的。强制OCR 要设置:OCR_ALL_PAGES=true核心代码就是convert.py def convert_single_pdf(fname: str,model_lst: List,…...
【AI知识点】词嵌入(Word Embedding)
词嵌入(Word Embedding)是自然语言处理(NLP)中的一种技术,用于将词语或短语映射为具有固定维度的实数向量。这些向量(嵌入向量)能够捕捉词语之间的语义相似性,即将语义相近的词映射到…...

Python从入门到高手5.1节-Python简单数据类型
目录 5.1.1 理解数据类型 5.1.2 Python中的数据类型 5.1.3 Python简单数据类型 5.1.4 特殊的空类型 5.1.5 Python变量的类型 5.1.6 广州又开始变热 5.1.1 理解数据类型 数据类型是根据数据本身的性质和特征来对数据进行分类,例如奇数与偶数就是一种数据类型。…...

Hbase要点简记
Hbase要点简记 Hbase1、底层架构2、表逻辑结构 Hbase HBase是一个分布式的、列式的、实时查询的、非关系型数据库,可以处理PB级别的数据,吞吐量可以到的百万查询/每秒。主要应用于接口等实时数据应用需求,针对具体需求,设计高效率…...

RabbitMQ的各类工作模式介绍
简单模式 P: ⽣产者, 也就是要发送消息的程序 C: 消费者,消息的接收者 Queue: 消息队列, 图中⻩⾊背景部分. 类似⼀个邮箱, 可以缓存消息; ⽣产者向其中投递消息, 消费者从其中取出消息.特点: ⼀个⽣产者P,⼀个消费者C, 消息只能被消费⼀次. 也称为点对点(Point-to-…...

李宏毅深度学习-图神经网络GNN
图卷积的开源代码网站DGL 好用的还是 GAT, GIN(指出最好的卷积 就是 hi 邻居特征(而且只能用 sum)) Introduction GNN 可以理解为是由 Graph(图) Nerual Networks 组合而成的,图结构应该都在数据结构与…...

Redis篇(缓存机制 - 分布式缓存)(持续更新迭代)
目录 一、单点 Redis 的问题 1. 数据丢失问题 2. 并发能力问题 3. 故障恢复问题 4. 存储能力问题 5. 四种问题的解决方案 二、Redis持久化(两种方案) 1. RDB持久化 1.1. 简介 1.2. 执行时机 save命令 bgsave命令 停机时 触发RDB条件 1.3. …...

python交互式命令时如何清除
在交互模式中使用Python,如果要清屏,可以import os,通过os.system()来调用系统命令clear或者cls来实现清屏。 [python] view plain copy print? >>> import os >>> os.system(clear) 但是此时shell中的状态是:…...
Token,Cookie,Session,JWT详解
这四个技术虽然在功能上有所不同,但在web应用中常常一起使用,已实现用户身份验证,授权和会话管理。 Token:指的是用于身份验证,授权成信息交换的令牌,可以有不同的实现方式,例如JWT。 Cookie&…...
opencv-rust 系列: 1, 安装及运行自带示例和测试程序
opencv-rust 系列: 1, 安装及运行自带示例和测试程序 运行环境: ubuntu ; rust 已安装; 对rust的掌握为三脚猫程度一. opencv-rust安装:二. 运行自带examples和tests 运行环境: ubuntu ; rust 已安装; 对rust的掌握为三脚猫程度 一. opencv-rust安装: 安装软件: sudo apt in…...
Linux系统编程(一):Linux平台上静态库和动态库的制作与使用
本篇文章我们通过 gcc 或g编译器手动制作Linux 平台上的静态库和动态库。由于涉及的内容较多,所以后面分多次来完成本篇文章。做任何事情都是一样的,我们不可能一次性把处在舒适区的事情做好。 本讲主要内容如下: 库的基本概念Linux 平台上…...

Nginx的基础讲解之重写conf文件
一、Nginx 1、什么是nginx? Nginx(engine x)是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。 2、用于什么场景 Nginx适用于各种规模的网站和应用程序,特别是需要高并发处理和负载均衡的场…...

RIFE: Real-Time Intermediate Flow Estimation for Video Frame Interpolation
Paper name RIFE: Real-Time Intermediate Flow Estimation for Video Frame Interpolation Paper Reading Note Paper URL: https://arxiv.org/pdf/2011.06294 Code URL: https://github.com/hzwer/ECCV2022-RIFE TL;DR 2022 年旷视出品的实时视频帧插值工作。提出 RIFE…...
rabbitMq-----broker服务器
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言管理的字段 前言 搭建一个网络服务器,在内部提供各个业务接口即可。 在业务处理函数中,每次请求过来找到对应的信道,通过信…...

MAC备忘录空白解决方案
打开icloud->备忘录 取消勾选同步此MAC后再次勾选,然后点击完成即可。...
cnn突破七(四层bpnet网络公式与卷积核bpnet公式相关)
我们要有一个概念,就是卷积核就是我们的w1,w12,w2 那么我们的5*5卷积核怎么表达,当他在14*14的图像中流动时,对应的像素也在变化 这个和我们的上面w1,w12,w2不同,因为这几个都是全…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...

如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...