Java基础知识《Java程序员面试笔试宝典》--基本类型与运算

一、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    


猜你喜欢

转载自blog.csdn.net/qq_24888697/article/details/80780979