加载中

Java

文章分类

浏览该分类下的所有文章

237 篇文章 20

Java基础(一)

本文围绕 Java 基础概念展开,阐述了跨平台实现依赖 JVM 将字节码转换为平台机器码的机制;说明单文件可含多类但仅限一个 public 类且需与文件名一致;系统梳理了四种访问修饰符(private、default、protected、public)的作用范围及类的两种访问级别;概述基本数据类型(8 种)和引用类型(数组、类、接口)的特性、内存占用及默认值;区分成员变量(实例、静态)与局部变量的存储位置、生命周期,指出 Java 没有真正的全局变量;解释包装类的意义及自动装箱/拆箱的便利;最后给出 Integer 与 Double 比较的正确做法:转换为同一基本类型后再比较。

Java基础(二)

本文围绕 Java 基础知识进行要点梳理。首先说明 int 为基本类型、Integer 为包装类,== 比较时会自动拆箱后比较数值。随后阐述面向对象的核心思想及三大特征——封装、继承和多态,解释封装的目的在于隐藏实现细节、保证数据完整性;多态通过父类引用指向子类对象实现,提升代码可扩展性。进一步说明 Java 采用单继承避免多继承冲突,并指出构造方法不可重写。比较了方法重载(同类、参数不同)与重写(父子类、签名相同)的区别。最后列举 Object 类常用方法(getClass、equals、hashCode、toString、wait/notify、clone、finalize)及其作用。整体提供了 Java 面向对象概念与核心机制的简明概览。

Java基础(三)

null

Java基础(四)

本文系统阐述了 Java 基础概念,包括异常处理的三步(try‑catch‑finally)及异常机制、Throwable 层次结构与 Checked、Runtime 区别,说明 finally 的必执行性及在其中使用 return 的影响。进一步介绍 static 关键字的作用、限制及静态内部类的继承特性,并比较 static 与 final 的区别。随后讲解泛型的意义、类型擦除、通配符上限/下限(? extends、? super)以及其安全性原则。最后说明 Java 反射的原理、获取 Class、创建实例、动态代理等实际应用场景,以及对象的四种引用方式(强、软、弱、虚)及其垃圾回收行为。

集合类(一)

介绍Java集合体系:Collection分为Set、List、Queue,Map为键值映射;列举常用实现类及其线程安全情况,说明使用Collections或java.util.concurrent提供的并发集合。重点阐述Map实现,尤其HashMap的结构、put过程、扩容与冲突处理(链表转红黑树)以及线程不安全原因;比较HashMap、Hashtable、ConcurrentHashMap、LinkedHashMap的特性与实现原理。

集合类(二)

本文概述Java集合实现与特性。TreeMap基于红黑树,操作logN;Set无序不可重复,Map键集合为Set,List有序可重复。ArrayList用动态数组,随机访问O(1)但插删需复制;LinkedList双向链表,插删快但随机访问O(N)。线程安全List有Vector、Collections.synchronizedList、CopyOnWriteArrayList(读无锁、写复制,适合读多写少)。HashSet依赖HashMap,TreeSet红黑树并支持排序。BlockingQueue基于ReentrantLock+Condition实现阻塞。Stream API分中间与终端操作,常用filter、map、distinct、sorted、reduce等用于函数式聚合。

IO

文章系统介绍了Java IO流的分类与常用类,指出大文件应采用缓冲流或NIO的内存映射方式读取。随后阐述NIO的核心Channel、Buffer、Selector及其属性和跨平台实现。接着讲解对象序列化/反序列化机制、serialVersionUID的作用,并列举JSON、Protobuf、Thrift、Avro等主流序列化工具及其特点,最后提供不使用JSON时的实现思路。

多线程(一)

Java多线程要点:线程可继承Thread或实现Runnable/Callable,支持返回值。run()执行任务体,start()启动且只能一次。线程状态五阶段:新建、就绪、运行、阻塞、死亡。同步使用synchronized或Lock。通信方式包括wait/notify/notifyAll和BlockingQueue。sleep不释放锁,wait释放锁需notify;notify唤醒单个,notifyAll唤醒全部。

多线程(二)

子线程先执行可在启动后立即调用join,使主线程阻塞直至子线程结束。线程阻塞情况包括sleep、阻塞IO、获取同步监视器、等待notify及suspend。synchronized 为JVM关键字,底层通过monitorenter/monitorexit 与对象头Mark Word 实现,支持代码块、方法及静态方法(类锁),但不能修饰静态代码块。Lock 为接口,需显式释放,可设超时、检测成功、支持公平/非公平、读写锁。ReentrantLock 基于AQS 的独占模式实现,内部有公平与非公平子类。除synchronized/Lock外,可用volatile、原子类、ThreadLocal、不可变对象保证安全。悲观锁使用synchronized/Lock,乐观锁依赖CAS。公平锁按等待队列顺序获取,非公平锁抢占更快。JDK 1.6 以后同步锁经历无锁→偏向锁→轻量级锁→重量级锁的升级,均通过Mark Word 与CAS 控制。

多线程(三)

JUC(java.util.concurrent)提供原子类、锁/条件、线程池、阻塞队列、并发容器和同步器等工具。AQS 是构建锁和同步器的骨架,维护 state、等待队列并通过 FIFO CLH 队列实现阻塞/唤醒。LongAdder 通过分段计数单元降低 CAS 竞争,提高高并发计数效率。ThreadLocal 为每个线程提供独立的变量存储,内部使用 ThreadLocalMap 并采用线性探测解决哈希冲突。线程池复用线程降低创建成本,支持多种工厂方法、五种状态及四种拒绝策略,线程数应根据 CPU/IO 密集度合理设置。

JVM(一)

JVM由类加载器、运行时数据区、执行引擎和本地接口四部分构成。运行时数据区包括程序计数器、虚拟机栈(及本地方法栈)、堆、方法区和运行时常量池。JVM启动先装载JRE、装入JVM动态库、初始化并创建JNIEnv,随后加载并解释class或jar文件,执行引擎将字节码翻译为机器指令。程序计数器负责指令流控制,栈用于方法调用和本地方法。内存划分决定对象、类元数据及常量的存放位置,内存不足时抛出相应异常。类加载经历加载、验证、准备、解析、初始化等阶段。

JVM(二)

本文系统阐述了JVM垃圾回收的触发时机、Full GC的减少措施以及对象可回收性的判定方法,介绍了新生代Eden/Survivor划分、对象晋升老年代的机制,并比较了标记‑清除、标记‑复制、标记‑整理等算法及其适用区域。重点说明了G1和CMS两大收集器的工作原理、优缺点,并区分了内存泄漏与内存溢出及其防治措施。