八股文系列-- 1000道Java面试题第2套

大家好,我是青空。

最近又赶上跳槽的高峰期,好多粉丝,都问我要有没有最新面试题,能不能做一些分享,和做一些面试题解析的系列文章。

青空收到消息之后,觉得这个建议挺不错的。那我就计划简单及概念性的面试题就多个面试题汇总成一片文章,比较复杂的面试题就单独拎出来讲讲。

文末领取面试大全

1.JDK 动态代理和CGLIB动态代理的区别

JDK动态代理只能对实现了接口的类生成代理,而不能针对类。

CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法。因为是继承, 所以该类 或方法最好不要声明成final。

2.静态代理和动态代理的区别

静态代理中代理类在编译期就已经确定,而动态代理则是JVM运行时动态生成,静态代理的效 率相对动

态代理来说相对高一些,但是静态代理代码冗余大,一单需要修改接口,代理类和委 托类都需要修改。

3.ArrayList和LinkedList有什么区别?

  1. ArrayList和LinkedList的差别主要来自于Array和LinkedList数据结构的不同。 ArrayList是基于数 组实现的,LinkedList是基于双链表实现的。另外LinkedList类不 仅是List接口的实现类,可以根 据索引来随机访问集合中的元素,除此之外, LinkedList还实现了Deque接口,Deque接口是 Queue接口的子接口,它代表一个双向 队列,因此LinkedList可以作为双向队列 ,栈(可以参⻅ Deque提供的接口方法)和 List集合使用,功能强大。
  2. 因为Array是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快 的,可以直 接返回数组中index位置的元素,因此在随机访问集合元素上有较好的性能。 Array获取数据的时 间复杂度是O(1),但是要插入、删除数据却是开销很大的,因为这需 要移动数组中插入位置之后的 的所有元素。
  3. 相对于ArrayList,LinkedList的随机访问集合元素时性能较差,因为需要在双向列表中 找到要 index的位置,再返回;但在插入,删除操作是更快的。因为LinkedList不像 ArrayList一样,不需 要改变数组的大小,也不需要在数组装满的时候要将所有的数据重 新装入一个新的数组,这是 ArrayList最坏的一种情况,时间复杂度是O(n),而 LinkedList中插入或删除的时间复杂度仅为 O(1)。ArrayList在插入数据时还需要更新索 引(除了插入数组的尾部)。
  4. LinkedList需要更多的内存,因为ArrayList的每个索引的位置是实际的数据,而 LinkedList中的每 个节点中存储的是实际的数据和前后节点的位置。

4.重写和重载的区别

重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即 外壳不变,核心重写!

重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现 父类的 方法。

重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。

重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以 不同。 每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。

5.Java 8的接口新增了哪些特性?

增加了default方法和static方法,这2种方法可以有方法体。

6.抽象类和接口(Java7)的区别

  1. 抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
  2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final 类型的;
  3. 接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
  4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

7.为什么要有 hashCode

我们以“HashSet 如何检查重复” 为例子来说明为什么要有 hashCode:

当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位 置,同时也 会与其他已经加入的对象的 hashcode 值作比较,如果没有相符的hashcode, HashSet会假设对象没 有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用 equals()方法来检查 hashcode 相 等的对象是否真的相同。如果两者相同,HashSet 就不会让 其加入操作成功。如果不同的话,就会重新 散列到其他位置。(摘自我的Java启蒙书《Head first java》第二版)。这样我们就大大减少了 equals 的次数,相应就大大提高了执行速度。

hashCode()equals()的相关规定

如果两个对象相等,则hashcode一定也是相同的 两个对象相等,对两个对象分别调用equals方法都返回true 两个对象有相同的hashcode值,它们也不一定是相等的

因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖

hashCode() 的默认行为是对堆上的对象产生独特值。如果没有重写 hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)

对象的相等与指向他们的引用相等,两者有什么不同?

对象的相等 比的是内存中存放的内容是否相等而 引用相等 比较的是他们指向的内存地址是否 相等。

8.hashCode()介绍

hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码 的作用是 确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java中,这就 意味着Java中的任何 类都包含有hashCode()函数。

散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这 其中就利用 到了散列码!(可以快速找到所需要的对象)

9.hashCode 与 equals (重要)

HashSet如何检查重复 两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?

hashCode和equals方法的关系 面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写 equals时必须重写 hashCode方法?”

10.Java中异常分为哪些种类?

按照异常需要处理的时机分为编译时异常(也叫受控异常)也叫 CheckedException 和运行时异 常(也叫非 受控异常)也叫 UnCheckedException。Java认为Checked异常都是可以被处理的 异常,所以Java程序必须显式处理Checked异常。如果程序没有处理Checked 异常,该程序 在编译时就会发生错误无法编译。 这体现了Java 的设计哲学:没有完善错误处理的代码根本没 有机会被执行。对Checked异常处理方法有两种:

  • 第一种:当前方法知道如何处理该异常,则用try…catch块来处理该异常。
  • 第二种:当前方法不知道如何处理,则在定义该方法时声明抛出该异常。 运行时异常只有当代码 在运行时才发行的异常,编译的时候不需要try…catch。Runtime如除 数是0和数组下标越界等, 其产生频繁,处理麻烦,若显示申明或者捕获将会对程序的可读性 和运行效率影响很大。所以由 系统自动检测并将它们交给缺省的异常处理程序。当然如果你有 处理要求也可以显示捕获它们。

参考资料

《Java核心技术卷一》

面试大全包括:包括 Java 集合、JVM、多线程、并发编程、设计模式、SpringBoot、SpringCloud、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、Python、HTML、CSS、Vue、React、JavaScript、Android 大数据、阿里巴巴等大厂面试题等、等技术栈!

领取方式:扫描下方公众号【蚂蚁原图】回复【面试题】即可获取

你可能感兴趣的