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(): 去除两端空白字符。
如何将字符串反转?
可以使用StringBuilder
或StringBuffer
的reverse()
方法来反转字符串。
抽象类必须要有抽象方法吗?
不一定。抽象类可以没有抽象方法,但只要含有至少一个抽象方法,则该类必须声明为抽象类。
普通类和抽象类有哪些区别?
抽象类可以包含抽象方法(没有实现的方法),而普通类不能有未实现的方法。
抽象类不能被实例化,而普通类可以直接实例化。
抽象类可以包含构造器,但不能用来创建对象;普通类的构造器可用于创建对象。
抽象类能使用final修饰吗?
不可以。abstract
和final
是互斥的修饰符,因为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): 获取文件大小。