java基础

文章单纯记录学习,答案不一定正确,大多从网上查阅,有错误望指正



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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容