Java 面试题总结第一篇

  • 阐述Java7和Java8的区别
    (1)lambda表达式 —Java8引入的一个新特性。lambda表达式允许你将功能当做方法参数或将代码当做数据。lamabda表达式还能让你以更简洁的方式表示只有一个方法的接口(函数式接口)的实例。
    lambda表达式重要特征:
    (2)方法引用 —为已命名方法提供了易阅读的lambda表达式。
    (3)默认方法 —支持将新功能添加到类库中的接口,并确保与基于这些接口的旧版的代码的二进制兼容性。
    (4)重复注解 —支持在同一声明或类型上多次应用同一注解类型。
    (5)类型注解 —支持在任何使用类型的地方应用注解,而不仅限于声明。此特性与可插入型系统一起使用时,可增强对代码的类型检查。

  • 你了解哪些结合类型?
    (1)ArrayList
    (2)LinkedList
    (3)HashMap
    (4)HashSet

  • Object类包含哪些方法?
    在 java.lang 包中,Object类位于类层次结构的最顶端。每个类都是Object类直接或间接的子类。你使用或编写的每个类都继承了Object类中的方法。
    (1)protected Object clone() throws CloneNotSupportedException 创建并返回此对象的副本
    (2)public boolean equals(Object obj)判断两个对象是否相等
    (3)protected void finalize() throws Throwable 当垃圾回收机制确定该对象不再被调用时,垃圾回收器会调用此方法。
    (4)public final Class getClass() 返回此对象的运行时类。
    (5)public int hashCode() 返回此对象的哈希码值。
    (6)public String toString() 返回此对象的字符串表现形式。
    Object 类的 notify,nofityAll 和 wait 方法都在同步程序中独立运行线程的活动方面发挥了作用。其中有五种方法
    (1)public final void notify()
    (2)public final void notifyAll()
    (3)public final void wait()
    (4)public final void wait(long timeout)
    (5)public final void wait(long timeout, int nanos)

  • 为什么String对象是不可变的?
    Java 将 String 设为不可变对象最大的原因是效率和安全。
    (1)String Pool (字符串常量池)的需要
    String Pool 是 java 堆内存中一个特殊的存储区域,当创建一个 String 对象,假如此字符已经存在与常量池中,则不会创建一个新的对象,而是引用已经存在的对象。

String s1 = "ABC";
String s2 = "ABC";
//在java中内存分为堆内存和栈内存,堆内存存放的是对象,栈内存存放的是对象的引用,字符串“ABC”存放在堆内存中,而s1、s2作为对象的引用则存放在栈内存中

(2)运行String对象缓存HashCode
java中String对象的哈希码被频繁的而是用,比如在HashMap的容器中。字符串不变性保证了hash码的唯一性,因此可以放心的进行缓存,这也是一种优化手段,意味着不必每次取都计算新的哈希码,在String类中的定义有如下代码

private int hash;//用来缓存HashCode

(3)安全性
String被许多的Java类(库)用来当做参数,例如 网络连接地址URL,文件路径Path,还有反射机制所需要的String参数等,假若不是固定不变的,将会引起各种安全隐患。

总体来说,String类不可变的原因包括 设计考虑、效率优化问题、安全性 这三大方面
延伸一 :String类不可变的好处?
String是所有语言中最常用的一个类,我们知道在Java中,String是不可变的、final的。Java在运行时也保存了一个字符串池,这使得String成为了一个特别的类。
(1)只有当字符串是不可变的,字符串池才有可能实现。字符串的实现可以在运行时节约很多heap空间,因为不同的字符串变量都指向池中的同一个字符串。但如果字符串是可变的,那么String interning 将不能实现(String interning :对不同的字符串仅保存一个,不会保存多个相同的字符串)。因为这样的话,如果变量改变了它的值,那么其它指向这个变量的值也会跟着改变。
(2)因为字符串是不可变的,所以多线程是安全的,同一个字符串实例可以被多个线程共享。这样便不用因为线程安全问题而使用同步,字符串自己便是线程安全的。
(3)类加载器要用到字符串,不可变性提供了安全性,以便正确的类被加载。譬如你想加载java.sql.Connection类,而这个值被改成了myhacked.Connection,那么会对你的数据库造成不可知的破坏。
(4).因为字符串是不可变的,所以在它创建的时候hashcode就被缓存了,不需要重新计算。这就使得字符串很适合作为Map中的key,字符串的处理速度要快过其它的key对象。这就是HashMap中的key往往都是用字符串。

延伸二 : 既然知道String类型不可变的好处和作用那么大,那么是否就不需要可变类型了呢?

当然不是,当你需要向字符串插入或修改的时候,Sting不可变类型就显得足襟见肘,这时候就需要一个可变的字符串类型:StringBuffer。
StringBuffer与String一样,都代表字符串,但是由于StringBuffer内部实现的方式和String不同,所以StringBuffer在处理字符串的时候
不产生新的对象,在内存使用上要由于String类。

  • final、finally、finalize三者之间的区别
    (1)final 关键字用于在多个语境下定义只能分配一次的实体。
    (2)finally 是用于执行重要的代码(关闭连接、IO流)的代码块,无论是否处理异常,finally 代码块总会被执行。finally 代码块紧随 try catch 代码块。
    (3)finalize 是方法名,java允许使用finalize()方法在垃圾收集器将对象从内存中清除之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没被引用时对这个对象调用的,它是在object类中定义的,因此所有的类都继承了它,子类覆盖finalize方法以整理系统资源或者被执行其它清理工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值