Java每日经典面试题总结分享

BIO、NIO、AIO 有什么区别?

1)同步阻塞BIO

       一个连接一个线程。

       JDK1.4之前,建立网络连接的时候采用BIO模式,先在启动服务端socket,然后启动客户端socket,对服务端通信,客户端发送请求后,先判断服务端是否有线程响应,如果没有则会一直等待或者遭到拒绝请求,如果有的话会等待请求结束后才继续执行。

(2)同步非阻塞NIO

       NIO主要是想解决BIO的大并发问题,BIO是每一个请求分配一个线程,当请求过多时,每个线程占用一定的内存空间,服务器瘫痪了。

       JDK1.4开始支持NIO,适用于连接数目多且连接比较短的架构,比如聊天服务器,并发局限于应用中。

一个请求一个线程。

(3)异步非阻塞AIO

      一个有效请求一个线程。


throw 和 throws 的区别?

1throw

            作用在方法内,表示抛出具体异常,由方法体内的语句处理;
            一定抛出了异常;

(2throws

           作用在方法的声明上,表示抛出异常,由调用者来进行异常处理;
           可能出现异常,不一定会发生异常;

常见的异常类有哪些?

1.NullPointerException:空指针异常;
2.SQLException:数据库相关的异常;
3.IndexOutOfBoundsException:数组下角标越界异常;
4.FileNotFoundException:打开文件失败时抛出;
5.IOException:当发生某种IO异常时抛出;
6.ClassCastException:当试图将对象强制转换为不是实例的子类时,抛出此异常;
7.NoSuchMethodException:无法找到某一方法时,抛出;
8.ArrayStoreException:试图将错误类型的对象存储到一个对象数组时抛出的异常;
9.NumberFormatException:当试图将字符串转换成数字时,失败了,抛出;
10.IllegalArgumentException 抛出的异常表明向方法传递了一个不合法或不正确的参数。
11.ArithmeticException当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例。 

java 中操作字符串都有哪些类?它们之间有什么区别?

1String

      String是不可变对象,每次对String类型的改变时都会生成一个新的对象。

(2StringBuilder

      线程不安全,效率高,多用于单线程。

(3StringBuffer

    线程安全,由于加锁的原因,效率不如StringBuilder,多用于多线程。

    不频繁的字符串操作使用String,操作频繁的情况不建议使用String

Collection 和 Collections 有什么区别?

1Collection是最基本的集合接口,Collection派生了两个子接口list和set,分别定义了两种不同的存储方式。

(2Collections是一个包装类,它包含各种有关集合操作的静态方法(对集合的搜索、排序、线程安全化等)。


set有哪些实现类?

1HashSet

HashSet是set接口的实现类,set下面最主要的实现类就是HashSet(也就是用的最多的),此外还有LinkedHashSetTreeSetHashSet是无序的、不可重复的。通过对象的hashCode和equals方法保证对象的唯一性。
HashSet内部的存储结构是哈希表,是线程不安全的。

(2TreeSet

TreeSet对元素进行排序的方式:

元素自身具备比较功能,需要实现Comparable接口,并覆盖compareTo方法。
元素自身不具备比较功能,需要实现Comparator接口,并覆盖compare方法。

(3LinkedHashSet

LinkedHashSet是一种有序的Set集合,即其元素的存入和输出的顺序是相同的。

经常点外卖的可以关注一下,公众号,外卖天天香,这个是博主搞的一个外卖红包的公众号,每天都可以领,很划算,还可以拿饿了么红包


HashMap 和 Hashtable 有什么区别?

   1.HashMap是线程不安全的,HashTable是线程安全的;

   2.HashMap中允许键和值为nullHashTable不允许;

   3.HashMap的默认容器是16,为2倍扩容,HashTable默认是11,为2+1扩容;

ArrayList 和 LinkedList 的区别是什么?

ArrayList是动态数组的数据结构实现,查找和遍历的效率较高;

LinkedList 是双向链表的数据结构,增加和删除的效率较高;

什么是反射?

所谓反射,是java在运行时进行自我观察的能力,通过class、constructor、field、method四个方法获取一个类的各个组成部分。

在Java运行时环境中,对任意一个类,可以知道类有哪些属性和方法。这种动态获取类的信息以及动态调用对象的方法的功能来自于反射机制。

什么是 java 序列化?什么情况下需要序列化?

序列化就是一种用来处理对象流的机制。将对象的内容流化,将流化后的对象传输于网络之间。

序列化是通过实现serializable接口,该接口没有需要实现的方法,implement Serializable只是为了标注该对象是可被序列化的,使用一个输出流(FileOutputStream)来构造一个ObjectOutputStream对象,接着使用ObjectOutputStream对象的writeObejct(Object object)方法就可以将参数的obj对象到磁盘,需要恢复的时候使用输入流。

序列化是将对象转换为容易传输的格式的过程。

例如,可以序列化一个对象,然后通过HTTP通过Internet在客户端和服务器之间传输该对象。在另一端,反序列化将从流中心构造成对象。

一般程序在运行时,产生对象,这些对象随着程序的停止而消失,但我们想将某些对象保存下来,这时,我们就可以通过序列化将对象保存在磁盘,需要使用的时候通过反序列化获取到。

对象序列化的最主要目的就是传递和保存对象,保存对象的完整性和可传递性。

譬如通过网络传输或者把一个对象保存成本地一个文件的时候,需要使用序列化。

final、finally、finalize 有什么区别?

final可以修饰类,变量,方法,修饰的类不能被继承,修饰的变量不能重新赋值,修饰的方法不能被重写

finally用于抛异常,finally代码块内语句无论是否发生异常,都会在执行finally,常用于一些流的关闭。

finalize方法用于垃圾回收。

一般情况下不需要我们实现finalize,当对象被回收的时候需要释放一些资源,比如socket链接,在对象初始化时创建,整个生命周期内有效,那么需要实现finalize方法,关闭这个链接。

但是当调用finalize方法后,并不意味着gc会立即回收该对象,所以有可能真正调用的时候,对象又不需要回收了,然后到了真正要回收的时候,因为之前调用过一次,这次又不会调用了,产生问题。所以,不推荐使用finalize方法。

猜你喜欢

转载自blog.csdn.net/m0_47384542/article/details/127379929