一、各类运算符
一、算术运算符
对数值类型进行运算,同c语言。但比较特别的部分有:
- +:对于字符串而言是字符串拼接。
- %:取模。其本质是a % b = a - a / b * b(当a是小数是变为a - (int)a / b * b)。
- /:整数相除,不强转的话默认去掉小数位。注意有小数参与的运算得到的结果都是近似值!
以下是两道特殊的面试题,要求回答最后输出i的值是多少?
#(1)
int i = 1;
i = i++;
System.out.println(i);
#(2)
int i = 1;
i = ++i;
System.out.println(i);
第一题的答案是1,第二题的答案是2。
该题的核心在于,进行++和--操作时,计算机内部会自动使用一个临时变量,假设其名称为temp。
对于第一题来说,第二句代码的内部流程为:
int temp = i;
i = i + 1;
i = temp;
也就是所谓后加加的“先用后加”,“先用”指的是用临时变量temp存储i的原始值,“后加”指的是在这之后再执行i=i+1。
而对于第二题来说,第二句代码的内部流程为:
i = i + 1;
int temp = i;
i = temp;
也就是所谓的“先加后用”,因此,两题的答案不相同。
一些朋友可能注意到了++i和i++的区别,却不能理解到临时变量这一层,因此出错。
二、关系运算符(比较运算符)
即结果为boolean类型,经常用于条件判断。
大部分同c语言,比较特殊的是instanceof,用于判断是否是类的对象。
三、逻辑运算符
用于连接多个条件,最终结果也是boolean类型。
特别的,注意短路与逻辑的分类:
- 短路与&&,短路或||,取反!:&&若第一个条件为false则直接判断结果为false,不再执行第二个条件;||若第一个条件为true则直接判断结果为true,不再执行第二个条件。
-
逻辑与&,逻辑或|,逻辑异或^:与上面的区别是不管第一个条件如何,第二个都会执行判断。其中^的作用是左右不同时为true,否则为false。
四、赋值运算符
=,可以与算术运算符进行复合简化缩写。
如+=,-=等。a+=b即为a = a+b
五、三元运算符
条件表达式? 表达式1:表达式2;
若条件表达式为true,则结果为表达式1,且表达式2不会执行;若条件表达式为false,则结果为表达式2,且表达式1不会执行。
注意:表达式1和2要为可以赋给接受变量的类型(或者可以满足自动转换/强转的)
六、位运算符
1、基本介绍
1、位移运算符
位移运算符:>> << >>>
int a = 1 >> 2;//1向右算术位移2位:
int e = 3 >>>2;//逻辑右移2位
>>算术右移:地位溢出,符号位不变,并用符号位补溢出的高位(相当于除以/2)
<<算术左移:符号位不变,低位补0(相当于乘以*2)
>>>逻辑右移也叫无符号右移:低位溢出,高位补0
注意,没有逻辑左移即<<<
2、位操作运算符(左右都是两个数而不是boolean)
-
~按位取反:0变1,1变0
-
&按位与:两位全1则1,否则0
-
|按位或:两位有一个1则1,否则0
-
^按位异或:两位不同则1,否则0
3、二进制在运算中的说明
对于二进制数在计算机中的存储,有原码、反码、补码三种形式。
对于有符号数而言:
- 最高位是符号位,0正1负
- 正数原码、反码、补码三码合一
- 负数的反码=原码符号位不变,其他位取反
- 负数的补码=其反码+1
- 0的反码、补码都是0
- Java语言中没有无符号数
- 计算机运算时都以补码的形式进行运算,方便统一正负数
- 但我们看运行结果的时候,要看原码
二、标识符
一、标识符的概念
- Java语言中的标识符其实就是“名字”,各种东西的名字,例如变量、方法、类。
- 凡是可以自己起名字的地方都叫做标识符
二、标识符命名规则(必须遵守)
- 由26个英文字母大小写,数字0-9,_或$组成
- 不可以用数字开头
- 不可以使用关键字和保留字,但可以包含关键字与保留字
- Java严格区分大小写,长度是无限制的
- 标识符中不能包含空格。
三、标识符命名规范(建议遵守,显得专业)
- 对于包(package)名:由多个单词组成的时候所有字母都小写:aaa.bbb.ccc
- 类(class)名、接口(interface)名:由多单词组成时,所有单词的首字母大写:XxxYyyZzz[即大驼峰命名法]
- 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz[小驼峰命名法]
- 常量名:所有字母都大写,多个单词时每个单词用下划线链接:XXX_YYY_ZZZ
- 其他的可以查看文档
四、关键字与保留字
- 关键字:是被Java语言赋予了特殊含义,用作专门用途的字符串或单词。其中所有字母都为小写。
-
保留字:现有Java版本尚未使用但以后版本可能会作为关键字使用。
三、进制转换
一、基本介绍
对于整数有四种表示方式:
1、二进制:0,1,满2进1,以0b或0B开头。
2、十进制:0-9,满10进1.
3、八进制:0-7,满8进1,以数字0开头表示。
4、十六进制:0-9及A(10)-F(15),满16进1.以0x或0X开头表示。其中A-F不区分大小写。
二、举例
int n1 = 0b1010;//二进制10
int n2 = 1010;//十进制1010
int n3 = 01010;//八进制520
int n4 = 0x10101;//十六进制65793
三、进制之间的转换
1、其他进制转十进制
-
二转十:从最低位(右边)开始,将每个位上的数提取出来,乘以2的(位数-1)次方,然后求和。
-
八转十:从最低位(右边)开始,将每个位上的数提取出来,乘以8的(位数-1)次方,然后求和。
-
十六转十:从最低位(右边)开始,将每个位上的数提取出来,乘以16的(位数-1)次方,然后求和。
2、十进制转其他进制
-
十转二:将该数不断除以2,直到商为0为止(即没法整除了),然后将每步得到的余数倒过来,就是对应的二进制。
-
十转八:将该数不断除以8,直到商为0为止(即没法整除了),然后将每步得到的余数倒过来,就是对应的二进制。
-
十转十六:将该数不断除以16,直到商为0为止(即没法整除了),然后将每步得到的余数倒过来,就是对应的二进制。
3、二进制转八进制、十六进制
-
二转八:从低位开始,将二进制数每三位一组,转成对应的八进制数即可。
-
二转十六:从低位开始,将二进制数每四位一组,转成对应的十六进制数即可。
4、八进制、十六进制转二进制
-
八转二:将八进制数的每一位转成对应的一个3位的二进制数即可。
-
十六转二:将十六进制数的每一位转成对应的一个4位的二进制数即可。