Java面试题(理解性记忆)

jdk和jre区别和联系

       jre: java的运行环境,包括的自然是能够运行一个Java程序,比如hello world需要用到jvm虚拟机,需要类加载器,还有运行所用的类库和java的实用程序

jdk: JDK是Java语言的软件开发工具包,它包含了JRE以及用于编译、调试Java应用程序所需的工具。这包括javac编译器,用于将源代码编译成字节码,以及java运行时,用于运行编译后的字节码。

1.要理解Java运行"Hello, World!"程序时JDK如何工作,我们需要了解整个过程的步骤。这里是一个简化的概述:
编写程序:首先,您需要编写一个名为HelloWorld.java的Java源文件,内容如下:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

 2.编译程序:接着,您会使用JDK中的javac编译器来编译这个源文件。javac将源代码转换成字节码,生成一个名为HelloWorld.class的编译后的类文件。

javac HelloWorld.java

3.运行程序:然后,您使用java运行时工具来执行编译后的类文件。java工具将类文件加载到JVM中,并执行main方法。

java HelloWorld

4.在这个过程中,JDK的各个部分是如何工作的:
javac:这是Java编译器,它读取源代码文件(.java),检查语法错误,并生成对应的字节码文件(.class)。编译过程还涉及到符号表的生成、类型检查和代码优化。
java:这是Java运行时工具,它负责执行编译后的字节码。当您运行java HelloWorld时,它会启动JVM,加载HelloWorld.class文件,并执行其中的main方法。
JVM (Java Virtual Machine):JVM是JDK的一个核心部分,它负责加载和执行字节码。当您运行java命令时,JVM会创建一个运行时环境,将字节码加载到这个环境中,并执行。
类加载器 (Class Loader):JVM包含一个类加载器,它负责将编译后的类文件加载到JVM中。
字节码 verifier:在类加载过程中,JVM会使用字节码校验器来确保加载的字节码是有效和安全的。
运行时环境:JVM提供了运行时环境,包括执行线程、内存管理、安全性管理等功能。
标准库 (Standard Library):JDK提供的标准库(也称为Java API)是一组预编译的类和接口,供Java应用程序使用。在执行main方法时,JVM会调用这些库中的方法,如System.out.println。
总结来说,当您运行一个Java程序时,JDK提供了编译和运行环境,包括编译器、运行时工具、JVM和标准库,所有这些都协同工作以执行您的Java程序。 

== 和 equals 的区别是什么? 

equals 本质上就是 ==,只不过 String 和 Integer 等重写了 equals 方法,把它变成了值比较。

== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重新了 equals 方法

两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?

不对,两个对象的 hashCode() 相同,equals() 不一定 true。

在Java中,hashcode 是一个int 值,它的范围是 -2^31 到 2^31 - 1,即 -2147483648 到 2147483647,由于任何对象都可以被hash,所以hash的值肯定会重复,但是equals的值不一定相同

在散列表中,hashCode() 相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。

final 在 Java 中有什么作用? 

final 修饰的类叫最终类,该类不能被继承。
final 修饰的方法不能被重写。
final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。

声明为 final 的方法通常是系统中已经定义好的,且不应该被修改的方法。比如Object类中的hashcode和equal方法

final 类通常用来表示基本的类,它们提供了不需要进一步扩展的完整功能。比如string类

String 属于基础的数据类型吗?

基础类型有 8 种:byte、boolean、char、short、int、float、long、double,而 String 属于对象。

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

String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。

StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。

 String str="i"与 String str=new String("i")一样吗? 

不一样,jvm内存分配方法不一样,String str = "i" 分配到字符串常量池当中,new出来的都是在堆里面

 String 类的常用方法都有那些?

只需要脑海中想像一个字符串把他折腾个几遍

indexOf():返回指定字符的索引。
charAt():返回指定索引处的字符。
replace():字符串替换。
trim():去除字符串两端空白。
split():分割字符串,返回一个分割后的字符串数组。
getBytes():返回字符串的 byte 类型数组。
length():返回字符串长度。
toLowerCase():将字符串转成小写字母。
toUpperCase():将字符串转成大写字符。
substring():截取字符串。
equals():字符串比较。

接口和抽象类有哪些区别?

莫道人生多不足

眼前分明好时光

Java 中 IO 流分为几种?

按功能来分:输入流(input)、输出流(output)。

按类型来分:字节流和字符流。

字节流和字符流的区别是:字节流按 8 位传输以字节为单位输入输出数据,字符流按 16 位传输以字符为单位输入输出数据。

BIO、NIO、AIO 有什么区别? 

BIO、NIO和AIO是Java中用于处理IO操作的两种不同模型的简称。它们的主要区别在于如何处理同步和异步IO操作。
1. BIO(Blocking I/O)
   - BIO是最传统的IO操作方式,它采用阻塞模式。
   - 在BIO中,每当进行IO操作(如读写文件或网络通信)时,当前线程会阻塞,直到操作完成。
   - 这意味着如果一个IO操作耗时较长,那么该线程将无法进行其他操作。
   - BIO适用于简单的、数据量小的IO操作,但不适用于高并发的、数据量大的应用。
2.NIO(Non-blocking I/O)
   - NIO是在Java 1.4中引入的,它采用了非阻塞模式。
   - 在NIO中,线程不会因为IO操作而阻塞。相反,它会继续执行其他任务。
   - 当IO操作完成时,线程会通过某种机制(如轮询、事件通知)被唤醒。
   - NIO适用于高并发的、数据量大的应用,因为它可以提高系统的并发性能。
3. AIO(Asynchronous I/O)
   - AIO是在Java 7中引入的,它是异步非阻塞的IO操作。
   - 在AIO中,IO操作由操作系统完成,应用程序只需提供回调函数来处理完成的通知。
   - 这意味着应用程序不需要主动检查IO操作的状态,而是只需在IO操作完成后处理结果。
   - AIO适用于高并发的、大量数据的网络应用,如Web服务器和高性能存储解决方案。
总结:BIO适用于简单的、数据量小的IO操作,NIO适用于高并发的、数据量大的应用,而AIO提供了更高级的异步IO操作,适用于高并发的、大量数据的网络应用。

  • 20
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值