Java程序员面试宝典——重要习题整理

1、下面程序的输出结果是()

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 ;所以结果为0.

关于中间缓存变量机制可以参考文章:http://blog.csdn.net/waycaiqi/article/details/43486249

 

2、以下程序错误的是()

A. short s = 1; s = s + 1 ;                    B. short s = 1 ; s += 1 ;            C. short s = 1 ; s = 1 + 1 ;

解析:使用+=、-=、*=、/=、%=等赋值运算符对基本类型运算时,运算符右边的数字将首先被强制转换成与左边数值相同的数据类型,然后在进行运算,且运算结果与运算符左边的数值类型相同,所以选项B正确。对于选项C,1+1是一个可以确定的常量,“+”在编译时就被执行了,而不是在程序运行的时候执行,所以效果等同于s = 2 ; 的赋值操作,所以也正确。而A选项中的 s+1执行后的结果为int型,所以不能赋值给s。故错误的A

 

3、以下代码的输出结果是()

public class Test {
    
    public static void main(String[] args) {
        int a = 5 ;
        System.out.println("value is " + ((a < 5) ? 10.9 : 9));
        
        char ch = 'x' ;
        int i = 10 ;
        System.out.println(false ? i : ch );
        System.out.println(false ? 10 : ch );        
    }
}

 

解析:Java编程规范中提到,对于三目运算符?:而言,当后两个表达式的数据类型不一致时,系统会自动将两个表达式的类型转化一致,所以第一个输出结果为9.0而不是9,第二个输出结果为120。此外,Java编程规范中还提到,当后两个表达式有一个是常量表达式(本题是10)时,另外一个类型是T(本题是char)时,而常量表达式可以被T表示时,输出结果是T类型。所以第三个输出的是x而不是120。所以,最终的结果是9.0   120   x

 

4、下面程序的输出结果是()

public class Test {
    
    public static void main(String[] args) {
        int num = 32 ;
        System.out.println(num >> 32);
    }
}

 

A. 32     B. 16        C. 1          D. 0

解析: 移位操作符右边的参数首先要对字长进行取模运算,并且移位是对二进制位进行操作,而二进制中8位是一个循环。本题中num为int类型,字长是32,所以num>>32等于num>>0,而num>>33等于num>>1.所以答案为A

注意:在移位运算时,byte、short和char类型移位后的结果会变成int类型对于byte、short、char和int进行移位时,规定实际移动的次数是移动次数和32的余数,也就是移位33次和移位1次得到的结果相同。移动long型的数值时,规定实际移动的次数是移动次数和64的余数,也就是移动66次和移动2次得到的结果相同。 

 

5、当编译下面代码会出现什么情况()

public class Test {
    
    private int count ;
    //构造函数
    Test(int count){
        this.count = count ;
    }
    
    public static void main(String[] args) {
        Test t = new Test(99) ;
        System.out.println(t.count);
    }    
}

 

A. 编译时错误,count变量定义的是私有变量

B. 编译时错误,当System.out.println被调用时t没有被初始化

C. 编译和执行时没有输出结果

D. 编译运行后输出结果99

解析:事实上,变量count被定义为私有变量,并不能阻止构造器对其进行初始化,所以count成功被初始化为99,故答案为D

注意,count变量被私有化之后,理论上是不能被访问的。但是该main方法是在本类的内部,所以可以直接访问。如果在另一个类中这样访问Test对象的count变量,是不会成功的,例如下面的代码会在第18行提示访问错误

 

 1 public class Test {
 2     
 3     private int count ;
 4     //构造函数
 5     Test(int count){
 6         this.count = count ;
 7     }
 8     
 9     public static void main(String[] args) {
10         Test t = new Test(99) ;
11         System.out.println(t.count);
12     }    
13 }
14 
15 class T{
16     public static void say(){        
17         Test t = new Test(55) ;
18         //System.out.println(t.count) ;  //无法编译通过,提示有错误
19     }
20 }

 

6: 8、16、64都是2的阶次方数,用Java编写程序来判断一个整数是否是2的阶次方,并说明那个方法更好?

解析

思路1:不断除以2,并判断是否整除。这是最先想到的方法

public boolean judge(int n){
        int num = n ;
        if(n < 0){
            return false ;
        }
        //因为1为2的阶次方数,所以不用判断,当大于2时进行判断
        while(num >= 2){
            if(num%2 == 1){
                return false ;
            }
            num = num/2 ;
        }
        return true ;
    }

 

思路2:如果一个数是2的阶次方数,那么其二进制的首位为1,其他为均为0。eg:8的二进制表示为100,64表示为1000000等,若将该数减1,则对应的二进制首位为哦,其它位均为1,所以有n & (n-1)的结果为0。所以采用这种方法可以简单快速地进行判断。简单,粗暴,高效

public boolean judge2(int n){
    if((n & (n-1)) == 0){
        return true ;
    }else{
        return false ;
    }
}

 

7、下面程序输出结果是什么?

 

 1 import java.net.URL;
 2 import java.util.HashSet;
 3 import java.util.Set;
 4 
 5 public class Test {
 6     
 7     private static final String [] URLNAMES = {
 8             //IP地址为202.108.33.94
 9             "http://www.sina.com",
10             //IP地址为124.115.173.252
11             "http://www.nwu.edu.cn",
12             //IP地址为208.97.154.9
13             "http://javapuzzlers.com",
14             //IP地址为64.233.189.147
15             "http://www.google.com",
16             //IP地址为208.97.154.9
17             "http://Javapuzzlers.com",
18             //IP地址为208.97.154.9
19             "http://apache2-snort.skybar.dreamhost.com",            
20     };
21     
22     public static void main(String[] args) throws Exception {
23         Set<URL> favorites = new HashSet<URL>() ;
24         for(String s : URLNAMES){
25             favorites.add(new URL(s)) ;
26         }
27         
28         System.out.println(favorites.size());                
29     }        
30 }

 

A. 一定是4   B. 一定是5    C. 一定是6    D.以上答案都不对

解析:本题在联网状态下会输出4,这是由于URL的equals比对方式,根据equals的文档说明,如果两个主机名可以解析为同一个IP地址,则认为两个主机相同(即使主机名不相同);如果由一个主机名无法解析,但两个主机名相等(不区分大小写)或两个主机名都为null,则也认为这两个主机相等。上面有三个IP都是208.97.154.9,而Set集合不允许有重复元素出现,所以在联网情况下输出为4

如果是在断网状态下,这些都无法解析为IP地址,这时就要判断URL的名字,仅认为名字相同的才是相同的URL,前面说过URL的判断不区分大小写,而有两个在不区分大小写的情况下是相同的,所以输出结果是5.

所以最后的答案是D

 
 

 

转载于:https://www.cnblogs.com/mukekeheart/p/5633379.html

本书针对当前各大it企业面试笔试中常见的问题以及注意事项,进行了深层次的分析。本书除了对传统的计算机相关知识(c/c++、数据结构与算法、操作系统、计算机网络与通信、软件工程、数据库、智力题、英语面试等)进行介绍外,还根据当前计算机技术的发展潮流,对面试笔试中常见的海量数据处理进行了详细的分析。同时,为了更具说服力,本书特邀多位it名企面试官现身说法,对面试过程中求职者存在的问题进行了深度剖析,同时本书引入了一批来自于名牌高校、就职于明星企业的职场达人的真实求职案例,通过他们的求职经验与教训,抛砖引玉,将整个求职过程生动形象地展示在读者面前,进而对求职者起到一定的指引作用。本书也对各种类型的it企业的招聘环节进行了庖丁解牛式的分析,帮助求职者能够更加有针对性地 进行求职准备。 本书是一本计算机相关专业毕业生面试笔试的求职用书,同时也适合期望在计算机软硬件行业大显身手的计算机爱好者阅读。 程序员面试笔试宝典 目录 前言 上篇 面试笔试经验技巧篇 第1章 面试官箴言 2 第2章 面试心得交流 9 第3章 企业面试笔试攻略 20 第4章 面试笔试技巧 42 第5章 英文面试攻略 82 第6章 智力题攻略 102 下篇 面试笔试技术攻克篇 第7章 程序设计基础 122 第8章 数据库 240 第9章 网络与通信 254 第10章 操作系统 270 第11章 软件工程 278 第12章 发散思维 289 第13章 数据结构与算法 295 第14章 海量数据处理 390
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值