Java面试题

百亿计算器的设计思路

本题考察:

  • 计算机原理的底层细节
  • 加减法的位运算原理和计算机中的算术运算会发生越界的情况
  • 面向对象的设计思想

设计思路:

要实现一个百亿计算器,需要设计一个类可以用于表示很大的整数,并且提供与另外一个整数进行加减乘除的功能
① 类内部有两个成员变量,一个表示符号,另一个用字节数组表示数值的二进制数
② 有一个构造方法,把一个包含有多位数值的字符串转换到内部的符号和字节数组中
③ 提供加减乘除的功能

例如:

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)

{

}

}

2Java中会存在内存泄漏吗,请简单描述。
所谓内存泄露就是指一个不再被程序使用的对象或变量一直被占据在内存中。Java中有垃圾回收机制,它可以保证当对象不再被引用的时候,将自动被垃圾回收器从内存中清除。由于Java 使用有向图的方式进行垃圾回收管理,可以消除引用循环的问题。例如有两个对象,相互引用,只要它们和根进程不可达的,那么GC也是可以将其回收的。

 

Java中的内存泄漏的情况:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周 期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景,通俗地说,就是程序员可能创建了一个对象,以后却不再使用,那么,这个对象就是无用但是却无法被垃圾回收器回收的,这就是java中可能出现内存泄露的情况。例如,缓存系统,我们加载了一个对象放在缓存中 (例如放在一个全局map对象中),然后一直不再使用它,这个对象一直被缓存引用,但却不再被使用。
检查java中的内存泄露,一定要让程序将各种分支情况都完整执行到程序结束,然后看某个对象是否被使用过,如果没有,则才能判定这个对象属于内存泄露。

如果一个外部类的实例对象的方法返回了一个内部类的实例对象,这个内部类对象被长期引用了,即使那个外部类实例对象不再被使用,但由于内部类持久外部类的实例对象,这个外部类对象将不会被垃圾回收,这也会造成内存泄露。
内存泄漏的另外一种情况:当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了,否则,对象修改后的哈希值与最初存储进HashSet集合中时的哈希值就不同了,在这种情况下,即使在contains方法使用该对象的当前引用作为的参数去HashSet集 合中检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet集合中单独删除当前对象,造成内存泄漏。

3、举例说明什么情况下会更倾向于使用抽象类而不是接口?

接口和抽象类都遵循”面向接口而不是实现编码”设计原则,它可以增加代码的灵活性,可以适应不断变化的需求。

  • 在 Java 中,只能继承一个类,但可以实现多个接口。所以一旦继承了一个类,就失去了继承其他类的机会了。
  • 接口通常被用来表示附属描述或行为如:Runnable、Clonable、Serializable等等,因此当使用抽象类来表示行为时,你的类就不能同时是Runnable和Clonable(注:这里的意思是指如果把Runnable等实现为抽象类的情况),因为在 Java 中不能继承两个类,但当使用接口时,类就可以同时拥有多个不同的行为。
  • 在一些对时间要求比较高的应用中,倾向于使用抽象类,它会比接口稍快一点。
  • 如果希望把一系列行为都规范在类继承层次内,并且可以更好地在同一个地方进行编码,那么抽象类是一个更好的选择。有时,接口和抽象类可以一起使用,接口中定义函数,而在抽象类中定义默认的实现。
点赞

发表回复

电子邮件地址不会被公开。必填项已用 * 标注