java面试高频知识点,java基础常见面试题
如何解决写爬虫IP受阻的问题?立即使用。
面试问题如下:
1.a.hashCode()有什么用?与a.equals(b)有什么关系?
(更多相关面试问题推荐:java面试问答)
HashCode()方法对应于对象整数的哈希值。常用于基于hhashh的集合类,如Hashtable、HashMap、LinkedHashMap等。它与equals()方法关系特别密切。根据Java规范,使用equal()方法判断相等的两个对象必须具有相同的哈希代码。
2.字节流和字符流的区别
要把一段二进制数据逐个输出到某个设备上,或者从某个设备上逐个读取一段二进制数据,不管输入输出设备是什么,我们都要统一完成这些操作,用抽象的方式来描述。这种抽象描述方法被命名为IO stream,对应的抽象类是OutputStream和InputStream。不同的实现类代表不同的输入和输出设备,它们都是对字节进行操作的。
计算机中的一切最终都是以二进制字节的形式存在的。对于常用的汉字,先获取其对应的字节,然后将字节写入输出流。在读取时,我们首先读取的是字节,但要将其显示为字符,我们需要将字节转换为字符。因为需求广泛,Java专门提供了字符流包装器类。
底层设备总是只接受字节数据。有时,要将字符串写入底层设备,需要在写入前将字符串转换为字节。字符流是字节流的包装器,而字符流直接接受字符串。它在内部将字符串转换成字节,然后写入底层设备,为我们向IO设备写入或读取字符串提供了一点便利。
在将字符转换为字节时,要注意编码的问题,因为字符串转换为字节数组实际上是字符的编码字节形式,读取也是相反的。
3.什么是java序列化,如何实现?或者请解释一下Serializable接口的作用。
有时候我们把一个java对象变成一个字节流发送出去或者从字节流中恢复出来。比如把一个java对象存储在硬盘上或者发送到网络上的其他计算机上,我们可以自己编写代码把一个java对象变成某种格式的字节流然后传输。
然而,jre本身提供了这种支持。我们可以调用OutputStream的writeObject方法来实现。如果我们希望java为我们做这件事,那么要传输的对象必须实现serializable接口。这样,javac编译时会进行特殊处理,编译后的类可以用writeObject方法操作。这就是所谓的序列化。要序列化的类必须实现Serializable接口,Serializable接口是一个迷你接口,里面没有要实现的方法。实现Serializable只是为了标记对象可以序列化。
比如在web开发中,如果对象保存在Session中,tomcat重启时会将Session对象序列化到硬盘中,这个对象必须实现Serializable接口。如果要通过分布式系统传输对象,则传输的对象必须实现Serializable接口。
4.描述一下JVM加载类文件的原理和机制?
JVM中类的加载是通过ClassLoader及其子类来实现的。Java类加载器是Java运行时系统的重要组成部分。它负责在运行时查找和加载类文件的类。
(相关教程推荐:java入门教程)
5.堆和栈有什么区别?
Java的内存分为两种,一种是堆栈内存,一种是堆内存。堆栈内存是指当程序进入一个方法时,它会为该方法分配一个私有的存储空间,用来存储方法内部的局部变量。当方法结束时,分配给该方法的堆栈将被释放,堆栈中的变量也将被释放。
Heap是一种与stack功能不同的内存,一般用来存储不在当前方法栈中的数据。例如,所有用new创建的对象都放在堆中,所以它不会随着方法的结束而消失。方法中的局部变量用final修饰,并放在堆中而不是堆栈中。
6.什么是GC?为什么会有GC?
GC的意思是Gabage集合。内存处理是程序员容易出问题的地方。遗忘或错误的内存收集会导致程序或系统的不稳定甚至崩溃。Java提供的GC函数可以自动监控对象是否超出范围,从而达到自动回收内存的目的。Java语言没有提供释放分配内存的显示操作方法。
7.垃圾收集的优势和原则。并考虑两种恢复机制。
Java语言的一个显著特点是引入了垃圾收集机制,解决了C程序员最头疼的内存管理问题。它使得Java程序员在编写程序时不再需要考虑内存管理。由于垃圾收集机制,Java中的对象不再有‘作用域’的概念,只有对象的引用才有‘作用域’。
垃圾回收可以有效防止内存泄漏,有效利用可用内存。垃圾收集器通常作为一个独立的低级线程运行,它在不可预知的情况下清理和回收内存堆中的死对象或长期未使用的对象。程序员无法实时调用垃圾收集器来对部分或全部对象进行垃圾收集。
回收机制包括逐代复制垃圾回收、标记垃圾回收和增量垃圾回收。
8.垃圾收集器的基本原理是什么?垃圾收集器可以立即回收内存吗?有什么办法可以主动通知虚拟机进行垃圾回收?
对于GC,当程序员创建一个对象时,GC就开始监控对象的地址、大小和使用情况。通常,GC通过有向图的方式记录和管理堆中的所有对象。这样,我们就可以确定哪些对象是‘可达’的,哪些对象是‘不可达’的。当GC确定某些对象“不可达”时,GC有责任回收这些内存空间。
程序员可以手动执行System.gc()来通知gc运行,但是Java语言规范并不能保证GC一定会被执行。
9.Java中throw和throws有什么区别?
Throw用于抛出java.lang.Throwable类的实例化对象,这意味着可以通过关键字throw抛出异常,比如:
抛出新的IllegalArgumentException(" XXXXXXXXX ")
Throws用作方法声明和签名的一部分,该方法与相应的异常一起被抛出,以便调用方可以处理它。在Java中,任何未处理的检查异常都必须在throws子句中声明。
(视频教程推荐:java课程)
10.java会出现内存泄漏吗?请简单描述一下。
先解释一下什么是内存泄漏:所谓内存泄漏,就是一个程序不再使用的对象或变量已经被占用在内存中。java中有一个垃圾收集机制,可以保证当对象不再被引用时,对象会被垃圾收集器自动从内存中清除。
因为Java使用有向图进行垃圾收集管理,所以可以消除引用循环的问题。比如有两个相互引用的对象,只要是根进程无法到达的,GC也可以回收。
java中的内存泄漏:当长寿命对象持有对短寿命对象的引用时,很可能会发生内存泄漏。虽然不再需要短寿命对象,但它不能被回收,因为长寿命对象持有它的引用。这是java中内存泄漏的场景。通俗地说,一个程序员可能创建了一个对象,就再也不用了,但是这个对象总是被引用的。也就是说,这个对象是无用的,但不能被垃圾收集器回收。这就是java中可能出现内存泄漏的情况。例如,在缓存系统中,我们加载了一个对象并将其放在缓存中(例如,放在一个全局地图对象中),然后我们就再也没有使用过它。该对象已被缓存引用,但不再使用。以上是java高频基础面试题—— (3)的详细内容。请多关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。