1.赋值运算符
赋值使用操作符“=”。它的意思是“取右边的值(即右值),把它复制给左边(即左值)”。右值可以是任何 常数、变量或者表达式 (只要它能 生成 一个值就行)。但左值必须是一个明确的,已命名的变量。也就是说,必须有一个物理空间可以存储等号右边的值。
分类 基本数据类型 与 类数据类型 的不同 1、 对基本数据类型的赋值是很简单的。基本数据存储了实际的数值,而并非指向一个对象的引用,所以在为其赋值的时候,是直接将一个地方的内容复制到了另一个地方。 2、 但是在为对象“赋值”的时候,情况却放生了变化。对一个对象进行操作,我们真正操作的是对对象的引用。----这种特殊的现象通常称作“别名现象”,是Java操作对象的一种基本方式。 ----摘抄自《Thinking In Java》P392. 字节、字、bit、byte的关系
1 Byte = 8 Bits
1 KB = 1024 Bytes 1 MB = 1024 KB 1 GB = 1024 MB bps 是 bits per second 的简称。一般数据机及网络通讯的传输速率都是以「bps」为单位。如56Kbps、100.0Mbps 等等。 Bps即是Byte per second 的简称。而电脑一般都以Bps 显示速度,如1Mbps 大约等同 128 KBps。3.基本数据类型占据的空间大小
byte 占位8个比特,或者说一个字节.由于是有符号的,所以最小时为-128,最大值为+127.
short 占位16比特,两字节.最小值2^15,最大值2^15 -1. int 占位32比特,4字节.最小值 2^31,最大值2^31 -1 long 占位64比特,8字节.最小值2^63,最大值2^63-1 float 占位32比特,4字节.最小正非零值2^-149,最大正非零值(2-2^-23)·2^127. double 占64比特,8字节.最小正非零值为2^-1074,最大正非零值为(2-2^-52)·2^1023 char 占位16比特,2字节.主要是为了支持unicode,所以java中的char是双字节,而非C++中的一个字节 boolean 网上说法比较多,不过根据字节码的内容来看,如果是单个boolean变量,则使用int来存储,如果是boolean数组,则用byte来存储。4. 注意与C/C++的不同
int 在C和C++的占用2个字节,在java中4个字节。
在C++中,char是基础数据类型,8位,1个字节。byte不是基础数据类型,一般是typedef unsigned char byte;这样子的,也就是说,byte其实是unsigned char类型,那么也是8位,1个字节。不同的是,char可以表示的范围是-128-127,而byte可以表示的范围是0-255。 在java中,char和byte都是基础数据类型,其中的byte和C++中的char类型是一样的,8位,1个字节,-128-127。但是,char类型,是16位,2个字节,'\u0000'-'\uFFFF',可以表示0~65535的无符号数。 为什么java里的char是2个字节? 因为java内部都是用unicode的,所以java其实是支持中文变量名的,比如string 世界 = "我的世界";这样的语句是可以通过的。5.逻辑运算符
逻辑运算符用于连接布尔型表达式。、
逻辑运算符包括"&","&&","|","||"。 &:表示普通与,所有的判断条件都要依次执行; &&:若干个条件,如果前面的条件返回false,那么后面不再判断,就是false; |:表示普通或,所有的判断条件都要依次执行; ||:若干个条件,如果前面的条件返回true,那么后面不再判断,就是true;6.位运算符
位运算符主要针对二进制,
它包括了:按位与(&)、非(~)、按位或(|)、按位异或(^)。 从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算。 &:当两边操作数对应的位同时是1时,结果为1,否则为0。如1100&1010=1000 |:当两边操作数对应的位只要有一个是1,结果为1,否则为0。如1100|1010=1110 ~:操作数的位,0变1,1变0,这个是单目运算符 ^:当两边操作数对应的位值不同时,结果为1,否则为0。如1100^1010=01107.位移动运算符
位移动运算符主要有三种:
<<(左移): 在没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方 >>(带符号右移):右移高位补符号位 右移一位相当于除2,右移n位相当于除以2的n次方。>>>(无符号右移):右移高位补0, 无符号右移运算符只对32位和64位的值有意义8.实例验证
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | public static void main(String[] args) { // 1、左移( << ) // 0000 0000 0000 0000 0000 0000 0000 0101 然后左移2位后,低位补0:// // 0000 0000 0000 0000 0000 0000 0001 0100 换算成10进制为20 System.out.println( 5 << 2 ); // 运行结果是20 // 2、右移( >> ) 高位补符号位 // 0000 0000 0000 0000 0000 0000 0000 0101 然后右移2位,高位补0: // 0000 0000 0000 0000 0000 0000 0000 0001 System.out.println( 5 >> 2 ); // 运行结果是1 // 3、无符号右移( >>> ) 高位补0 // 例如 -5换算成二进制后为:0101 取反加1为1011 // 1111 1111 1111 1111 1111 1111 1111 1011 // 我们分别对5进行右移3位、 -5进行右移3位和无符号右移3位: System.out.println( 5 >> 3 ); // 结果是0 System.out.println(- 5 >> 3 ); // 结果是-1 System.out.println(- 5 >>> 3 ); // 结果是536870911 // 4、位与( & ) // 位与:第一个操作数的的第n位于第二个操作数的第n位如果都是1,那么结果的第n为也为1,否则为0 System.out.println( 5 & 3 ); // 结果为1 System.out.println( 4 & 1 ); // 结果为0 // 5、位或( | ) // 第一个操作数的的第n位于第二个操作数的第n位 只要有一个是1,那么结果的第n为也为1,否则为0 System.out.println( 5 | 3 ); // 结果为7 // 6、位异或( ^ ) // 第一个操作数的的第n位于第二个操作数的第n位 相反,那么结果的第n为也为1,否则为0 System.out.println( 5 ^ 3 ); //结果为6 // 7、位非( ~ ) // 操作数的第n位为1,那么结果的第n位为0,反之。 System.out.println(~ 5 ); // 结果为-6 } |