Java面试常考问题
-
重载和重写
重载是发生在一个类中 方法名相同 但是参数不同(包括参数类型不同 或者个数不同 或者顺序不同 或者返回值不同 或者访问修饰符不同)
重写发生在有继承关系的父子类中 方法名 参数列表必须相同。返回值的范围和抛出异常的范围均应该小于等于父类。如果父类方法访问修饰符为private则子类就不能重写该方法 -
String, StringBuffer, StringBuilder的区别是什么?
可变性:String不可变但是StringBuilder和StringBuffer均可变。因为String类中用final关键字字符数组保存字符串,而sb和sbuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中用于保存字符数组的char[] value没有用final修饰 因此是可变的
线程安全性:String线程安全 StringBuilder线程不安全 StringBuffer线程安全。因为String对象是不可变的 因此线程安全。AbstractStringBuilder定义了一些字符串的基本操作 比如说append insert indexOf, StringBuffer对这些方法加了同步锁因此线程安全 而StringBuilder没加
性能:String<StringBuffer<StringBuilder String性能最差 因为他每次进行改变时 都要生成一个新的String对象 而另外两个可以直接对本身进行操作。但是StringBuilder仅比StringBuffer提升10%
应用场景:操作少量数据 String。单线程操作大量数据StringBuilder 多线程操作大量数据StringBuffer -
自动装箱与拆箱
自动装箱:int->Integer
拆箱:Integer->int -
== 与equals()
== 用于判断对象地址是否相同 -
final关键字
final关键字主要用在三个地方:变量、方法、类。
对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升(现在的Java版本已经不需要使用final方法进行这些优化了)。类中所有的private方法都隐式地指定为final。
当用final修饰一个类时,表明这个类不能被继承。final类中的所有成员方法都会被隐式地指定为final方法。 -
ArrayList和LinkedList相似及区别
两者的相同点存在于两者均不是线程安全的
除此之外 均为不同点:
ArrayList底层为Object数组 LinkedList使用双向链表
LinkedList插入删除均不受元素位置影响 而对于ArrayList,如果插入和删除只是尾部的话 只是O(1),但是若是插入指定位置 或者删除指定元素 则复杂度会高一些
ArrayList对内存空间有浪费 体现在list列表结尾会预留一些空间 而LinkedList则是体现在其每一个元素都要消耗比arrayList更多的空间(因为要存指针) -
ArrayList与Vector的区别:
Vector所有方法都是同步的 线程安全 ArrayList则相反 -
HashMap深入理解
HashMap源码解决冲突的方法使用了拉链法 JDK1.8之后 当链长度大于8的时候 链会转化成红黑树。这是因为我们由于要对链表进行快速检索,红黑树这种自平衡树保证了查找的效率。
HashMap和HashTable的区别:
HashTable线程安全 HashMap线程不安全(concurrenthashmap可以保证线程安全)
HashTable效率较低
HashTable不能加入null作为键 而HashMap可以存在(只能存在)一个这种键
HashTable 默认容量为11 扩容为2n+1 如果给定了容量初始值 那么hashTable会扩张成给定的大小 而HashMap默认容量为16 扩容为2n 给定初始值会扩张成大于此值的最小2的幂大小(为什么?详见后面)
HashTable底层实现没有红黑树一说
为什么hashMap容量总是2^n?
首先我们知道 hash的范围就是int的范围 为40亿空间 但是实际上内存中是放不下这么多的,所以我们要对数组的长度进行取模。
既然取模 我们想到的一定是hash%length 但是我们想 如果能用位运算 岂不是更快?而hash%length == hash&(length - 1) 但是这种前提是length是2^n.因此我们采取空间换时间 虽然length被定死了 但是时间大大加快。

浙公网安备 33010602011771号