Java面试题目系列四

     Java语言不仅是一种编程语言,还是一种开发环境,又还是一种部署环境。既然如此,涉及到Java的职位也很多。不管是传统的Java开发工程师,还是新兴的Android开发工程师,又或许是Java系统工程师或Android系统工程师,都需要熟悉掌握和应用Java。

      在寻找与Java相关的工作中,自然离不开Java的面试题目。继前三个系列Java面试题目后,现推出Java面试题目系列四。

      1.请设计一个一百亿的计算器?

      答:首先要明白这道题目的考查点是什么,一是大家首先要对计算机原理的底层细节要清楚、要知道加减法的位运算原理和知道计算机中的算术运算会发生越界的情况,二是要具备一定的面向对象的设计思想。

     首先,计算机中用固定数量的几个字节来存储的数值,所以计算机中能够表示的数值是有一定的范围的,为了便于讲解和理解,我们先以byte类型的整数为例,它用1个字节进行存储,表示的最大数值范围为-128+127-1在内存中对应的二进制数据为11111111,如果两个-1相加,不考虑Java运算时的类型提升,运算后会产生进位,二进制结果为1,11111110,由于进位后超过了byte类型的存储空间,所以进位部分被舍弃,即最终的结果为11111110,也就是-2,这正好利用溢位的方式实现了负数的运算。-128在内存中对应的二进制数据为10000000,如果两个-128相加,不考虑Java运算时的类型提升,运算后会产生进位,二进制结果为1,00000000,由于进位后超过了byte类型的存储空间,所以进位部分被舍弃,即最终的结果为00000000,也就是0,这样的结果显然不是我们期望的,这说明计算机中的算术运算是会发生越界情况的,两个数值的运算结果不能超过计算机中的该类型的数值范围。由于Java中涉及表达式运算时的类型自动提升,我们无法用byte类型来做演示这种问题和现象的实验,大家可以用下面一个使用整数做实验的例子程序体验一下:

           int a = Integer.MAX_VALUE;

           int b = Integer.MAX_VALUE;

           int sum = a + b;

           System.out.println(“a=”+a+”,b=”+b+”,sum=”+sum);

      先不考虑long类型,由于int的正数范围为231次方,表示的最大数值约等于2*1000*1000*1000,也就是20亿的大小,所以,要实现一个一百亿的计算器,我们得自己设计一个类可以用于表示很大的整数,并且提供了与另外一个整数进行加减乘除的功能,大概功能如下:1)这个类内部有两个成员变量,一个表示符号,另一个用字节数组表示数值的二进制数;2)有一个构造方法,把一个包含有多位数值的字符串转换到内部的符号和字节数组中;3)提供加减乘除的功能。代码框架如下:

public class BigInteger{

           int sign;

           byte[] val;

           public Biginteger(String val)  {

                    sign = ;

                    val = ;

           }

           public BigInteger add(BigInteger other)   {

                    

           }

           public BigInteger subtract(BigInteger other)     {

                    

           }

           public BigInteger multiply(BigInteger other){

                    

           }

           public BigInteger divide(BigInteger other){

                    

           }

}

备注:要想写出这个类的完整代码,是非常复杂的,如果有兴趣的话,可以参看jdk中自带的java.math.BigInteger类的源码。面试的人也知道谁都不可能在短时间内写出这个类的完整代码的,他要的是你是否有这方面的概念和意识,他最重要的还是考查你的能力,所以,你不要因为自己无法写出完整的最终结果就放弃答这道题,你要做的就是你比别人写得多,证明你比别人强,你有这方面的思想意识就可以了,毕竟别人可能连题目的意思都看不懂,什么都没写,你要敢于答这道题,即使只答了一部分,那也与那些什么都不懂的人区别出来,拉开了距离,算是矮子中的高个,机会当然就属于你了。另外,答案中的框架代码也很重要,体现了一些面向对象设计的功底,特别是其中的方法命名很专业,用的英文单词很精准,这也是能力、经验、专业性、英语水平等多个方面的体现,会给人留下很好的印象,在编程能力和其他方面条件差不多的情况下,英语好除了可以使你获得更多机会外,薪水可以高出一千元。

        2.使用final关键字修饰一个变量时,是引用不能变,还是引用所指向的对象不能变?

        答:使用final关键字修饰一个变量时,是引用变量不能变,而引用所指向的对象的内容是可以改变的。例如,对于如下语句:     

final StringBuffer str = new StringBuffer("Hello");   若执行如下语句将报告编译错误: str = new StringBuffer("");但是,若执行如下语句则可以通过编译:

str.append("World!");由此观之,使用fianl关键字修饰一个变量时,是引用变量不能发生变化,而引用变量所指向的对象中的内容是可以改变的。

       3.构造器Constructor是否可被重写override?

      答:不可以,因为构造器不能被继承,所以无法重写。但是,构造器可以被重载overload。

       4.接口是否可以继承接口,抽象类是否可实现接口,抽象类是否可继承具体的类,抽象类中是否可以有静态的main方法?

      答。都可以。说明:抽象类和普通类的区别就是不能创建实例对象和允许有抽象方法。

      5.写clone()方式时,通常都有一行代码,是什么?

      答:super.clone()。因为首先要把父类中的成员复制到位,然后才是复制自己的成员。

      6.抽象的方法是否可以同时是static,或者是native,又或者是synchronized?

      答:抽象的方法都不能同时是static,或者是native,又或者是synchronized。因为抽象的方法是需要子类实现的,而static与子类毫无关系,native方法依赖另一种平台的编程语言实现,不存在被子类实现的问题,synchronized应该要作用于一种具体的方法上才起作用。

      7.String是基本的数据类型吗?

      答:Java语言中基本数据类型包括byte,int,short,long,float,double,char和boolean。String不是基本的数据类型,java.lang.String是fianl类型,因此不可以继承这个类、也不能修改这个类。为了提高效率节省空间,时常需要使用StringBuffer类。

     8.error和exception有什么区别?

     答:error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值