从0开始学大数据-java运算符

     2022-03-28     824

关键词:

我们从零开始学习大数据技术,从java基础,到Linux技术涉猎,再深入到大数据技术的Hadoop、Spark、Storm技术,最后到大数据企业平台的搭建,层层递进,由点到面!希望技术大牛能过来指导学习。


上一节了解Java基础语法,本节我们开始学习Java基础-运算符,将会围绕以下几个知识点进行展开学习:

  1. 算术运算符

  2. 赋值运算符

  3. 比较运算符

  4. 逻辑运算符

  5. 位运算符

  6. 三元运算符

PS:开始之前我们先针对上节数据类型中补充的几个小问题

 

一、数据类型中补充的几个小问题

1、byte值的问题

byte b1=127;

byte b2=(byte)128; //-128

byte b3=(byte)129//-127

byte b3=(byte)130; //-126

byte的范围:-128 ~ 127

128: 10000000

-128:10000000(这里的1即是符号位,也是数值位)


2、数据类型转化之默认转换(遵循从小到大转换)

byte,short,char ---int ---long---float---double

long:8个字节

float:4个字节

虽然是默认转换,但因为以下原因,long默认转换为float

a、它们底层的存储结构是不同的。

b、float表示的数据范围比long的范围大

  • long:      2^63-1

  • float:      3.4*10^38 > 2*10^38 >2*8^38 = 2*2^3^38 = 2*2^114 > 2^63-1

3、Java语言中的字符char可以存储一个中文汉字吗,为什么呢?

  • 可以,因为Java语言中的字符占用两个字节。

  • Java语言采用的是Unicode编码,所有的字符都是依照Unicode进行编码的


二、运算符

技术分享图片

运算符总览表


在我们数学中也会经常用到运算(加减乘除等),那在Java程序中也是经常要做一些运算操作都有哪些呢,那么先看一下以下针对运算和运算符的定义:

运算:是对常量和变量进行操作的过程成为运算

运算符:是对常量和变量进行操作的符号称为运算符

分类(6种):算术运算符,赋值运算符,比较运算符,逻辑运算符,位运算符,三目运算符

技术分享图片

那么,我们现在对各类运算符逐一的进行了解


1、算术运算符


符号:

+,-,*,/,%,++,--

注意事项:

a、整数相除只能得到整数,如果想得到小数,必须把数据变换为浮点数类型

b、/ 获取的是除法操作的商,% 获取的是除法操作的余数

下面我们先编写程序代码执行看下效果

技术分享图片



程序执行结果:



技术分享图片


(1)++,--运算符的使用


A:单独使用:

  • 放在操作数的前面和后面效果一样,(这种情况是比较常见的)

B:参与运算使用:

  • 放在操作数的前面,先自增1或者自减1,然后再参与运算。

  • 放在操作数的后面,先参与运算,再自增1或者自减1。

C:作用:就是对变量进行自增或者自减。


程序举例:

技术分享图片



放后面,程序打印出来的结果:

技术分享图片



放前面,程序打印出来的结果

技术分享图片



可见,我们前面总结的是对的。

  • 放在操作数的前面,先自增1或者自减1,然后再参与运算。

  • 放在操作数的后面,先参与运算,再自增1或者自减1。


接下来,我们进一步看一下+的用法(主要有三种):

    A:加法

    B:正号

    C:字符串的连接符

程序举例:

技术分享图片



程序执行结果:

技术分享图片



可见:

* 运算规则是从左到右做运算的,"hello"+'a'+1 ,系统会先识别到hello是一个字符串,则后面的加号就是作为字符串连接符使用,与字符a连接后,形成一个新的字符串,再拼接1。

* 同样的,在'a'+1+"hello"则是先运算'a'+1(这里的加号是作加法使用),再连接字符串hello.



2、赋值运算符


符号:

=,+=,-=,*=,/=,%=等


可以划分为以下两种:

基本的赋值运算符:=

  • 把右边的数据赋值给左边。

扩展的赋值运算符:+=,-=,*=,/=,%=

  • +=把左边和右边做加法,然后赋值给左边

  • 同理,-=,*=,/=,%=的用法参照上述说明


程序举例:

技术分享图片



程序执行结果:



技术分享图片

思考题:

接下来,来思考两个问题,

  • short s=1,s=s+1;

  • short s=1,s+=1;

判断上面两个代码有没有问题,如果有,哪里有问题?


编写程序代码验证下:

第一种:

技术分享图片

程序执行结果:

技术分享图片



注意:还记得,前面我们学的 short类型做运算的时候,默认是先转换成int类型,int类型占用4个字节数,short类型占用2个字节数,遵从从小到大的转换原则,所以本程序中s=s+1做运算会损失进度。


第二种:

技术分享图片



程序执行结果:

技术分享图片

可见,扩展的赋值运算符其实隐含了一个强制类型转换。

  • s +=1;并不等价于s = s + 1;而是等价于s = (s的数据类型)(s+1);

  • 所以通过s +=1;的执行结果是没有报错。



3、比较运算符


符号:

  • ==  表示等于

  • !=   表示不等于

  • > 表示大于号

  • >= 表示大于等于

  • < 表示小于

  • <= 表示小于等于

特点:

  • 无论你的操作是简单还是复杂的,结果都是Boolean类型的 (false和true)

注意事项:

  • "=="不能写成"=";否则会变成赋值运算。


程序举例:

技术分享图片



程序执行结果:

技术分享图片



可见,比较运算符对应的结果是Boolean类型的



4、逻辑运算符


符号:

  • &,|,^,!

基本用法:

  • & 与运算,(注意,但&两边为布尔值为逻辑与运算,当&两边为数字为位运算符)

  • | 或运算

  • ^ 异或运算

  • ! 非运算

特殊用法:

  • &&    双与运算

  • ||        双或运算

特点:

  • 逻辑运算符一般用于连接boolean类型的表达式或者值。

表达式:

  • 就是用运算符把常量或者变量连接起来的符合java语法的式子

算术表达式:a + b

比较表达式:a == b

结论:

(1)& 逻辑与:有false则false

(2)| 逻辑或:有true则true

(3)  ^ 逻辑异或:相同为false,不同为true

    ^异或举例:

    • 情侣关系: 男男,男女,女男,女女,

    • 可见: 正常的情侣关系中,异性是之间才是true的

    • 特别声明:这里绝对没有歧视同性之间的关系,纯属为了学习交流的^-^

(4)  !逻辑非:非false则true,非true则false

    • 特点:偶数个!不改变本身的运算结果


编写以下程序对上述几种逻辑运算进行验证:


程序举例:

技术分享图片

程序执行结果:

技术分享图片



可见,我们的结论是正确的,逻辑运算符的基本用法也都讲完了,下面我们看看特殊用法。


程序举例(双与&& 用法):

技术分享图片



程序执行结果:

技术分享图片

可见,&&与&的区别?||与|的区别?

  • 两种运算符的运算结果是一样的

  • &&具有短路效果,如果左边是false,则右边不执行


||与|就不再多做代码演示,可以自行尝试验证:

  • 两种运算符的运算结果是一样的

  • ||具有短路效果,如果左边是true,则右边就不执行,结果就为true


注意:开发中常用的逻辑运算符:

  • &&

  • ||

  • !


5、位运算符

符号:

  • & 与位运算

  • | 或位运算

  • ^ 异或运算

  • ~ 翻转运算

  • << 左移运算

  • >> 右移运算

  • >>>无符号右移运算


注意:

  • 要做位运算,首先要把数据转换为二进制


案例:

通过下述案例,了解下位运算符的特点:

技术分享图片



我们先分析下几条位运算符打印出来的结果:

分析: 因为是位运算,所以我们必须要把数据换算成二进制


?

3的二进制: 11

00000000 00000000 00000000 00000011

4的二进制:100

00000000 00000000 00000000 00000100

&位与运算:有0则0

00000000 00000000 00000000 00000011

        &   00000000 00000000 00000000 00000100?

                ---------------------------------------------

00000000 00000000 00000000 00000000

结果是:0

?



?

|位或运算:有1则1

00000000 00000000 00000000 00000011

  |   00000000 00000000 00000000 00000100

-------------------------------------------------

00000000 00000000 00000000 00000111

结果是:7?

?



?

^位异或运算:相同则0,不同则1

00000000 00000000 00000000 00000011

^   00000000 00000000 00000000 00000100

---------------------------------------------

00000000 00000000 00000000 00000111

结果是:7?

?



?

~按位取反运算:0变1,1变0

     00000000 00000000 00000000 00000011

     ----------------------------------------------

~  11111111 11111111 11111111 11111100 (补码)?

?


  • 因为该值得出来是原数值的补码,所以我们要进一步的求出它的原码才是我们最终要的值。如果不知道怎么运算,可以参照上一节的Java基础语法


?

补码:11111111 11111111 11111100

反码:11111111 11111111 11111011

原码:10000000  0000000  00000100

结果是:-4?

?


通过分析执行程序代码,可见我们的分析是正确的:

技术分享图片



*另外,针对^还有以下特点:

  • 一个数据对另一个数据位异或两次,该数据本身不变。


程序举例:

技术分享图片



执行结果如下:

技术分享图片



可见,^异或运算可以用于两个数值对调的运算,建议自行编写如下代码做验证:

  • a = a ^ b;

  • b = a ^ b;

  • a = a ^ b;

这个留给大家自己动手操作。


接下来,我们进一步看一下以下几种运算:

  • <<:左移,左边最高位丢弃,右边补齐0

  • >>: 右移,正数最高位是0,左边补齐0;负数最高位是1,左边补齐1

  • >>>: 无符号右移,无论最高位是0还是1,左边补齐0


举例:

技术分享图片



在执行运算之前,我们先做以下分析:

<<的移动:


?

首先,我们需要先计算出3的二进制:11

00000000 00000000 00000000 00000011

(00)00000000 00000000 00000000 00001100

--------------------------------------------------------

左移2位,结果为:12?

?


  • 可见,<<是把<<左边的数据*2的移动次幂,即3*2^2=12

  • 同理,>>是把>>左边的数据除以2的移动次幂,即24/2^2 = 24/4 = 6

>>的移动:


?

计算出24的二进制:11000

原码:10000000   00000000   00000000  00011000

反码:11111111  11111111    11111111  11100111

补码:11111111  11111111    11111111  11101000

1111111111  11111111   11111111   111010(00)

        右移2位,最高位补1,生成新的补码?

?


然后再通过以下方式求出原码,就是我们需要的结果。  


?

补码:1111111111 11111111  11111111 111010

反码:1111111111 11111111  11111111 111001

原码:1000000000 00000000  00000000 000110

-----------------------------------------------------

结果是:-6?

?


>>>的移动:


?

计算出24的二进制:11000

原码:10000000  00000000 00000000 00011000

反码:11111111  11111111 11111111 11100111

补码:11111111  11111111 11111111 11101000

0011111111 11111111 11111111 111010(00)

右移2位,最高位补0,生成新的补码?

新的补码:0011111111  11111111 11111111 111010

?



  • 因为新生成的补码最高位为0,所以为正数,即它的原码、反码和补码的值都相同。

  • 所以11111111 11111111 11111111 111010对应的十进制结果是:1073741818

程序的执行结果为:

技术分享图片



可见,我们最终可以总结如下几点:

  • <<是把<<左边的数据*2的移动次幂

  • >>是把>>左边的数据除以2的移动次幂

  • >>:有符号右移。正数右移高位补0,负数右移高位补1

  • >>>:无符号右移。无论是正数还是负数,高位通通补0。

  • 对于正数而言,>>和>>>没区别。


最后,还有一个三元运算符没讲,我们将放到下一节做专题说明。

往期文章:

从0开始学大数据-Java基础开篇(1)

从0开始学大数据-Java基础语法(2)

 

本人能力有限,如有不足,还望指正

感谢大家一如既往的支持

希望一起分享给更多的人

让大家一起学习大数据技术

技术分享图片


从0开始学大数据-java基础语法

...几个知识点进行展开学习:关键字标识符注释常量和变量运算符语句函数数组PS:本节先学习前面4个知识点。&nb 查看详情

从0开始学大数据-java基础开篇

我们从零开始学习大数据技术,从java基础,到Linux技术涉猎,再深入到大数据技术的Hadoop、Spark、Storm技术,最后到大数据企业平台的搭建,层层递进,由点到面!希望技术大牛能过来指导学习。一、序言:2017年,这一年人才市场... 查看详情

从零开始学大数据-java基础-流程控制语句

...到面!希望技术大牛能过来指导学习。上一节学习了三元运算符/键盘录入,本节学习流程控制语句。开始之前,我们先看一下上节的练习题。一、练习题(1)键盘录入三个数据,获取三个数据中最大值,程序如下:程序执行结果... 查看详情

《从0开始学大数据》的启示

《从0开始学大数据》学习后感方法论与哲学学习的目的以及形成思维体系抽象能力,为什么是A而不是B?从MR-Spark看产品思维模式思维大数据发展历史分布式计算的核心思想——移动计算而非移动数据大数据系统与大型网... 查看详情

《从0开始学大数据》之spark的编程模型(代码片段)

...满足大数据的应用场景。但人们在Spark出现之后,才开始对MapReduce不满。原来大数据计算速度可以快这么多,编程也可以更简单。而且Spark支持Yarn和HDFS,公司迁移到Spark上的成本很小,于是很快,越来越多的公... 查看详情

《从0开始学大数据》之mapreduce计算框架是如何运作的(代码片段)

MapReduce编程模型将大数据计算过程切分为Map和Reduce两个阶段,在Map阶段为每个数据块分配一个Map计算任务,然后将所有map输出的Key进行合并,相同的Key及其对应的Value发送给同一个Reduce任务去处理。通过这两个阶段... 查看详情

从零开始学大数据-java基础-switch语句

我们从零开始学习大数据技术,从java基础,到Linux技术涉猎,再深入到大数据技术的Hadoop、Spark、Storm技术,最后到大数据企业平台的搭建,层层递进,由点到面!希望技术大牛能过来指导学习。上一节学习了流程控制语句,本节... 查看详情

《从0开始学大数据》的启示

《从0开始学大数据》学习后感方法论与哲学学习的目的以及形成思维体系抽象能力,为什么是A而不是B?从MR-Spark看产品思维模式思维大数据发展历史分布式计算的核心思想——移动计算而非移动数据大数据系统与大型网... 查看详情

《从0开始学大数据》之hdfs是如何实现大数据高速可靠的存储和访问

Hadoop分布式文件系统HDFS的设计目标是管理数以千计的服务器、数以万计的磁盘,将这么大规模的服务器计算资源当作一个单一的存储系统进行管理,对应用程序提供数以PB计的存储容量,让应用程序像使用普通文件系... 查看详情

有java基础如何学习大数据?

...算机编程语言众多,常用的编程语言有Java,Python等,在开始学习大数据之前都会选择学习Java,那Java到底好在哪呢?为什么学大数据之前要先学Java呢?大数据人才越来越多的受到社会和企业的青睐,很多想要学习大数据的新人... 查看详情

一起重新开始学大数据-java篇-day26反射,正则表达式(代码片段)

DAY26反射,正则表达式1.1类加载当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过类的加载,类的连接,类的初始化这三个步骤来对类进行初始化。如果不出现意外情况,VM将会连续完... 查看详情

java运算符与(&)非(~)或(|)异或(^)

...进制转为十进制,就是Integer.parseInt("0011",2)=3; 2.位与运算符(&)运算规则:两个数都转为二进制,然后从高位开始比较,如果两个数都为1则为1,否 查看详情

从0开始的练级路——三目运算符和保留小数后位数

...sflags(ios::fixed)<<setprecision(2)<<n<<endl; 三目运算符踩坑:如图: 三目运算符到了“:”后面,如果有多个语句只识别第一个(没括号的话) 查看详情

java基础之数据类型/基本运算符

...合、流、反射等等。今天我会从最基础的数据类型和基本运算符开始说起:虽然说java的底层是由c去实现的,不过ja 查看详情

一起重新开始学大数据-hbase篇-day57hbase调优(代码片段)

一起重新开始学大数据-Hbase篇-day57Hbase调优💚文章目录💛1、预分区2、Rowkey设计①设计原则②热点问题3、Inmemory4、MaxVersion5、Compact&split6、BulkLoading①代码②说明1、预分区Pre-CreatingRegions(预分区)概述: ... 查看详情

第二章二进制运算字符编码数据类型总结

...a=list()a=[]查询:L2[2]通过索引取值L2[-1]通过索引从列表右边开始取值L2.index(‘a‘)返回指定元素的索引值,从左右查找,找到第一个匹配值,则返回.L2.count(‘a‘)统计指定元素的个数切片:L2[0:3]返回从索引0至3的元素,不包括3,顾头不顾尾... 查看详情

女生学大数据前景怎么样

...数据专业人才的需求是非常旺盛的,而且随着大数据技术开始全面落地,未来产业领域会持续释放出大量的大数据相关岗位。所以女生学大数据也很好就业。这里介绍一下大数据要学习和掌握的知识与技能:①java:一门面向对... 查看详情

从0开始学java:运行时异常与一般异常有何异同?

无限互联从0开始学Java系列之JAVA相关基础知识,Java基础培训,String和StringBuffer的区别1.Java基础学习,从0开始学Java:String和StringBuffer的区别?JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符... 查看详情