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
- 写一个这个native 方法类,里面用native 声明这个native 方法,然后这个用javac -h 生成C 头文件
- 编写本地的C代码,使用JNI 格式,加入这个<jni.h> , 并且把这个代码编译成dll
- 在这个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:基于堆实现,按自然顺序或自定义比较器出队。
一个常见的坑
List<String> names = Arrays.asList("Tom", "Amy");
names.add("Bob"); // 抛 UnsupportedOperationExceptionArrays.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 扫码添加,备注「求职」优先通过
