文章单纯记录学习,答案不一定正确,大多从网上查阅,有错误望指正
1、 String、StringBuffer 和 StringBuilder 的区别是什么?
String是一个只读字符串,并不是基本数据类型,而是一个对象,从底层源码可知识一个final类型的字符数组。即定义后就不能再修改,每次对String的操作都会生成新的String对象。
String + 操作:底层是重新new 一个Stringbuilder对象,再调用append方法拼接,最后toString()返回。
Stringbuffer和StringBuilder十分相似,都是可变的字符数组,但是StringBuffer是线程安全的,因为其方法上加了同步锁;StringBuilder是非线程安全的,但执行效率较快。
2、 final、finally、finalize三个关键字的区别?
(1) final是修饰符,可以修饰类、变量、方法,修饰类表示该类不能被继承,修饰方法表示该方法不能被重写,修饰变量表示该变量是一个常量不能被重新赋值。
(2) finally一般作用在try-catch代码块中,在处理异常的时候,通常我们将一定要执行的代码方法finally代码块中,表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。
(3) finalize是一个方法,属于Object类的一个方法,而Object类是所有类的父类,该方法一般由垃圾回收器来调用,当我们调用System的gc()方法的时候,由垃圾回收器调用finalize()回收垃圾。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的,在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。
3、 深拷贝和浅拷贝
浅拷贝是在拷贝对象的时候,对基本数据类型进行了拷贝,而对引用数据类型只是进行了引用的传递,并没有真实的创建一个新的对象。
深拷贝是在对引用数据类型进行拷贝的时候,创建了一个新的对象,并且复制其内的成员变量。
实则浅拷贝和深拷贝只是相对的,如果一个对象内部只有基本数据类型,那用 clone() 方法获取到的就是这个对象的深拷贝,而如果其内部还有引用数据类型,那用 clone() 方法就是一次浅拷贝的操作。若对内部的引用数据类型也进行一次clone(),那就是一次深拷贝。
4、 NIO和IO
4.1、两者的区别
(1) 最大的区别就是IO是面向流的,而NIO是面向缓冲区的。
Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。 Java NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数据。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据。
(2) IO是阻塞与NIO是非阻塞IO
Java IO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。 Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。 非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。 线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)
4.2、 通道以及缓冲区
(1) 通道是对原IO包中的流的模拟。到任何目的地或来自任何地方的所有数据都必须通过一个Channel对象。
(2) Buffer实质上是一个容器对象。发送给一个通道的所有对象都必须先放到缓冲区中;同样,从通道中读取任何数据都要先读到缓冲区中。Channel是一个对象,可以通过它读取和写入数据。
(3) Buffer是一个数组。通常它是一个字节数组,但不一定。缓冲区提供了对数据的结构化方法访问,而且还可以跟踪系统的读、写进程。
4.3、Java NIO的通道与流区别
• 既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。
• 通道可以异步地读写。
• 通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。
4.4、Channel的实现
这些是Java NIO中最重要的通道的实现:
FileChannel:从文件中读写数据。
DatagramChannel:能通过UDP读写网络中的数据。
SocketChannel:能通过TCP读写网络中的数据。
ServerSocketChannel:可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel。
参考文章:https://blog.csdn.net/huangwenyi1010/article/details/75577091
5、异常错误体系结构?
Error和Exception都是Throwable的子类,分别表示错误和异常。异常又可以分为运行时异常和非运行时异常。
Error是程序无法处理的错误,比如OutOFMenmoryError、ThreadDeath等,发送错误时,java虚拟机一般会选择线程终止。
Exception是程序本身可以处理的异常,程序应该从逻辑角度尽可能避免这类异常的发送。可以将异常分为运行时异常(RuntimeException)和非运行时异常。运行时异常是不检查的,可以选择处理与不处理;非运行时异常是检查的,如果不处理,程序就不能编译通过。
异常可以通过try,catch,finally,throw,throws处理。
异常能处理就处理,不能处理再抛出给JVM处理。异常之间可以进行转译,从一种异常转化成另外一种异常,通常转化为RuntimeException,使代码更加简洁。
6、泛型
(1)泛型擦除是将泛型类型以其父类代替。泛型只在编译器实现,而虚拟机并不认识泛型,所以要在虚拟机中将泛型类型进行擦除。即在编译阶段前使用泛型进行检查,编译时取消泛型(擦除)。
参考文章:https://www.cnblogs.com/wuqinglong/p/9456193.html