关闭

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

标签: Java面试程序
188人阅读 评论(0) 收藏 举报
分类:

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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:544次
    • 积分:58
    • 等级:
    • 排名:千里之外
    • 原创:5篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档