最近面试了几家公司,被问及了一些java基础知识,通过这篇文章将面试中问及的基础以及自己整理的一些基础知识整理下,方便自己巩固和准备面试的同学查看。祝大家心想事成。
1:String、StringBuffer、StringBuilder的区别
1)String对象是不可变的,因为String类中是用finalxius修饰的,而StringBuffer、StringBuilder都继承AbstractStringBuilder,这两个do都是可变的。
2)StringBuffer对方法加了同步锁机制,所以是线程安全的,而StringBuilder没有su锁机制,所以不是线程安全的。从性能角度说StringBuilder比StringBuffer快。
2:==和equals的区别(老生常谈的问题)
== 它的作用是判断两个对象的地址是否相等即判断两个对象是不是同一个对象。(基本数据类型比较的值,引用数据类型比较的是内存地址。);equals比两个对象是否相等,不过有两种方式(:a:类没有覆盖equals()方法,则通过equals()方法对比,作用等同于“==”;b:类覆盖了equals()方法,我们都覆盖 equals() 方法来两个对象的内容相等;若它们的内容相等,则返回 true 。
3:Object类的常见方法总结
1)getClass():native方法,用于返回当前运行时对象的Class对象,使用了final关键字修饰,故不允许子类重写。
2)hashCode():用于返回对象的哈希码,主要使用在哈希表中
3)equals(Object obj):用于比较2个对象的内存地址是否相等,String类对该方法进行于重写用于比较字符串的值是否相等。
4)clone():用于创建并返回当前对象的一份拷贝
5)toString()
6)notify():唤醒一个在此对象监视器上等待的线程(监视器相当于就是锁的概念)。如果有多个线程在等待只会任意唤醒一个。
7)wait():暂停线程的执行。注意:sleep方法没有释放锁,而wait方法释放了锁
其中Objet类中还有别的方法,这里就不一一列举了。
4:HashMap的底层实现(重点)
JDK1.8 之前 HashMap 底层是 数组和链表 结合在一起使用也就是 链表散列。HashMap 通过 key 的 hashCode 经
过扰动函数处理过后得到 hash 值,然后通过 (n - 1) & hash 判断当前元素存放的位置(这里的 n 指的是数组的
长度),如果当前位置存在元素的话,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果相同的
话,直接覆盖,不相同就通过拉链法解决冲突。JDK1.8之后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间
PS:这方便一两句也将不清楚,建议大家可以看下源码
5:比较下Arraylist 与 LinkedList
1) Arraylist 底层使用的是Object数组;LinkedList 底层使用的是双向链表数据结构(JDK1.6之前为循环链表,JDK1.7取消了循环。注意双向链表和双向循环链表的区别
2) ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。 比如:执行 add(E e) 方法的时候, ArrayList 会默认在将指定的元素追加到此列表的末尾,这种情况时间复杂度就是O(1)。但是如果要在指定位置 i 插入和删除元素的话( add(int index, E element) )时间复杂度就为 O(n-i)。 LinkedList 采用链表存储,所以插入,删除元素时间复杂度不受元素位置的影响,都是近似 O(1)而数组为近似 O(n)。
6 HashMap 和 Hashtable 的区别
1)HashMap 是非线程安全的,HashTable 是线程安全的;HashTable 内部的方法基本都经过synchronized 修饰。
2)HashMap 中,null 可以作为键,这样的键只有一个,可以有一个或多个键所对应的值为 null。。但是在 HashTable 中 put 进的键值只要有一个 null,直接抛出 NullPointerException。
时间有限,先讲这些,后续会持续更新。