加载中

Java

文章分类

浏览该分类下的所有文章

237 篇文章 20

Java基础(一)

Java 通过将源代码编译成平台无关的字节码,借助各平台对应的 JVM 翻译为机器码,实现“一次编写、处处运行”。一个 .java 文件可含多个类,但最多只能有一个 public 类且名称须与文件名相同。访问修饰符分为 private、default、protected、public,分别控制成员在类内部、同包、子类及任意包的可见性。数据类型分为 8 种基本类型(整数、浮点、字符、布尔)和引用类型(数组、类、接口),基本类型有固定的内存占用和默认值,引用类型默认值为 null。成员变量分为实例变量(堆)和类变量(方法区),局部变量位于栈且无默认值。包装类为基本类型提供对象特性,支持自动装箱/拆箱,简化基本类型与对象之间的转换。比较 Integer 与 Double 时需将其转为相同的基本数值后再比较。

Java基础(二)

本文围绕Java基础知识展开,先说明基本类型int与包装类Integer的区别及==比较时的自动拆箱行为;随后阐述面向对象的概念、三大特征(封装、继承、多态)及抽象的重要性,详细解释封装的目的、实现方式以及重写与重载的区别,说明构造方法不可重写;进一步探讨多态的实现原理、单继承的设计原因以及如何通过父类引用实现运行时多态;最后列举Object类的核心方法(getClass、equals、hashCode、toString、wait/notify、clone、finalize)及其作用。整体内容旨在帮助读者系统掌握Java面向对象的基本理论与常用机制。

Java基础(三)

本文系统阐述了Java中对象比较与哈希规则——hashCode 与 equals 必须保持一致,并说明了重写这两个方法的必要性及 == 与 equals 的区别;重点介绍了String 的常用方法、不可变特性及 final 设计原因,比较了String、StringBuffer、StringBuilder 的使用场景与性能,并指出字面量与 new 创建的区别及字符串拼接的最佳实践;最后概述了接口与抽象类的本质差异、接口不能有构造器以及面向接口编程降低耦合、提升可扩展性的优势。

Java基础(四)

本文系统阐述了Java基础关键概念。异常处理分为捕获、处理、资源回收,使用try‑catch‑finally结构;异常体系由Throwable、Error、Exception构成,Exception分为Checked和Runtime两类;finally块始终执行,若在其中使用return或throw会覆盖前面的返回或抛出。static关键字将成员设为类级别,不能访问实例成员,静态内部类可被继承但只能使用外部类的静态成员;final用于限制类、方法、变量不可变或不可覆写。泛型通过参数化类型消除集合的类型不安全问题,涉及类型擦除、通配符上限(extends)和下限(super)以及其与数组的差异。反射机制使程序在运行时获取类信息、创建实例和生成代理,是JDBC、框架配置和AOP等场景的核心技术。最后介绍了Java对象的四种引用方式:强、软、弱、虚引用及其在垃圾回收中的行为。

集合类(一)

Java 集合分为四大接口 Set、List、Queue、Map,分别对应无序不可重复、有序可重复、FIFO 队列和键值映射。常用实现有 HashSet、TreeSet、ArrayList、LinkedList、ArrayDeque、HashMap、TreeMap 等。java.util 中的大多数类是非线程安全的,可通过 Collections.synchronizedXxx 包装或使用 java.util.concurrent 包下的并发集合(如 ConcurrentHashMap、CopyOnWriteArrayList)获得安全性。HashMap 采用数组+链表/红黑树结构,支持动态扩容,JDK8 引入红黑树以降低冲突查询的时间复杂度。ConcurrentHashMap 通过分段锁(JDK7)或 CAS+锁(JDK8)实现高效并发访问。LinkedHashMap 在 HashMap 基础上维护双向链表,以保持插入顺序。

集合类(二)

本文概述Java集合实现要点:TreeMap基于红黑树,操作log(N);Map的键形成Set,Set无序不可重复,List有序可重复;ArrayList用数组随机访问快,LinkedList双向链表插删快;线程安全List包括Vector、synchronizedList、CopyOnWriteArrayList,后者适读多写少;HashSet由HashMap实现,TreeSet基于红黑树支持排序;Stream提供丰富的中间、终端操作,具备有状态和短路特性。

IO

Java把键盘、文件、网络等抽象为流,分输入/输出、字节/字符、节点/处理三类,并列出常用类。大文件读取推荐缓冲流或NIO 内存映射。NIO 由 Channel、Buffer、Selector 组成,Buffer 有 capacity、position、limit,Selector 支持单线程多通道。对象序列化需实现 Serializable,serialVersionUID 保证版本兼容。

多线程(一)

本文系统阐述了 Java 多线程的基础概念与实现技巧。创建线程可通过继承 Thread、实现 Runnable 或 Callable(后者配合 FutureTask)三种方式,推荐使用后两者以便共享资源并保持单继承。列举了 Thread 的常用构造、静态和实例方法,说明了 run() 与 start() 的本质区别及线程只能启动一次的限制。详细描述了线程的五状态(New、Ready、Running、Blocked、Dead)及其转换规则。同步手段包括 synchronized 方法/代码块、ReentrantLock、volatile 与原子类;线程通信方式有基于 Object 的 wait/notify/notifyAll、基于 Lock 的 await/signal/signalAll,以及 BlockingQueue。最后对 wait 与 notify 的作用、sleep 与 wait 的差异以及 notify 与 notifyAll 的区别作了对比说明。

多线程(二)

本文系统介绍了 Java 多线程的关键技术要点:通过 Thread.join 实现子线程先行;阻塞方式包括 sleep、阻塞 I/O、监视器竞争、wait/notify 以及 suspend;比较了 synchronized(JVM 层实现、自动释放、不可中断、非公平)与 Lock(代码层实现、手动释放、可中断、可公平)的区别,并阐述了 synchronized 的 monitorenter/monitorexit 实现原理及对静态方法的锁机制。随后解析了 ReentrantLock 基于 AQS 的实现、乐观锁与悲观锁的概念、以及公平/非公平锁的实现细节。最后说明了除 synchronized/Lock 外的线程安全手段(volatile、原子类、ThreadLocal、不可变对象),并概述了 JDK6 之后的锁升级过程(无锁、偏向锁、轻量级锁、重量级锁)。

多线程(三)

JUC(java.util.concurrent)提供原子类、锁/Condition、线程池、阻塞队列、并发容器和同步器等工具。AQS是构建锁、Semaphore、读写锁等同步组件的骨架,管理状态、等待队列并采用FIFO CLH 队列。LongAdder 通过分段计数单元降低高并发下的CAS竞争,适合计数场景。ThreadLocal 为每个线程提供独立的变量存储,内部使用 ThreadLocalMap 及线性探测解决哈希冲突。线程池通过复用线程提升性能,核心类为 ThreadPoolExecutor,状态包括 RUNNING、SHUTDOWN、STOP、TIDYING、TERMINATED,支持四种拒绝策略(Abort、Discard、DiscardOldest、CallerRuns),队列大小依据任务类型(CPU 密集、IO 密集或混合)进行调节。

JVM(一)

JVM 由类加载器、运行时数据区、执行引擎和本地接口四大模块组成。字节码经类加载器加载进入内存后,由执行引擎解释或 JIT 编译为机器指令,必要时通过本地接口调用 native 方法。运行时数据区包括程序计数器、虚拟机栈、本地方法栈、堆、方法区及运行时常量池,分别承担线程私有或共享的内存职责。JVM 启动分为环境装入、JVM 装载、初始化并获取 JNI 接口、运行主类(jar 或 class)。文中还说明本地方法栈、程序计数器的作用及缺失后果,概述 Java 编译、类加载的完整流程以及内存分布情况。

JVM(二)

JVM 在 Eden 区满时触发 Minor GC,老年代内存不足或达到阈值时会出现 Full GC。可通过增大方法区/老年代、缩小新生代、禁用 System.gc()、使用标记‑整理等手段降低 Full GC。对象是否可回收主要靠可达性分析,即从 GC Roots 出发的引用链决定存活对象;对象在 Survivor 区经过多次 Minor GC 并达到年龄阈值后晋升老年代。新生代采用 Eden 与两个 Survivor 的 8:1 比例,利用复制算法避免碎片;老年代不适用标记‑复制而采用标记‑整理或标记‑清除。G1 将堆划分为 Region,按停顿时间优先回收价值最高的区域;CMS 采用并发标记‑清除以缩短停顿,但易产生碎片并受资源限制。内存泄漏指对象仍被引用而无法回收,溢出则是申请内存超出可用,上述措施和代码优化可分别予以解决。