- 博客(66)
- 收藏
- 关注
原创 066_线程生命周期(新建 / 就绪 / 运行 / 阻塞 / 死亡)
本文详细解析Java线程的生命周期,涵盖五个核心状态:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Terminated)。重点分析各状态的定义、转换条件及对应的API方法(如start()、wait()、sleep()等),并比较不同阻塞类型的唤醒机制。文章还提供状态监控技巧和常见问题解决方案,强调理解线程生命周期对编写高效并发程序的重要性,包括避免死锁、正确处理中断等关键实践。通过图示和代码示例,帮助开发者掌握线程状态转换原理及最佳实践。
2025-07-29 18:00:00
1179
原创 065_线程创建方式(继承Thread / 实现Runnable Callable)
Java线程创建的三种方式对比:继承Thread类实现简单但灵活性差;实现Runnable接口可避免单继承限制,支持资源共享;实现Callable接口支持返回值和异常处理,但实现较复杂。根据业务需求选择:简单任务用Thread,资源共享用Runnable,需要结果返回则用Callable。
2025-07-29 15:00:00
963
原创 064_不可变集合与同步集合
本文系统介绍了Java中保障集合安全性的两种主要方式:不可变集合和同步集合。不可变集合通过禁止修改操作实现数据一致性,适用于数据不变的场景(如配置信息),具有线程安全和高效访问的优势;同步集合通过加锁机制支持多线程安全修改,适用于低并发共享数据场景。文章详细对比了两者的特性、创建方式及适用场景,并提供了使用建议:优先选择Java 9+的工厂方法创建不可变集合,同步集合需注意复合操作加锁,高并发场景建议使用并发集合。开发者应根据数据修改需求和并发强度合理选择集合类型。
2025-07-28 18:00:00
1068
原创 063_集合排序与查找算法
Java集合排序与查找实践指南摘要:本文系统介绍了Java集合排序与查找的核心技术。排序方面,详细解析了Comparable接口(自然排序)和Comparator接口(自定义排序),以及Collections.sort()和List.sort()方法的使用场景。底层算法层面,分析了双轴快排(基本类型)和TimSort(对象类型)的特点。查找方面,对比了线性查找(O(n))和二分查找(O(log n))的适用场景及实现要点。最后提供了排序与查找的场景选择策略,并针对常见问题给出优化建议
2025-07-28 15:00:00
968
原创 062_Arrays类与数组操作
java.util.Arrays是Java数组工具类,提供数组操作功能,包括填充(fill, setAll)、复制(copyOf, copyOfRange)、比较(equals, deepEquals)和转换(toString, asList)。注意:asList()不支持基本类型数组;多维操作需deepXXX();范围参数左闭右开。该类简化开发,是集合框架的重要补充。
2025-07-27 18:00:00
943
原创 061_Collections工具方法
Java的Collections工具类提供了丰富的静态方法来操作集合,主要包括六大功能: 元素操作:addAll()批量添加、fill()填充元素、copy()复制集合 集合关系:disjoint()判断无交集、查找子集合位置 统计查询:frequency()计数、min()/max()查找极值 元素调整:replaceAll()替换、reverse()反转、swap()交换元素 使用注意: 目标集合大小需匹配操作要求(如copy()) 优先选择工具类方法而非手动循环(性能更优) 注意方法对空集合的特殊处理
2025-07-27 15:00:00
1172
原创 060_泛型擦除与边界限定
本文深入探讨了Java泛型擦除和边界限定的核心概念。泛型擦除指编译阶段移除泛型类型信息,所有泛型类型被转换为原始类型,导致运行时类型信息丢失。边界限定通过extends或super限制泛型参数范围,增强类型安全并扩展功能。文章详细分析了上限限定和下限限定的语法、应用场景及与泛型擦除的关联关系,提供了数值计算和数据存储的实用示例。最后给出最佳实践建议,包括合理使用边界限定、避免运行时类型判断误区,以及通过反射解决实例创建限制等技巧。这些知识对编写类型安全且高效的泛型代码至关重要。
2025-07-26 18:00:00
943
原创 059_通配符(? extends / ? super)
Java泛型通配符(? extends T 和 ? super T)用于限制泛型类型的范围,解决类型兼容性问题。? extends T(上限通配符)表示T或其子类,允许安全读取数据但限制写入;适用于数据消费场景如打印数值类型。? super T(下限通配符)表示T或其父类,允许安全写入数据但读取受限;适用于数据生产场景如存储数据。两者遵循PECS原则(Producer Extends, Consumer Super),分别处理数据读取和写入需求。通配符提供了灵活的类型约束,确保泛型代码的类型安全性。
2025-07-26 15:00:00
1097
原创 058_类型参数(T / E / K / V等)
Java泛型类型参数详解类型参数是Java泛型的核心概念,用于在类、接口和方法中定义未指定的类型。其作用包括参数化类型、保证类型安全和提高代码复用性。常见类型参数遵循T(通用类型)、E(集合元素)、K/V(键值对)等命名规范。泛型类通过在类名后声明类型参数实现通用逻辑,泛型方法则是在方法返回值前声明。泛型接口同样支持类型参数,用于定义通用方法签名。最佳实践建议优先使用约定参数,限制类型参数数量,并明确参数作用。Java泛型通过类型擦除实现,编译时会将类型参数替换为上限类型(如Object)。
2025-07-25 18:00:00
617
原创 057_泛型类 / 泛型方法 / 泛型接口
Java Set接口详解:实现类对比与适用场景 摘要:本文介绍Set三大实现类:HashSet基于哈希表,提供O(1)快速查找但无序;TreeSet通过红黑树实现有序存储,时间复杂度O(log n);LinkedHashSet结合哈希表与双向链表,兼顾查询效率与插入顺序。文中分析各类底层结构、核心特点、常用方法及适用场景,并附代码示例。开发者可依去重、有序性、查询效率等需求选择,同时注意元素比较规则与线程安全问题。
2025-07-25 15:00:00
1401
原创 056_Map遍历方式与性能对比
本文详细解析了Java中Map的五种遍历方式(keySet、values、entrySet、迭代器和forEach)及其适用场景。通过性能对比分析,指出entrySet遍历(直接访问键值对)是最高效的方式,而keySet遍历因需二次查询性能较差。同时探讨了并发修改异常、大数据量优化等注意事项,并给出实用建议:优先使用entrySet或values遍历,多线程环境选择ConcurrentHashMap,Java 8+推荐forEach提升代码简洁性。文章为开发者选择最优Map遍历方式提供了清晰指导。
2025-07-24 18:00:00
1398
原创 055_Properties类与配置文件
摘要:Properties类是Java中处理键值对配置文件的工具类,继承自Hashtable,专为.properties文件操作设计。它提供配置文件加载(load)、存储(store)和键值对操作(get/setProperty)等方法,支持.properties和.xml格式。配置文件采用键=值结构,支持注释和换行转义,但需注意编码问题(默认ISO-8859-1可能导致中文乱码)。典型应用包括读取/写入本地配置文件、设置默认值、遍历配置项等,是Java应用配置管理的核心工具类。
2025-07-24 15:00:00
882
原创 054_TreeMap / LinkedHashMap
TreeMap和LinkedHashMap是Java中Map接口的两种重要实现,分别提供排序和顺序保留功能。TreeMap基于红黑树实现,按键排序(自然或定制),增删改查时间复杂度为O(log n),适用于需要排序或导航操作的场景。LinkedHashMap基于哈希表+双向链表,保留插入或访问顺序,查询性能O(1),适用于需要记录顺序或实现LRU缓存的场景。两者均非线程安全,允许null值但TreeMap不允许null键。开发者应根据排序需求或顺序保留需求选择合适的实现。
2025-07-22 18:00:00
1177
原创 053_HashMap / ConcurrentHashMap
本文对比分析了Java中的HashMap和ConcurrentHashMap两种哈希表实现。HashMap是非线程安全的键值对存储结构,采用数组+链表+红黑树结构,允许null键值,适用于单线程场景;而ConcurrentHashMap通过CAS和synchronized实现线程安全,不支持null键值,专门为高并发环境设计。文章从核心特性、底层结构、关键方法和使用场景等方面进行了详细比较,并提供了代码示例和性能优化建议,帮助开发者根据具体需求选择合适的哈希表实现。
2025-07-22 15:00:00
693
原创 052_迭代器(Iterator / ListIterator)
Java迭代器提供了统一的集合遍历方式,主要分为Iterator和ListIterator两种。Iterator是基础接口,支持单向遍历和元素删除,适用于所有Collection集合;ListIterator是其子接口,扩展了双向遍历、元素添加/修改功能,仅适用于List集合。两者都能避免并发修改异常,但ListIterator功能更强大,支持索引定位和指定起始位置。迭代器设计实现了"遍历与存储分离",有效屏蔽了不同集合的底层差异,是Java集合框架中高效安全的数据访问工具。
2025-07-21 18:00:00
1034
原创 051_Queue接口(LinkedBlockingQueue / PriorityQueue)
Queue接口是Java集合框架中用于有序元素存储的接口,支持FIFO(先进先出)原则。LinkedBlockingQueue是其阻塞队列实现,基于链表结构,具有线程安全、读写分离锁、阻塞特性等特点,适用于生产者-消费者模型。PriorityQueue则是优先级队列实现,基于堆结构,提供元素按优先级排序的出队顺序,支持自然排序和定制排序。两种队列各有特点:LinkedBlockingQueue适合多线程并发场景,PriorityQueue适合需要优先级处理的场景。
2025-07-21 15:00:00
832
原创 050_Set接口(HashSet / TreeSet / LinkedHashSet)
Set是Java无序不可重复集合接口,主要实现类有HashSet、TreeSet、LinkedHashSet。HashSet基于哈希表,高效无序(O(1));LinkedHashSet在HashSet基础上用双向链表保插入顺序;TreeSet基于红黑树排序(O(log n))。区别:HashSet快速去重,LinkedHashSet保序,TreeSet排序。注意:HashSet/LinkedHashSet需重写hashCode()和equals(),TreeSet需Comparable/Comparator
2025-07-20 18:00:00
909
原创 049_List接口(ArrayList / LinkedList / Vector)
Java List主要实现类ArrayList、LinkedList、Vector核心特点:ArrayList基于动态数组,查询快增删慢;LinkedList为双向链表,增删快查询慢;Vector是线程安全动态数组,性能低。对比底层、线程安全、性能及扩容差异,助选类。单线程首选ArrayList,频繁增删用LinkedList,Vector建议替换为Collections.synchronizedList或CopyOnWriteArrayList。
2025-07-20 15:00:00
541
原创 048_匿名类在事件处理中的应用
摘要:本文介绍了匿名类在Java事件处理中的应用。匿名类作为没有显式类名的局部内部类,其简洁和一次性使用的特点与事件处理场景高度契合。文章详细展示了匿名类在GUI组件事件(如Swing按钮点击、鼠标事件)和自定义事件处理中的典型应用,通过代码示例演示了如何通过匿名类实现ActionListener、MouseListener等接口,以及如何简化事件监听器的注册和处理流程。此外还介绍了使用MouseAdapter适配器和TimerTask定时器时的匿名类应用场景,充分体现了匿名类在事件处理中的灵活性和便利性。
2025-07-19 18:00:00
1445
原创 047_内部类与外部类的交互
内部类与外部类交互机制总结内部类与外部类的交互主要基于成员访问权限和作用域规则。非静态成员内部类可直接访问外部类所有成员(包括私有成员),而静态成员内部类仅能访问外部类的静态成员。外部类访问内部类成员必须通过实例化内部类实现。局部内部类和匿名内部类遵循类似非静态内部类的访问规则,但受限于局部作用域。交互的核心在于内部类隐式持有外部类引用(非静态情况),以及不同类型内部类的作用域特性。这种嵌套结构为Java提供了更灵活的代码组织方式,同时确保了访问控制的安全性。
2025-07-19 15:00:00
936
原创 046_局部内部类与匿名内部类
局部内部类与匿名内部类对比分析局部内部类和匿名内部类是Java中两种特殊的内部类实现方式。局部内部类定义在方法、构造器或代码块内部,具有显式类名,可包含完整类结构,适合封装复杂逻辑;匿名内部类则无需类名,直接通过接口/父类实例化,适合一次性使用的简单场景。两种内部类都能访问外部类成员和局部final变量,但作用域仅限于定义它们的局部范围内。核心区别在于:局部内部类可复用、支持构造器和方法重载,而匿名内部类更简洁但功能受限。选择时需根据代码复杂度、复用需求等因素权衡。
2025-07-18 18:00:00
800
原创 045_成员内部类(静态 / 非静态)
文章摘要:成员内部类是定义在外部类内部的类,分为非静态和静态两种。非静态内部类依赖外部类实例,可访问外部类所有成员,创建需通过外部类实例;静态内部类不依赖外部类实例,仅能访问外部类静态成员,可直接创建。两者核心区别在于依赖关系、访问权限和静态支持。成员内部类通过访问修饰符(如private)控制可见性,常用于逻辑分组和封装辅助类,非静态适合强关联场景(如Map.Entry),静态适合独立工具类。
2025-07-18 15:00:00
627
原创 044_设计模式入门(创建型 / 结构型 / 行为型)
设计模式是面向对象编程中解决重复问题的标准化方案,由GoF总结为23种经典模式,分为创建型、结构型、行为型三大类。创建型模式(如单例、工厂方法)专注于对象创建过程的封装;结构型模式(如适配器、装饰器)处理类/对象的组合方式;行为型模式规范对象间的交互。这些模式通过提高代码复用性、解耦和扩展性,增强软件的可维护性。例如,单例模式确保全局唯一实例,工厂方法将对象创建延迟到子类,适配器模式使不兼容接口能够协同工作。设计模式是通用设计思路,而非具体代码实现。
2025-07-17 18:00:00
784
原创 043_封装设计原则(SOLID)
本文探讨Java封装设计应遵循的SOLID原则,重点分析五大核心原则及其应用。单一职责原则(SRP)强调类应专注单一功能;开闭原则(OCP)提倡对扩展开放、对修改关闭;里氏替换原则(LSP)确保子类能安全替换父类;接口隔离原则(ISP)要求接口小而专一;依赖倒置原则(DIP)主张依赖抽象而非实现。文章通过正反示例说明各原则的实践方法,并指出封装与这些原则的内在关联——共同实现"高内聚、低耦合"的目标。合理应用这些原则能显著提升代码的可维护性和扩展性。
2025-07-17 15:00:00
816
原创 042_封装的实现(属性私有化 / 方法公开)
摘要:Java封装是面向对象编程的核心特性之一,通过属性私有化(private)和公开访问方法(getter/setter)实现。封装的核心思想是"隐藏细节,暴露接口",将类的属性和方法隐藏在内部,仅通过公开方法提供访问。主要优势包括:控制数据访问确保合法性、隐藏实现降低耦合度、提高代码可维护性、实现只读/只写属性。最佳实践要求所有属性私有化,按需设计getter/setter,构造器初始化不可变属性,避免暴露内部引用。遵循封装原则能使代码更健壮、更易维护。
2025-07-16 18:00:00
963
原创 041_多接口实现与冲突解决
本文详细介绍了Java中多接口实现的概念与冲突处理机制。主要内容包括:多接口实现允许类具备多种行为能力,通过implements关键字实现多个接口分析了三种常见冲突场景:抽象方法冲突(只需实现一次)、默认方法冲突(必须显式重写)和常量冲突(需明确指定接口)提出解决冲突的核心原则:优先级原则(父类方法优先)和显式重写原则给出最佳实践建议,如保持接口职责单一、避免方法同名、优先使用组合等强调合理设计接口和处理冲突的重要性,既能发挥多接口灵活性,又能保证代码可维护性
2025-07-16 15:00:00
968
原创 040_默认方法与静态方法
JDK 8引入了默认方法和静态方法增强接口功能。默认方法用default修饰,提供默认实现,实现类可直接继承或重写,解决了接口演进时的兼容性问题。静态方法用static修饰,属于接口本身,只能通过接口名调用,常用于提供工具方法或工厂模式。两者区别在于:默认方法可被重写且通过实例调用,静态方法不能重写且通过接口名调用。使用时需遵循设计原则,默认方法应提供通用实现,静态方法应与接口功能强相关。这些特性使接口设计更灵活,同时保持了其规范性。
2025-07-15 18:11:50
1038
原创 039_抽象类与接口的区别
本文对比了Java中抽象类与接口的核心区别。抽象类用abstract修饰,是类的抽象模板,包含抽象/具体方法和变量,支持单继承;接口用interface定义,是行为规范,仅含抽象方法和常量,支持多实现。关键差异包括:抽象类有构造器但不能实例化,接口无构造器;抽象类强调"is-a"关系,接口强调"has-a"能力。选择原则:存在继承关系用抽象类,需定义行为规范用接口。实际开发中可结合使用,抽象类实现接口以兼顾代码复用和行为规范。
2025-07-15 15:00:00
800
原创 038_接口的定义与实现
**Java接口是一种特殊的引用类型,用于定义类的行为规范而不提供具体实现。通过interface关键字定义,接口包含抽象方法和常量,支持多继承。类通过implements实现接口,必须重写所有抽象方法。接口的主要作用包括:定义统一行为标准实现多态、代码解耦、实现"多重继承"效果。最佳实践建议接口命名体现行为、职责单一、依赖接口而非实现。接口是Java实现多态和代码解耦的核心机制,适用于需要统一行为规范的场景。
2025-07-14 18:00:00
1374
原创 037_抽象类的定义与使用
本文详细介绍了Java抽象类的核心概念、语法规则及使用场景。主要内容包括:抽象类定义(abstract关键字、抽象方法语法)、关键特性(不可实例化、构造器作用)、子类实现规则(必须重写抽象方法)、访问修饰符限制(不能private)以及多态应用。文章还分析了抽象类的典型使用场景(定义模板、强制方法实现、封装共性逻辑)和注意事项(final冲突、方法分离原则),最后总结了抽象类在代码复用和规范约束方面的优势。通过具体代码示例,帮助开发者理解如何合理运用抽象类优化面向对象设计。
2025-07-14 15:00:00
1015
原创 036_instanceof关键字与类型安全
Java的instanceof关键字用于运行时检查对象是否为特定类或接口的实例,保障类型安全。它在向下转型前验证类型匹配避免ClassCastException,并通过类型判断实现差异化逻辑。instanceof遵循继承规则(子类实例返回true),null对象返回false,且编译时会检查类型关系。使用时需避免过度依赖,优先考虑多态和泛型方案。JDK16+的模式匹配功能可简化判断与转型代码。合理运用instanceof能有效提升程序健壮性,是维护Java类型安全的重要机制。
2025-07-13 18:00:00
716
原创 035_向上转型与向下转型
Java转型机制是实现多态的重要手段,分为向上转型和向下转型两种类型。向上转型(子类对象→父类引用)自动完成,安全可靠,主要用于统一接口调用和实现多态,但会限制访问子类特有方法。向下转型(父类引用→子类引用)需显式声明,存在ClassCastException风险,主要用于恢复子类特有功能。最佳实践建议优先使用向上转型,谨慎使用向下转型,并结合业务场景优化类设计。理解这两种转型的区别和适用场景,有助于更好地运用Java面向对象特性,在保证类型安全的前提下实现灵活的多态编程。
2025-07-13 15:00:00
706
原创 034_多态的实现(编译时 / 运行时)
Java多态分为编译时多态(静态多态)和运行时多态(动态多态)。编译时多态通过方法重载实现,在编译阶段根据参数列表确定方法版本;运行时多态通过方法重写和父类引用指向子类对象实现,在运行时根据实际对象类型确定方法版本。多态的核心价值是"单一接口,多种实现",提高代码灵活性和可扩展性。编译时多态适用于参数处理,运行时多态适用于统一接口下的多样化实现。理解这两种多态有助于设计更灵活、可扩展的代码。
2025-07-12 18:00:00
650
原创 033_方法重写(Override)的规则
方法重写是Java面向对象编程的重要特性,指子类重新定义与父类同名同参数的方法。摘要要点:方法签名必须完全相同,包括名称、参数列表和返回值类型(或兼容子类)访问权限不能比父类更严格不能重写private、final和static方法异常声明不能比父类更宽泛建议使用@Override注解进行标记方法重写实现多态特性,使子类能在继承基础上定制特殊行为,但需遵循里氏替换原则,确保程序逻辑完整性。合理运用重写可增强代码复用性和灵活性。
2025-07-12 15:00:00
795
原创 032_super关键字与父类访问
Java中的super关键字用于引用父类成员,核心用途包括:1)访问父类属性(super.属性名),解决与子类同名属性的冲突;2)调用被重写的父类方法(super.方法名);3)调用父类构造器(super(参数)),必须置于子类构造器首行。若未显式调用,编译器会默认调用父类无参构造器。super与this类似,但this引用当前对象,而super指向父类实例。使用时需注意:只能在非静态方法中使用,不能访问父类私有成员,应避免过度依赖以降低耦合度。掌握super有助于正确处理继承关系,确保代码的准确性和灵活性
2025-07-11 18:00:00
1059
原创 031_继承的语法与限制(单继承)
Java继承机制核心要点继承是Java面向对象编程的三大特性之一,通过extends实现子类对父类的扩展。子类继承父类的非私有成员(public/protected/默认权限),可新增特有方法实现功能扩展。Java采用单继承原则,避免多继承冲突,但支持多层继承形成层次结构。继承需注意:构造器不继承、final类不可继承、私有成员需间接访问。最佳实践包括遵循"is-a"关系、控制继承深度(≤3层)、优先组合替代继承,并建议将通用父类设计为抽象类或接口。继承机制有效实现了代码复用和系统扩展性。
2025-07-11 15:00:00
731
原创 029_构造器重载与默认构造器
本文介绍了Java构造器的核心概念和使用要点。主要内容包括:1)构造器的基本定义和作用,用于对象初始化;2)默认构造器的特点及消失场景;3)构造器重载的实现方式和优势,通过不同参数列表提供多种初始化方式;4)两种构造器的关系对比表格;5)最佳实践建议,如手动定义无参构造器、合理设计参数等。文章强调理解构造器机制对编写健壮代码的重要性,并提供了具体示例说明如何正确使用构造器重载和默认构造器。
2025-07-10 18:00:00
1188
原创 030_对象内存模型(堆 / 栈 / 方法区)
Java内存模型的核心区域包括堆、虚拟机栈和方法区。堆是最大的线程共享区域,存储对象实例和数组元素,由垃圾回收器管理;虚拟机栈为线程私有,存储方法调用的栈帧,包含局部变量和对象引用;方法区存储类元数据、静态变量和常量池。三者协同工作:类加载信息存入方法区,对象实例存储在堆中,对象引用存在栈中。堆适合动态分配大对象,栈管理方法调用,方法区持久保存类信息。理解三者区别与联系有助于分析对象生命周期和排查内存问题,是掌握Java运行机制的基础。
2025-07-10 14:53:45
923
原创 028_this关键字的使用场景
摘要:this是 Java 中代表当前对象引用的关键字,主要用于区分成员变量与参数(如this.name=name)、调用当前对象方法(this.method())、构造器复用(this(...))、实现链式调用(return this)以及内部类引用外部类成员(OuterClass.this)。使用时需注意:仅限非静态环境,静态方法中不可用;构造器中this(...)须为首行;避免循环调用或过度使用。通过this可提升代码清晰度,解决命名冲突,简化对象操作逻辑。
2025-07-09 18:00:00
763
原创 027_对象实例化流程(内存分配 / 初始化)
Java对象实例化是通过new关键字创建对象的过程,由JVM完成,核心流程为类加载检查、内存分配、初始化、返回引用。类加载检查确认类是否加载,未加载则先加载。内存分配在堆中进行,大小由类属性决定,有指针碰撞和空闲列表两种方式。初始化分默认、显式、构造器三阶段,依次覆盖赋值。最后JVM将对象引用返回给变量。注意初始化不可跳过,构造器仅负责最终初始化,实例化可能失败。
2025-07-09 15:00:00
1809
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人