JDK 和 JRE 有什么区别?

JRE (Java Runtime Environment): 是运行Java程序所必需的环境的集合,包含Java虚拟机(JVM)标准的类库。

JDK (Java Development Kit): 是提供给Java开发人员使用的开发工具包。它包含了JRE,同时也包含了编译器(javac)、调试器和其他开发工具。

JVM

Java虚拟机(JVM, Java Virtual Machine)是Java编程语言的核心组成部分之一,它提供了一个运行Java字节码的环境。下面是一个关于JVM基本原理的简要概述:

1. 概念

  • 平台无关性:JVM的设计使得Java程序可以在任何支持JVM的操作系统上运行,无需重新编译。

  • 字节码执行:Java源代码被编译成字节码(.class文件),由JVM解释执行或通过即时编译器(JIT)转换为机器码直接运行。

2. 主要组件

  • 类加载器(Class Loader):负责将.class文件加载到内存中,并对这些类进行验证、解析和初始化。

  • 运行时数据区(Runtime Data Area)

    •   方法区(Method Area):存储每个类的信息(包括常量、静态变量、方法数据等)。

    •   堆(Heap):所有线程共享的内存区域,用于存放对象实例。

    •   栈(Stack):每个线程都有一个私有的栈空间,用于存储局部变量、操作数栈、动态链接和方法返回地址等。

  • 执行引擎(Execution Engine):解释并执行字节码指令。

  • 本地接口(Native Interface):允许Java代码调用本地方法(如C/C++函数)。

3. 内存管理

  • 垃圾收集(Garbage Collection):自动回收不再使用的对象所占用的内存空间,以减少程序员手动管理内存的工作。

  • 分代收集:JVM通常将堆分为年轻代(Young Generation)和老年代(Old Generation),年轻代又细分为Eden区和两个Survivor区。这种设计有助于优化垃圾回收过程。

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

  • String: 不可变的字符序列,适用于大多数情况。

  • StringBuilder: 可变的字符序列,线程不安全,在单线程环境下性能较好。

  • StringBuffer: 可变的字符序列,线程安全,适用于多线程环境。

主要区别在于不可变性线程安全性

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

不一样。String str="i"直接通过字面量创建一个字符串对象,这个对象会被存储在常量池中;而String str=new String("i")会创建一个新的对象,并不会放入常量池,除非显式地调用intern()方法。

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

  • concat(String): 连接字符串。

  • equals(Object): 字符串比较。

  • equalsIgnoreCase(String): 忽略大小写比较。

  • indexOf(String), lastIndexOf(String): 查找子字符串位置。

  • length(): 获取长度。

  • replace(char, char), replaceAll(String, String): 替换字符或子串。

  • substring(int), substring(int, int): 截取子串。

  • toLowerCase(), toUpperCase(): 转换大小写。

  • trim(): 去除两端空白字符。

如何将字符串反转?

可以使用StringBuilderStringBufferreverse()方法来反转字符串。

抽象类必须要有抽象方法吗?

不一定。抽象类可以没有抽象方法,但只要含有至少一个抽象方法,则该类必须声明为抽象类。

普通类和抽象类有哪些区别?

  • 抽象类可以包含抽象方法(没有实现的方法),而普通类不能有未实现的方法。

  • 抽象类不能被实例化,而普通类可以直接实例化。

  • 抽象类可以包含构造器,但不能用来创建对象;普通类的构造器可用于创建对象。

抽象类能使用final修饰吗?

不可以。abstractfinal是互斥的修饰符,因为final意味着不可继承,而abstract意味着必须被继承。

接口和抽象类有什么区别?

  • 抽象类可以包含具体实现,接口只能定义行为,不能有具体实现。

  • 接口中的方法默认是public abstract的,而抽象类中的方法可以是任何访问级别。

  • 一个类只能继承一个抽象类,但可以实现多个接口。

Java中IO流分为几种?

主要有两种:

  • 字节流 (InputStream, OutputStream)。

  • 字符流 (Reader, Writer)。

BIO、NIO、AIO有什么区别?

  • BIO (Blocking I/O): 同步并阻塞,服务器实现模式为一个连接一个线程。

  • NIO (Non-blocking I/O): 同步非阻塞,客户端发送请求后,服务器端的线程不会立即处理数据,而是把该请求挂起,等待有数据时再处理。

  • AIO (Asynchronous I/O): 异步非阻塞,客户端的I/O请求由操作系统完成后再通知服务端的应用程序。

Files的常用方法都有哪些?

  • readAllLines(Path, Charset): 读取所有行。

  • write(Path, byte[], OpenOption...): 写入文件。

  • copy(Path, Path, CopyOption...): 复制文件。

  • delete(Path): 删除文件。

  • exists(Path): 判断文件是否存在。

  • createFile(Path): 创建文件。

  • createDirectory(Path): 创建目录。

  • move(Path, Path, MoveOption...): 移动文件。

  • size(Path): 获取文件大小。