Java 面试中你最易忽略9道的程序题

来源:互联网 发布:网易云音乐 知乎 编辑:程序博客网 时间:2024/05/17 11:34

1.理解int型取值范围

public class INTVALUE {    public static void main(String[] args) {        long max = Integer.MAX_VALUE + 1;        long min = Integer.MIN_VALUE - 1;        System.out.println("int型最大值加1:"+max);        System.out.println("int型最小值减1:"+min);    }}

程序运行结果:
int型最大值加1:-2147483648
int型最小值减1:2147483647
可以发现最大值加上1,结果变成了最小值;当最小值减去1,结果变成了最大值;以上情况就是数据类型的溢出。

2.得到精确结果

public class Rigorous {    public static void main(String[] args) {        double d = 10.00;        double f = 9.30;        System.out.println(d-f);    }}

结果不是0.7哟,而是0.6999999999999993
要想得到准确的结果可以使用BigDecimal类

import java.math.BigDecimal;public class BigDecimalDemo {    public static void main(String[] args) {        BigDecimal d = new BigDecimal("10.0");        BigDecimal f = new BigDecimal("9.3");        BigDecimal sub = d.subtract(f);        double ret = sub.doubleValue();        System.out.println(ret);    }}

此时结果为0.7,但是此方法复杂且运行速度慢。

public class SwitchLong {    public static void main(String[] args) {        double d = 10.00 ;        double f = 9.30 ;        long d1 = (long) (d*100);        long f1 = (long) (f*100);        double ret = (d1-f1)/100.0;        System.out.println(ret);    }}

答案同样是0.7,此方法是先将浮点型转换为整型计算后,再将整型转换为浮点型。

3.请写出以下代码运行结果

public class LongDemo {    public static void main(String[] args) {        long l = 2147283640 * 10;        System.out.println(l);    }}

答案是-2000080 而不是 21472836400 。这是因为在
long l = 2147283640 * 10; 中2147283640还在int型的取值范围内,所以不加L是不会出编译错误的,但*10后的结果早早就超出了int型的取值范围,造成了数据类型的溢出。以后要声明一个long型变量,最好在其值后加上L。

4.关于if语句

public class TestIf {    public static void main(String[] args) {        int a=3,b=4,c=7;        if (a+b>c)             if(++a==b)                System.out.println(++a);            else                 System.out.println(a++);    }}

答案是没有任何输出,这是因为if(a+b>c) //a+b>c返回的是false,所以后面的所有语句都不会执行。

public class TestIf2 {    public static void main(String[] args) {        int i=1;        double j=1.0;        float k=1.0f;        if (i==j && i==k && j==k) {            System.out.println("i=j=k");        }    }}

输出结果i=j=k.对于基本数据类型,如果操作数的值相等,则相等运算符 (==) 返回 true,否则返回 false。对于 string 以外的引用类型,如果两个操作数引用同一个对象,则 == 返回 true。对于 string 类型,== 比较字符串的值。

5.使用foreach循环输出时的注意事项

public class TestForEach {    public static void main(String[] args) {        String language[] = new String[] {"aaaa","bbbb","cccc","dddd"};        for (String lang : language) {            lang = "abcd";        }        for (String lang : language) {            System.out.print(lang+"   ");        }    }}

程序输出结果:aaaa bbbb cccc dddd
使用foreach语句循环时,不能通过循环变量来改变数组或者集合元素的值。

6.形参个数可变的方法

public class ChangeArgs {    public static void main(String[] args) {        System.out.println("传入一个参数:");        print("Java");        System.out.println("\n传入两个参数:");        print("Java","C");        System.out.println("\n传入三个参数:");        print("Java","C","C++");    }    //定义可变参数的方法    public static void print(String ... str){        for (String string : str) {            System.out.print(string+"   ");        }    }}

程序结果:
传入一个参数:
Java
传入两个参数:
Java C
传入三个参数:
Java C C++
在JDK1.5之后Java语言提供一个新的概念——可变参数。可变参数是允许为方法指定不再固定数目的参数,可以根据需要传入多个参数。

7.关于字符串

public class TestString {    public static void main(String[] args) {        String str1 = "Hello";        String str2 = "World";        String str3 = "HelloWorld";        //str1+str2 两个变量相加,相当于//(newStringBuilder(String.valueOf(s1))).append(s2).toString();        //运行时会有新的地址空间的分配。为false        System.out.println(str3==str1+str2);        //和上面是相同的原理,会有新的地址空间的分配        System.out.println(str3==str1+"World");        //+两边都是字符串常量,Java系统先把两个字符串拼接起来,        //然后到常量池中去找是否有相同内容的字符串        //上面str3内容即为HelloWorld,找到后就把str3的地址返回。结果为true。        System.out.println(str3=="Hello"+"World");    }}

8.静态成员的调用
下面两个程序可以编译并运行的是

public class TestStatic01 {    public static int add(int x){        int y;        if(x>0){            y=10;        }        return x+y;    }    public static void main(String[] args) {        System.out.println(add(5));    }}
public class TestStatic02 {    public static int add(int x){        int y;        if(x>0){            y=10;        }else {            y=0;        }        return x+y;    }    public static void main(String[] args) {        System.out.println(add(5));    }}

第一个在编译时会报错,局部变量必须经过初始化后才能使用,第二个程序y在使用前已经确保会被初始化。

9.普通代码块
下面代码能够正常编译?

public class CodeBlock {    public static void main(String[] args) {        int x=5;        System.out.println(x);        {            int x=3;            System.out.println(x);        }    }}

直接在一个方法或语句中出现的{ }就称为普通代码块。
此程序中代码块是在main()方法的作用域内定义的,在同一个作用域中,一个变量只能定义一次。

1 0
原创粉丝点击