1.java数据类型有基本数据类型和引用数据类型。基本数据类型有8种:数值型(整型、实型)、字符型、布尔型。引用数据类型有数组、类和接口。
整数类型:byte(1个字节-128~127),short(2个字节-32768~32767),int(4个字节),long(8个字节)
实数类型:float(4个字节),double(8个字节)
字符类型:char(2个字节)
布尔类型:java并没有明确规范boolean类型所占字节,jvm规范指出程序编译后的boolean类型用int存储
2.取模运算的一个特殊性:5%(-2)=1 ;(-5)%2=-1;取模运算中结果的符号看被模数,如果被模数为+,结果就为+,被模数为-,结果就为-;而除法运算除数和被除数有一个负数,结果就为负数。除法运算的正负性遵循一般规律。
整数类型:byte(1个字节-128~127),short(2个字节-32768~32767),int(4个字节),long(8个字节)
实数类型:float(4个字节),double(8个字节)
字符类型:char(2个字节)
布尔类型:java并没有明确规范boolean类型所占字节,jvm规范指出程序编译后的boolean类型用int存储
2.取模运算的一个特殊性:5%(-2)=1 ;(-5)%2=-1;取模运算中结果的符号看被模数,如果被模数为+,结果就为+,被模数为-,结果就为-;而除法运算除数和被除数有一个负数,结果就为负数。除法运算的正负性遵循一般规律。
% |被模数|<|模数|,结果是被模数;
|被模数|=|模数|,结果是0;
|模数|=1,结果是0;
3. 转义字符:
\n:换行
\r:按下回车键 Enter
\t:制表符 Tab
\b:退格键 Backspace
换行与回车的区别:dos下,换行用\n;
windows下回车符用两个字符表示,即\r\n;
Linux下,换行用一个字符表示,\n;
4.观察程序:
byte b=3;
b=b+4;
上述程序编译会出错,因为整型常量4默认是int型,与b相加提升精度,结果是int型,赋值给byte型b时会丢失精度。但是下面程序是正确的:
byte b=3;
b+=4;
表达式b+=4结果等同b=b+4,但运行机制不同,前者是两次运算,高精度赋值给低精度时精度丢失,后者相当于一次运算,把左右两者之和赋值给左边,内部会进行自动类型转换。
提问?既然整数默认是int型常量,byte b=3为什么不会丢失精度,这也是一次性赋值运算,也是内部自动类型转换,系统会判断3是否在byte的区间内,如果在则自动转换类型,如果不在,例如 byte b=128;则编译报错:可能丢失精度。继续下面例子:
byte b=3;
b+=126;
这时虽然第二行结果129已经超出byte范围,但这时问题与byte=129不同,已经不属于由于类型转换导致精度丢失的问题了,这是数据溢出,结果是-127
\n:换行
\r:按下回车键 Enter
\t:制表符 Tab
\b:退格键 Backspace
换行与回车的区别:dos下,换行用\n;
windows下回车符用两个字符表示,即\r\n;
Linux下,换行用一个字符表示,\n;
4.观察程序:
byte b=3;
b=b+4;
上述程序编译会出错,因为整型常量4默认是int型,与b相加提升精度,结果是int型,赋值给byte型b时会丢失精度。但是下面程序是正确的:
byte b=3;
b+=4;
表达式b+=4结果等同b=b+4,但运行机制不同,前者是两次运算,高精度赋值给低精度时精度丢失,后者相当于一次运算,把左右两者之和赋值给左边,内部会进行自动类型转换。
提问?既然整数默认是int型常量,byte b=3为什么不会丢失精度,这也是一次性赋值运算,也是内部自动类型转换,系统会判断3是否在byte的区间内,如果在则自动转换类型,如果不在,例如 byte b=128;则编译报错:可能丢失精度。继续下面例子:
byte b=3;
b+=126;
这时虽然第二行结果129已经超出byte范围,但这时问题与byte=129不同,已经不属于由于类型转换导致精度丢失的问题了,这是数据溢出,结果是-127
所以,纯粹的赋值运算可以自动进行类型转换而程序正常编译运行。(= += -= %= /= ;b=b+4算混合运算)
除法运算同样要考虑精度转换问题:
int a=5;
int b=2;
a=a/2; // int/int,结果是double,如果赋值给a会发生精度损失,所以舍弃小数点后的内容,结果是2
所以,算数运算符可以丢失精度而程序正常编译运行。
5.移位问题
左移<<,左移几位就表示乘以2的几次幂,在末尾补零;
右移>>,右移几位表示除以2的几次幂,如果最高位是1,就在前面补1,如果最高位是0,就在前面 补0;
无符号右移>>>,不论最高位是1还是0,都在前面补0。
6.位运算
&与(&&短路与) |或(||短路或) ~取反 ^异或
与:都为1时才为1(可以把1看成真,0看成假)
或:都为0时才为0
取反:1变0,0变1
异或:两者不同为1,相同为0。小应用:7^4^4=7 ,一个数异或另一个数两次还得到它本身,可以应用于加密算法。
&和&&,|和||的区别:
&&是短路与,当左边已经是假的情况下,就不会判断右边的真假,直接返回假。例如,(4>7)&&(5/0==0)vs (4>7)&(5/0==0),前者返回假,后者报错,除数不能为0;
||是短路或,当左边已经是真的情况下,就不会判断右边的真假,直接返回真;例如,(7>4)||(5/0==0) vs (7>4)|(5/0==0),前者返回真,后者报错,除数不能为0.
7.最有效的方式计算2*8?
运用移位运算2<<3(左移3位)
8.交换m n的值
方案一
int m=3,n=4;
int temp=m;
m=n;
n=temp;
不用第三个变量交换m,n的值?
方案二
m=m+n; (m+n的值可能超出int的范围,所以该方法有局限性)
n=m-n;
m=m-n;
方案三
m=m^n; m=3^4
n=m^n; n=(3^4)^4 ……3
m=m^n; m=(3^4)^3……4 m=m^(m^n) 或者 m=(m^n)^m 这个n已经被赋上m的值了
9.计算机中数值都是以补码形式存储的。正数的原码、反码、补码都一样
10.十进制转换为十六进制的一种算法:
先把十进制转换为二进制,然后通过&15运算过滤,取得二进制最后四位,计算保存,然后把原来的二进制无符号右移4位(>>>4),再次通过&15运算过滤就得到倒数第二个四位,依次计算。
其实就是
while(num>=15)
{
num=num%15;
保存num;
num=num/16;
}
左移<<,左移几位就表示乘以2的几次幂,在末尾补零;
右移>>,右移几位表示除以2的几次幂,如果最高位是1,就在前面补1,如果最高位是0,就在前面 补0;
无符号右移>>>,不论最高位是1还是0,都在前面补0。
6.位运算
&与(&&短路与) |或(||短路或) ~取反 ^异或
与:都为1时才为1(可以把1看成真,0看成假)
或:都为0时才为0
取反:1变0,0变1
异或:两者不同为1,相同为0。小应用:7^4^4=7 ,一个数异或另一个数两次还得到它本身,可以应用于加密算法。
&和&&,|和||的区别:
&&是短路与,当左边已经是假的情况下,就不会判断右边的真假,直接返回假。例如,(4>7)&&(5/0==0)vs (4>7)&(5/0==0),前者返回假,后者报错,除数不能为0;
||是短路或,当左边已经是真的情况下,就不会判断右边的真假,直接返回真;例如,(7>4)||(5/0==0) vs (7>4)|(5/0==0),前者返回真,后者报错,除数不能为0.
7.最有效的方式计算2*8?
运用移位运算2<<3(左移3位)
8.交换m n的值
方案一
int m=3,n=4;
int temp=m;
m=n;
n=temp;
不用第三个变量交换m,n的值?
方案二
m=m+n; (m+n的值可能超出int的范围,所以该方法有局限性)
n=m-n;
m=m-n;
方案三
m=m^n; m=3^4
n=m^n; n=(3^4)^4 ……3
m=m^n; m=(3^4)^3……4 m=m^(m^n) 或者 m=(m^n)^m 这个n已经被赋上m的值了
9.计算机中数值都是以补码形式存储的。正数的原码、反码、补码都一样
10.十进制转换为十六进制的一种算法:
先把十进制转换为二进制,然后通过&15运算过滤,取得二进制最后四位,计算保存,然后把原来的二进制无符号右移4位(>>>4),再次通过&15运算过滤就得到倒数第二个四位,依次计算。
其实就是
while(num>=15)
{
num=num%15;
保存num;
num=num/16;
}