Java程序员阿里面试题(一)

16 篇文章 0 订阅

1.谈谈final, finally, finalize的区别

final:修饰符(关键字)表示不可修改的,可以用来修饰类,方法,变量。

  • final修饰class表示该class不可以被继承。

  • inal修饰方法表示方法不可以被overrride(重写)。

  • final修饰变量表示变量是不可以修改。

  • 一般来说推荐将本地变量,成员变量,固定的静态变量用final修饰,明确是不可以被修改的。

finally:是Java的异常处理机制中的一部分。finally块的作用就是为了保证无论出现 什么情况,finally块里的代码一定会被执行.一般来说在try-catch-finally 来进行类似关闭 JDBC连接,释放锁等资源的操作。

另外扩展一下:
如果try语句块里有return语句,那么finally还会被执行吗?答案是肯定的。
那么return都已经跳出方法体了,那finally应该是什么时候执行呢?
是在return中间执行。
try里面遇到了return,jvm不会立刻return,它会把return后面的结果存起来,然后执 行finally语句,注意return的是之前存起来的。也就是说如果在finally执行的语句是和return相关的,是不会被改变的。

finalize:是基础类 java.lang.Object 的一个方法,是GC进行垃圾回收前要调用的一个方法,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收.

2.HashMap和Hashtable的区别

Hashtable是java一开始发布时就提供的键值映射的数据结构,而HashMap产生于JDK1.2。虽然Hashtable比HashMap出现的早一些,但是现在Hashtable基本上已经被弃用了。而HashMap已经成为应用最为广泛的一种数据类型了。造成这样的原因一方面是因为Hashtable是线程安全的,但是效率比较低.

  1. 父类不同:
    HashMap是继承自AbstractMap类,而HashTable是继承自Dictionary(已被废弃,详情看源代码)。不过它们都实现了同时实现了map、Cloneable(可复制)、Serializable(可序列化)这三个接口。
    Hashtable比HashMap多提供了elments() 和contains() 两个方法。
    elments() 方法继承自Hashtable的父类Dictionnary。elements() 方法用于返回此Hashtable中的value的枚举。
    contains()方法判断该Hashtable是否包含传入的value。它的作用与containsValue()一致。事实上,contansValue() 就只是调用了一下contains() 方法。

  2. null值
    Hashtable既不支持Null key也不支持Null value。
    HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,可能是 HashMap中没有该键,也可能使该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。

  3. 线程安全性问题
    Hashtable是线程安全的,它的每个方法中都加入了Synchronize方法。在多线程并发的环境下,可以直接使用Hashtable,不需要自己为它的方法实现同步
    HashMap不是线程安全的,在多线程并发的环境下,可能会产生死锁等问题。具体的原因在下一篇文章中会详细进行分析。使用HashMap时就必须要自己增加同步处理,
    虽然HashMap不是线程安全的,但是它的效率会比Hashtable要好很多。这样设计是合理的。在我们的日常使用当中,大部分时间是单线程操作的。HashMap把这部分操作解放出来了。当需要多线程操作的时候可以使用线程安全的ConcurrentHashMap。ConcurrentHashMap虽然也是线程安全的,但是它的效率比Hashtable要高好多倍。因为ConcurrentHashMap使用了分段锁,并不对整个数据进行锁定。
    HashMap是JDk1.2之后有的,而在JDK1.5中,Doug Lea给我们带来了concurrent包,从此Map也有安全的了。也就就是有了ConcurrentHashMap(关于这个的理解下次有机会再写,或自行百度)

  4. 遍历方式不同
    Hashtable、HashMap都使用了Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。
    HashMap的Iterator是fail-fast迭代器。当有其它线程改变了HashMap的结构(增加,删除,修改元素),将会抛出ConcurrentModificationException。不过,通过Iterator的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。
    JDK8之前的版本中,Hashtable是没有fast-fail机制的。在JDK8及以后的版本中 ,Hashtable也是使用fast-fail的。(此处可以去看一下1.5和1.8JDK源码的对比)

  5. 初始容量不同
    Hashtable的初始长度是11,之后每次扩充容量变为之前的2n+1(n为上一次的长度)
    而HashMap的初始长度为16,之后每次扩充变为原来的两倍
    创建时,如果给定了容量初始值,那么Hashtable会直接使用你给定的大小,而HashMap会将其扩充为2的幂次方大小。

  6. 计算哈希值的方法不同
    为了得到元素的位置,首先需要根据元素的 KEY计算出一个hash值,然后再用这个hash值来计算得到最终的位置
    Hashtable直接使用对象的hashCode。hashCode是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值。然后再使用除留余数发来获得最终的位置。 然而除法运算是非常耗费时间的。效率很低
    HashMap为了提高计算效率,将哈希表的大小固定为了2的幂,这样在取模预算时,不需要做除法,只需要做位运算。位运算比除法的效率要高很多。

3.String s = new String(“xyz”);创建了几个String Object?

分为两种情况:
1)如果String常量池中,已经创建"xyz",则不会继续创建,此时只创建了一个对象new String(“xyz”),此时为一个Obeject对象;
2.如果String常量池中,没有创建"xyz",则会创建两个对象,一个对象的值是"xyz",一个对象new String(“xyz”),此时为二个Obeject对象;

4.sleep() 和 wait() 的异同?

相同点:sleep和wait方法都可以使线程冻结,并释放cpu
区别:1.sleep()不会释放锁, wait()会释放锁
2.sleep()可以在任何地方使用,wait()只能在同步代码块中使用.

5.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

1)对于short s1 = 1;s1=s1+1; 来说,在s1+1运算时会自动提升表达式的类型为int,那么将int赋予给short类型的变量s1会出现类型转换错误。
2)对于short s1=1;s1+=1;来说,+=是Java语言规定的运算符,Java会对它进行特殊处理—强制类型转化(short s1 = (short)(s1+1)),因此可以正确编译。

6.Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

方法的重写Override和重载Overload是Java多态性的不同表现。
override是方法覆盖,用在父子类中,是方法名字相同,参数列表也相同,声明形式都相同,但是子类方法的权限不允许小于父类,不允许抛出比父类更多的异常。调用子类的方法与父类的同名方法无关,在子类中完全覆盖了父类的方法。
overload是方法重载,用在同一个类中,是几个方法的名字相同,返回值相同,但是参数列表不同,举例来说就像构造函数,可以有多个构造函数,并且每个的参数列表都不同,这样可以用多种方式构造对象.

7.Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?

Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。
equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

8.error和exception有什么区别?

Exception 和 Error 都是继承了 Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。

Exception 和 Error 体现了 Java 平台设计者对不同异常情况的分类。Exception 是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。

Error 是指在正常情况下,不大可能出现的情况,绝大部分的 Error 都会导致程序(比如 JVM 自身)处于非正常的、不可恢复状态。既然是非正常情况,所以不便于也不需要捕获,常见的比如 OutOfMemoryError 之类,都是 Error 的子类。

Exception 又分为可检查(checked)异常和不检查(unchecked)异常,可检查异常在源代码里必须显式地进行捕获处理,这是编译期检查的一部分。前面我介绍的不可查的 Error,是 Throwable 不是 Exception。

不检查异常就是所谓的运行时异常,类似 NullPointerException、ArrayIndexOutOfBoundsException 之类,通常是可以编码避免的逻辑错误,具体根据需要来判断是否需要捕获,并不会在编译期强制要求。

拓展:
你了解哪些 Error、Exception 或者 RuntimeException?在这里插入图片描述

9.列举五个常见到的runtime exception。

ArithmeticException:算数运行异常
ArrayStoreException,:数据存储异常
BufferUnderflowException,:缓冲区溢出异常
ClassCastException:类型转换异常,
IndexOutOfBoundsException:数组越界异常
NoSuchElementException:线程访问越界
NullPointerException:空指针异常

如果想要更新更全的java面试题可以加企鹅群::①零⑧零③⑤⑤②⑨②
有全套学习资料免费领取,和志同道合的小伙伴一起学习!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值