java面试2:数据类型

第一部分:必背易漏知识点

1.1算术运算

1.1.1取整(a/b):当除数和被除数都是整数时,结果一定是忽略了精度的整型,当除数和被除数有浮点数时,结果有浮点数,当除数或者被除数有常量,结果有浮点数

1.1.2自增自减的运用:写在后面,是先将变量参与运算,然后再自增;写在前面,是先自增 , 然后参与运算

1.2关系运算

1.2.1判断两端必须是基本数据类型

== 和 != 可以用于判断字符和布尔类型,以及数值(可以用于判断引用数据类型的地址是否相等)

1.2.2 &&和&的区别

1.3位运算符

1.3.1 >> 右移:右位移1位,相当于除以 2

1.3.2 << 左移:左位移1位,相当于乘以 2

第二部分:练习题

简答题

2.1说说&和&&的区别

同:&和&&都可以用作逻辑与的运算符,当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。

异:&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式;&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果为0x01。

2.2char型变量中能不能存贮一个中文汉字?为什么?

在java语言中,默认使用的Unicode编码方式,即每个字符占用两个字节。char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。

补充:使用 Unicode 意味着字符在 JVM 内部和外部有不同的表现形式,在 JVM内部都是 Unicode,当这个字符被从 JVM 内部转移到外部时(例如存入文件系统中),需要进行编码转换。所以 Java 中有字节流和字符流,以及在字符流和字节流之间进行转换的转换流,如 InputStreamReader 和 OutputStreamReader,这两个类是字节流和字符流之间的适配器类,承担了编码转换的任务

2.3用最有效率的方法算出2乘以8等於几?

2 << 3,因为将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可,而位运算cpu直接支持的,效率最高,所以,2乘以8等於几的最效率的方法是2 << 3。

2.43*0.1 == 0.3 将会返回什么?true 还是 false?

false,因为有些浮点数不能完全精确的表示出来。

选择题

2.5以下代码的输出结果是()
public class Test {
	public static void main(String[] args) {
        int i =42;
        String s = (i<40)?"life":(i>50)?"universe":"everything";
    }
}

A.life

B.universe

C.everything

D.以上答案都不是

分析:语言中运算符分为3类:单目运算符(++、–等)、二目运算符(+、-)、三目运算符(?)

本题中的三目运算符有点特殊,是一个嵌套三目运算符,相当于

String s2;
int i =42;
if (i<40) {
	s2 = "life";
} else if(i>50){
    s2 = "universe";
} else {
    s2 = "everything";
}

答案:C

2.6下列程序的输出结果是()
public class Test {
	public static void main(String[] args) {
        boolean b = true ? false:true == true?false:true;
        System.out.println(b);
    }
}

A.true

B.false

C.null

D.以上答案都不是

解析:三目运算符是右结合性的,所以应该理解为:

boolean b = true ? false:((true == true)?false:true);

答案:B

2.7下列程序的输出结果是()
public class Test {
	public static void main(String[] args) {
        int a = 5;
        System.out.println("value is " + ((a<5)?10.9:9));
    }
}

A编译错误

B.10.9

C.9

D.以上答案都不是

解析:java会根据运算符的精度类型进行自动类型转换,由于前面有一个10.9,因此后面的9也会自动变成9.0。

答案:D

2.8下列程序的输出结果是()
public class Test {
	public static void main(String[] args) {
		char x = 'x';
        int i = 10;
        System.out.println(false ? i :x);
        System.out.println(false ? 10 :x);
    }
}

A.120 x

B.120 120

C.x 120

D.以上答案都不是

解析:int i=10;中的i是一个变量,因此,第一输出x被提升为int型了,因为i是int类型,x的int值为120,所以第一个输出为120;至于第2个输出,Java编程规范中提到:当后两个表达式有一个是常量表达式(本题中是10)时,另外一个类型是T(本题中是char)时,而常量表达式可以被T表示时,输出结果是T类型。所以,因为10是常量,可以被char表示。输出结果是char型的

答案:A

2.9下列程序的输出结果是()
public class Test {
	public static void main(String[] args) {
        int i = 32;
        System.out.println(i >> 32);
    }
}

A.32

B.16

C.1

D.0

解析:移位操作符右边的参数要进行模的32运算,并且移位是对二进制的操作,而二进制中8位是一个循环。所以,i>>32等于i>>0,而i>>33等于i>>1

答案:A

2.10下列程序的输出结果是()
public class Test {
    static {
        int x = 5;
    }
    static int x,y;
	public static void main(String[] args) {
        x--;
        myMethod();
        System.out.println(x + y++ +x);
    }
    public static void myMethod() {
        y = x++ + ++x;
    }
}

解析:

public class Test {
    static {int x = 5;}//在第一次被载入JVM时运行,但由于是局部变量,x=5不影响后面的值
    static int x,y;//初始化x=0;y=0
	public static void main(String[] args) {
        x--;
        System.out.println(x);//步骤1:在运行myMethod();之前,x是-1,开始调用myMethod()函数
        myMethod();//步骤4:在运行myMethod();之后x是1,y是0
        System.out.println(x + y++ +x);//步骤5:运行x+(y++)+x=1+0+1=2
    }
    public static void myMethod() {
        y = x++ + ++x;
        System.out.println(y);//步骤2:进入myMethod()运行y=(x++)+(++x)后y=0
        System.out.println(x);//步骤3:此时x=1
    }
}

答案:2

2.11下列程序的输出结果是()
public class Test {
	public static void main(String[] args) {
        int j = 0;
        for (int i = 0; i<100; i++) {
            j = j++;
        }
        System.out.println(j);
    }
}

A.0

B.99

C.100

D.101

解析:因为java用了中间缓存变量的机制,所以,j=j++可换成如下写法

temp = j
j = j + 1;
j = temp;

举个例子再说明

int i = 1;
i = i++;//结果是多少,为什么。赋值完成后,会回收寄存器里的数据
System.out.println(i); //1

答案:A

2.12下列程序的输出结果是()
public class Test {
	public static void main(String[] args) {
        int i = 0;
        System.out.println(i++ + i++); // 1+2 =3
        System.out.println("i=" + i); // 3
        System.out.println(i++ + ++i); // 3+5 =8
         System.out.println("i=" + i); // 5
        System.out.println(i++ + i++ +i++); // 5 + 6 +7 =18
    }
}

解析:i++ + i++ 首先执行第一个i++操作,由于自增操作会稍后执行,因此,运算时i的值还是1,但自增操作后,i的值变为了2,接着执行第二个i++,运算时,i的值已经为2。其他的同理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值