一、Java的八种数据类型
1、八种基本数据类型为:int、short、byte、long、char、float、double、boolean(String不是基本数据类型);
2、int 4字节,取值范围约为 负21亿4千7百万 到 21亿4千7百万
3、long,float类型的赋值 long a=2147483648L;float f=3.4F
4、Java中的null,它不是一个合法的对象,因此没有分配空间;null就是将引用变量的值全部置0;变量分为两大类,原始值,和引用值,null可以视为引用值的一个值。
5、类型转换注意事项:
1) long类型可以自动转换为float;
2) short a = 128; byte b = (byte)a;
运行结果:a=128;b=-128;
解释:short类型变量占两个字节,a对应的二进制为:00000000 10000000;byte截取其低字节为10000000,是-128的补码,因此b=-128.
3) 原码、反码、补码参看 点击打开链接
4) Java在涉及byte、char、short的运算时,都是先将他们转换为int,运算得到的结果也是int,因此两个short值相加得到int。如 short s = 1;s = s+1;编译报错。但是s+=1不会报错(Java编译器经过特殊处理)。
6、char 采用unicode编码,占两个字节,可以存储汉字;String采取了一个灵活的存储方式,英文占一个字节,汉字占两个字节。
二、不可变类的设计
1、一旦对象被创建出来,成员变量就不能被修改;Java类库中基本类型的包装类都是不可变类。
2、构建原则
1) 所有成员变量都被private修饰;
2) 不提供修改成员变量的方法,成员变量旨在构造函数中一次赋值,永不改变;
3) 确保类中的方法不被子类覆盖,所以把类定义为final或者把所有的方法定义为final;
4) 对于引用对象的成员,在构造和获取时,通过clone方法解除引用关系;
5) 重写equals方法和hashcode方法。
final class ImmutableCls{
private Date d;
public ImmutableCls(Date _d){
this.d = (Date)_d.clone();//解除引用关系
}
public Date getDate(){
return (Date)d.clone();
}
}
三、位移运算符的优先级: 3>>2+4>>2; 首先计算2+4,所以结果为0
四、Math中的round:Math.round(-1.4) = -1;Math.round(-1.5) = -1;Math.round(-1.6) = -2;
规则:先去掉‘-’号,“5舍6入”,再加上‘-’号。
五、i++:i=1;i+++i++与i+++++i的运算结果;3和4
六、如何实现无符号数的右移操作
1、“>>”:有符号右移,参与运算为正数则高位补0;为负数则高位补1;
2、“>>>”:无符号右移,参与运算时,高位补0;
3、char、short、byte参与位移运算前都会转化为int,Java为了保持位移的有效性,采取了取余措施(a>>n)等价于(a>>(n%32));
4、利用Integer.toBinaryString(i)时,以4Byte的方式输出。
public static void main(String[] args)
{
// TODO Auto-generated method stub
int i = -4;
System.out.println("------int>>:"+i);
System.out.println("位移前二进制:"+Integer.toBinaryString(i));
i>>=1;
System.out.println("位移后二进制:"+Integer.toBinaryString(i));
System.out.println("------int>>:"+i);
System.out.println();
i=-4;
System.out.println("------int>>:"+i);
System.out.println("位移前二进制:"+Integer.toBinaryString(i));
i>>>=1;
System.out.println("位移后二进制:"+Integer.toBinaryString(i));
System.out.println("------int>>:"+i);
System.out.println();
short j = -4;
System.out.println("------short>>:"+j);
System.out.println("位移前二进制:"+Integer.toBinaryString(j));
j>>>=1;
System.out.println("位移后二进制:"+Integer.toBinaryString(j));
System.out.println("------short>>:"+j);
System.out.println();
i=5;
System.out.println("------int>>:"+i);
System.out.println("位移前二进制:"+Integer.toBinaryString(i));
i>>=32;
System.out.println("位移后二进制:"+Integer.toBinaryString(i));
System.out.println("------int>>:"+i);
}
------int>>:-4
位移前二进制:11111111111111111111111111111100
位移后二进制:11111111111111111111111111111110
------int>>:-2
------int>>:-4
位移前二进制:11111111111111111111111111111100
位移后二进制:1111111111111111111111111111110
------int>>:2147483646
------short>>:-4
位移前二进制:11111111111111111111111111111100
位移后二进制:11111111111111111111111111111110
------short>>:-2
------int>>:5
位移前二进制:101
位移后二进制:101
------int>>:5
注:-4的二进制表示:4:100->取反:11111111 11111111 11111111 11111011->加1:11111111 11111111 11111111 11111100->右移、负数高位补1:11111111 11111111 11111111 11111110
无符号位移、高位补0:01111111 11111111 11111111 11111110(2147483634)
short -4转int参与运算,得到上述“无符号位移、高位补0”的结果,short截取低位 11111111 11111110(-2),按照4Byte输出:11111111 11111111 11111111 11111110