Skip to content

java 进程是怎么和OS进行交互的,

java 进程和这个OS进行交互实际上还是依赖JVM,JVM本质上也是操作系统的一个进程,通过JVM与OS进行交互

内存管理,java 调用一个关键字new,linux实际上是调用这个mmap,brk, 这些系统调用函数来进行内存的分配,windows 对应的是 VirtualAlloc / HeapAlloc

线程JVM 的平台线程,也是 通过调用底层的线程创建接口进行创建,比如在linux 平台,创建就是使用pthread_create,windows 对应的是 CreateThread

IO 是一样的,也是 通过底层调用进行实现,这个文件操作, read,write, 网络操作,socket,bind,listen, NIO操作,poll,epoll,windows 对应的是:文件操作 ReadFile/WriteFile,网络操作 WSASocket/bind/listen(Winsock2),NIO多路复用使用 IOCP(CreateIoCompletionPort),没有 epoll

解释一下native ​

  1. 写一个这个native 方法类,里面用native 声明这个native 方法,然后这个用javac -h 生成C 头文件
  2. 编写本地的C代码,使用JNI 格式,加入这个<jni.h> , 并且把这个代码编译成dll
  3. 在这个java 程序中使用这个System.loadLibrary() 方法加载dll, 进而这个调用这个C版本实现的native 方法

Java 数组和集合有什么区别?常用集合有哪些 ​

数组是语言层面的固定长度容器,集合是 JDK 提供的可变长度容器框架。两者都能装一组数据,但在长度、元素类型和使用方式上差别明显。

主要区别 ​

对比项数组集合
长度创建后不可改变可按需增删元素
元素类型基本类型、对象都可以只能放对象,基本类型会自动装箱
访问方式通过下标直接取通过方法、迭代器、forEach 等
功能只有 length 属性自带增删、排序、查找、去重等 API

补充一点:集合存基本类型时会装箱成包装类,数据量大时内存和性能开销都比数组高,数值密集计算更适合用数组。

常用的集合类 ​

  • ArrayList:底层是动态数组,随机访问快,容量不够时自动扩容。
  • LinkedList:底层是双向链表,适合频繁在头尾插入、删除。
  • HashMap:哈希表实现的键值对容器,按 key 查找平均 O(1)。
  • HashSet:内部借助 HashMap 实现,用来存放不重复的元素。
  • TreeMap:基于红黑树,key 自动有序。
  • LinkedHashMap:在 HashMap 基础上维护双向链表,能保持插入顺序或访问顺序,可用来实现 LRU 缓存。
  • PriorityQueue:基于堆实现,按自然顺序或自定义比较器出队。

一个常见的坑 ​

java
List<String> names = Arrays.asList("Tom", "Amy");
names.add("Bob"); // 抛 UnsupportedOperationException

Arrays.asList 返回的是固定长度的列表,需要增删时应写成 new ArrayList<>(Arrays.asList(...))。

总结 ​

长度固定、元素是基本类型、追求性能时用数组;其他大多数业务场景用集合,再根据是否需要键值对、去重、排序、保持顺序来选择具体实现。

Java 有哪些特点? ​

Java 能流行几十年,靠的是几项核心特性:跨平台、面向对象、自动内存管理。下面逐个说明。

1. 跨平台 ​

Java 的口号是“一次编写,到处运行”。源码先被 javac 编译成与平台无关的字节码(.class 文件),再由各平台上的 JVM 解释或即时编译成本地机器码执行。

Hello.java --javac--> Hello.class --JVM(Windows/Linux/macOS)--> 运行

所以跨平台的其实是字节码,JVM 本身是分平台实现的。

2. 面向对象 ​

Java 以类和对象组织代码,围绕三大特性:

  • 封装:用访问修饰符隐藏内部细节,只暴露必要的接口。
  • 继承:子类复用父类的属性和方法(Java 只支持单继承,多继承通过接口实现)。
  • 多态:同一个父类引用,运行时可以指向不同子类对象,调用各自的实现。

这让代码更容易复用、扩展和维护。需要注意 Java 并非“一切皆对象”,int、double 等基本类型就不是对象,必要时通过包装类转换。

3. 自动内存管理 ​

开发者只管 new 对象,不需要手动释放。JVM 的垃圾回收器会自动找出不再被引用的对象并回收内存,大大减少了内存泄漏和野指针问题。代价是 GC 会带来一定的停顿,需要根据场景选择合适的收集器(如 G1、ZGC)并调优。

4. 其他特点 ​

  • 强类型、安全:编译期类型检查严格,没有指针运算,运行时有字节码校验和异常机制。
  • 多线程支持:语言层面提供 Thread、synchronized,JDK 还有完整的并发包 JUC。
  • 性能不错:JIT 编译器会把热点代码编译成本地代码,性能接近 C++。
  • 生态丰富:Spring、MyBatis、Kafka、Elasticsearch 等大量成熟框架和中间件。

总结 ​

回答这道题时,先讲跨平台(字节码 + JVM)、面向对象、垃圾回收这三点核心,再补充安全性、多线程和生态,基本就完整了。


📮 联系方式

微信:BuZhiCoder | QQ:1776418445 扫码添加,备注「求职」优先通过

微信二维码

基于 VitePress 搭建

🌟训练营🤖AI面试📄做简历💻刷题