一、Java 基础篇
\1. Object 有哪些常用方法?大致说一下每个方法的含义
getClass()获得运行时当前类的类型
toString() 将当前对象信息以字符串形式输出
equals() 比对字符串是否相同 在Object中,equals和==是一样的。
hashCode() 方法用于返回字符串的哈希码。
wait() 阻塞当前线程,在其他对象调用此对象的notify()时进行唤醒
\2. Java 创建对象有几种方式?
new
反射
实现Cloneable接口,重写clone方法
\3. 获取一个类对象的方式有哪些?
方法 1:类型.class,例如:String.class
方法 2:对象.getClass(),例如:”hello”.getClass()
方法 3:Class.forName(),例如:Class.forName(“java.lang.String”)
\4. ArrayList 和 LinkedList 的区别有哪些?
ArrayList查询速度快:因为ArrayList底层是一个数组,查找的时候可以很快的锁定元素的位置,增删却也需要找到对应位置
LinkedList增删速度快,因为底层是一个链表,每次查询需要一个个遍历
\5. 用过 ArrayList 吗?说一下它有什么特点?
优点:
1、根据下标遍历元素效率较高。
2、根据下标访问元素效率较高。
3、在数组的基础上封装了对元素操作的方法。
4、可以自动扩容。
缺点:
1、插入和删除的效率比较低。
2、根据内容查找元素的效率较低。
扩容规则:每次扩容现有容量的50%。
\6. 有数组了为什么还要搞个 ArrayList 呢?
个人理解:因为数组是定长的,ArrayList很好地解决了这个问题, 而且ArrayList还提供了诸如sort sublist的方法
\7. 说说什么是 fail-fast?
这是一种理念,fail-fast就是在做系统设计的时候先考虑异常情况,一旦发生异常,直接停止并上报。
比如做一个除法运算,一旦出现除数是0的情况,直接抛出异常,而不是继续运行可能存在异常的程序
\8. Hashtable 与 HashMap 的区别
1、继承的父类不同
Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。
2、线程安全性不同
Hashtable 中的方法是Synchronize的,而HashMap中的方法在缺省情况下是非Synchronize的。在多线程并发的环境下,可以直接使用Hashtable,不需要自己为它的方法实现同步,但使用HashMap时就必须要自己增加同步处理。
3、是否提供contains方法
HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey,因为contains方法容易让人引起误解。Hashtable则保留了contains,containsValue和containsKey三个方法,其中contains和containsValue功能相同。
4、key和value是否允许null值
Hashtable中,key和value都不允许出现null值。但是如果在Hashtable中有类似put(null,null)的操作,编译同样可以通过,因为key和value都是Object类型,但运行时会抛出NullPointerException异常,这是JDK的规范规定的。
HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。
5、两个遍历方式的内部实现上不同
6、hash值不同
7、内部实现使用的数组初始化和扩容方式不同
HashTable中hash数组默认大小是11,增加的方式是 old*2+1。
\9. HashMap 中的 key 我们可以使用任何类作为 key 吗?
HashMap中的key可以是null,基本数据类型或引用数据类型。为了HashMap的正常使用,key一般是不可变对象,至少该对象中用于计算hash值的属性要不可变,方可保证HashMap的正常使用。
\10. HashMap 的长度为什么是 2 的 N 次方呢?
因为hashmap的扩容机制是导致
\11. HashMap 与 ConcurrentHashMap 的异同
线程不安全与安全:concurrentHashmap引入了分段锁的概念,将map分成了很多hashtable,通过把整个Map分为N个Segment(类似HashTable),可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。
\13. 红黑树有哪几个特征?
*性质**1.* *节点是红色或黑色***
*性质**2.* *根是黑色***
*性质**3.* *所有叶子都是黑色(叶子是**NIL**节点)***
*性质**4.* *如果一个节点是红的,则它的两个儿子都是黑的***
*性质**5.* *从任一节点到其叶子的所有简单路径都包含相同数目的黑色节点。***
\14. 说说你平时是怎么处理 Java 异常的
try catch
\15. finally 模块执行了吗?是先执行 return 还是先执行 finally 模块?返回什么?
至少有两种情况下finally语句是不会被执行的:
(1)try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到。
(2)在try块中有System.exit(0);这样的语句,System.exit(0);是终止Java虚拟机JVM的,连JVM都停止了,所有都结束了,当然finally语句也不会被执行到。
会先执行try块中的return语句,执行完finaly块之后再返回值
finally块中的return语句会覆盖try块中的return返回
如果finally语句中没有return语句覆盖返回值,那么原来的返回值可能因为finally里的修改而改变也可能不变。
try块里的return语句在异常的情况下不会被执行,这样具体返回哪个看情况。
最后总结:finally块的语句在try或catch中的return语句执行之后返回之前执行且finally里的修改语句可能影响也可能不影响try或catch中 return已经确定的返回值,若finally里也有return语句则覆盖try或catch中的return语句直接返回。
补充1 为什么java需要序列化
序列化:将对象转化为二进制byte流的过程
反序列化:将二进制byte流转换为对象的过程
一、防止重复存储 二、当你想要在网络上传输对象的时候,需要将对象先转化为byte流序列,当传输过去的时候再反序列化成对象。
补充2 :contains方法
String类型有一个方法:contains(),该方法是判断字符串中是否有子字符串。如果有则返回true,如果没有则返回false。
补充3: exception和error
首先Exception和Error都是继承于Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。
Exception和Error体现了JAVA这门语言对于异常处理的两种方式。
Exception是java程序运行中可预料的异常情况,咱们可以获取到这种异常,并且对这种异常进行业务外的处理。
Error是java程序运行中不可预料的异常情况,这种异常发生以后,会直接导致JVM不可处理或者不可恢复的情况。所以这种异常不可能抓取到,比如OutOfMemoryError、NoClassDefFoundError等。