自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

思你日度难眠

加油向上冲!!!

  • 博客(56)
  • 收藏
  • 关注

原创 36.Java序列化与反序列化是什么

Java序列化将对象转换为字节流用于存储或传输,反序列化则重建对象。实现方式包括实现Serializable(自动序列化所有字段)或Externalizable接口(自定义控制)。serialVersionUID用于类版本控制,建议显式指定以保持兼容性。transient修饰的字段不会被序列化,静态变量也不会被序列化。序列化支持跨平台通信,但需注意安全风险。开发者可根据需求选择默认序列化或自定义方式,并通过版本控制管理类演化。

2025-09-09 00:07:27 865

原创 35.Java 中的泛型是什么

Java泛型是一种类型参数化机制,允许在类、接口和方法中使用类型参数,从而在编译时确定具体类型。泛型提供了类型安全(编译时检查类型转换)、消除强制类型转换和提升性能等优势。其底层通过类型擦除实现,运行时泛型类型会被擦除为Object或指定边界类型。通配符<? extends T>和<? super T>分别用于限制类型的上界和下界,影响读写操作。由于类型擦除,ArrayList<String>和ArrayList<Integer>在运行时类型相同。Java数组

2025-09-09 00:05:46 493

原创 34. 什么是反射

反射机制是Java在运行时动态获取类信息和操作对象的核心技术。它通过Class类提供获取类属性、方法和构造器的能力,支持动态创建对象、访问/修改字段和调用方法。反射的主要优点在于提高程序灵活性,实现动态加载和调用,广泛应用于框架开发(如Spring)、动态代理和注解处理。但反射存在性能开销,可通过缓存、关闭安全检查或使用ReflectASM优化。典型应用场景包括配置文件加载、依赖注入和测试框架。获取Class对象有三种方式:Class.forName()、类名.class和对象.getClass(

2025-09-09 00:04:27 824

原创 33. 包装类型是什么?基本类型和包装类型有什么区别?

本文介绍了Java基本类型与包装类型的区别及相关概念。基本类型直接存储值在栈中,效率高但功能有限;包装类型是对象,存储在堆中,支持null值和泛型,但性能略低。重点讲解了自动装箱(基本类型→包装类)和拆箱(包装类→基本类型)机制,以及Integer的特殊缓存机制(-128~127之间值会被缓存复用)。通过多个代码示例对比了不同创建方式的Integer对象之间的比较结果,解释了内存地址与值比较的区别。

2025-08-29 20:56:48 1002

原创 32.String str=aaa与 String str=new String(aaa)一样吗?new String(“aaa”);创建了几个字符串对象

String str="aaa" 会检查字符串常量池,若不存在则创建并引用,否则直接引用池中对象(仅1个对象)。 String str=new String("aaa") 先在常量池创建(若无),再在堆中新建对象,共2个对象,str 指向堆对象。 String特性:不可变性(修改生成新对象)、常量池优化(复用相同值)、final 修饰(底层不可变数组)。 HashMap中使用String作key:因不可变性保证hashCode稳定,且常量池缓存避免重复计算,提

2025-08-29 20:55:50 692

原创 31. 什么是字符串常量池

字符串常量池是JVM优化字符串存储的特殊内存区域。它包含三种类型:全局字符串常量池、class文件常量池和运行时常量池。JVM首先检查字符串是否存在于池中,避免重复创建。JDK6中常量池位于方法区存储对象,JDK7移至堆存储引用,JDK8则存在于元空间替代了方法区。这种设计提升了性能并减少了内存开销。

2025-08-27 21:36:10 139

原创 30. 字符型常量和字符串常量的区别

字符型常量和字符串常量的主要区别在于:形式上字符用单引号,字符串用双引号;本质上字符是整数值可运算,字符串是地址值;内存方面字符占2字节,字符串至少1字节(含结束符)。这些差异反映了它们在编程中的不同用途和特性。

2025-08-27 21:35:25 203

原创 29. String, StringBuffer,StringBuilder 的区别是什么

String、StringBuffer和StringBuilder的主要区别在于可变性和线程安全性。String是不可变的,使用final修饰的字符数组存储,任何修改都会创建新对象。StringBuffer和StringBuilder继承自AbstractStringBuilder,使用可变字符数组存储。StringBuffer是线程安全的,通过同步锁实现;而StringBuilder是非线程安全的。String由于不可变性也是线程安全的。性能上,StringBuilder最快,StringBuffer次之

2025-08-27 21:34:05 369

原创 29. String, StringBuffer,StringBuilder 的区别是什么

String、StringBuffer和StringBuilder的主要区别在于可变性和线程安全性。String是不可变的,使用final修饰的字符数组存储,任何修改都会创建新对象。StringBuffer和StringBuilder继承自AbstractStringBuilder,使用可变字符数组。StringBuffer通过同步锁保证线程安全,而StringBuilder不安全。String由于final修饰也是线程安全的。

2025-08-21 14:05:52 198

原创 28. 介绍一下hashCode()

hashCode()是Object类中的方法,返回一个int型哈希码,用于确定对象在哈希表中的索引位置。它与equals()方法密切相关:当两个对象equals()相等时,它们的hashCode()必须相等;但hashCode()相等时,equals()可能不相等。规范要求重写equals()时必须重写hashCode(),否则可能导致哈希表操作异常。例如HashSet先比较hashCode()再比较equals(),未重写hashCode()会导致equals()相等的对象被误判为不同对象。这种机制

2025-08-21 14:04:57 411

原创 27. == 与 equals 的区别

Java中==和equals()的主要区别在于:==比较基本数据类型的值或对象的引用地址,而equals()默认比较对象地址但可被重写为比较内容。==适用于基本类型和引用类型,速度快;equals()仅用于对象,更灵活但需注意空指针和重写规则。实际使用时应根据需求选择:比较对象同一性用==,比较内容用重写后的equals()方法。(149字)

2025-08-21 14:03:48 899

原创 26. 值传递和引用传递的区别的什么?为什么说Java中只有值传递

Java 采用值传递机制,基本类型传递的是值的副本,对象传递的是引用副本。方法内修改基本类型不影响原值,但通过对象引用副本可修改对象状态(如属性更改)。Java 没有真正的引用传递,因为重新赋值对象引用不会影响外部变量。这种设计确保了数据安全,避免意外修改外部变量。即便对象参数表现出类似引用传递的行为,本质仍是传递引用的副本(值传递),符合 Java 安全、简单的设计哲学。

2025-08-18 00:02:38 865

原创 25. 能否创建一个包含可变对象的不可变对象

可以创建包含可变对象的不可变对象,但需要采取防御性措施。在Java中,通过构造函数进行深拷贝(new ArrayList<>(list))来存储内部状态,并提供只读视图(Collections.unmodifiableList)防止外部修改。关键点包括:不暴露内部引用、返回不可变集合视图、构造函数中拷贝可变对象。这种设计确保了对象引用不可变,同时隔离了内部可变对象的状态变化。

2025-08-18 00:01:46 361

原创 24. 什么是不可变对象,好处是什么

不可变对象是指创建后内部字段值不可修改的对象,任何修改都会生成新对象。其特点包括:字段使用private final修饰,如String和基本类型包装类(Integer、Long等)。核心优势有:线程安全(无需同步)、简化并发编程、缓存友好(哈希值固定)、安全性高(防止意外修改)以及内存优化(可共享对象减少开销)。这些特性使不可变对象在多线程、缓存和敏感数据处理等场景中表现优异。

2025-08-18 00:01:04 455

原创 21. 抽象类和接口的区别

抽象类和接口在语法层面有明显区别:抽象类可以有构造器、非final变量和具体方法,而接口只能有static final变量和抽象方法(Java8后支持默认方法)。设计层面,抽象类是对类的抽象,包含属性和行为,而接口是对行为的规范。抽象类支持单继承,接口支持多实现。示例展示了抽象类定义模板和接口定义规范的典型用法。

2025-08-13 22:00:28 376

原创 20. 构造器(constructor)是否可被重写(override)

构造器不能被重写,因为构造器名称必须与类名一致,无法满足重写需要的方法名相同条件。子类必须显式或隐式调用父类构造器进行初始化,而非重写。但构造器可以被重载,通过不同参数列表定义多个构造器。例如,Person类可以定义无参、单参和双参构造器来实现重载。构造器的这些特性确保了对象初始化的正确性和灵活性。

2025-08-13 21:59:37 365

原创 19. 重载的方法能否根据返回值类型进行区分

Java方法重载不能仅通过返回值类型区分,因为方法签名仅包含方法名和参数列表。调用时编译器无法根据返回值确定使用哪个方法,会导致歧义。正确的重载方式应通过参数类型、数量或顺序的不同来区分,如int add(int a,int b)和double add(double a,double b)。如果仅返回值不同(如int add(int a,int b)和double add(int a,int b)),则编译会报错。

2025-08-13 21:58:44 152

原创 18. 重写(override)和 重载(overload)的区别

重写(Override)和重载(Overload)是Java多态的两种实现方式。重写是运行时多态,发生在继承关系中,子类重写父类方法时需保持方法名、参数列表一致,返回类型可以是子类类型,访问修饰符可不同。重载是编译时多态,发生在同一类中,方法名相同但参数类型或数量不同,返回类型可不同。重写关注方法实现,重载关注方法参数变化。

2025-08-11 14:44:02 402

原创 17. Java是如何实现多态的

Java实现多态分为编译时多态(静态多态)和运行时多态(动态多态)。编译时多态通过方法重载实现,在编译时确定调用方法;运行时多态通过继承、重写和向上转型实现,在运行时动态绑定方法。示例代码展示了重载的静态多态和基于继承的动态多态实现方式,后者允许统一接口处理不同子类对象。

2025-08-11 14:43:04 218

原创 16.面向对象的三大特性

面向对象编程的三大特性包括:封装、继承和多态。封装将数据和方法包装在类中,通过访问控制隐藏实现细节;继承使子类能复用父类功能并扩展新特性;多态允许同一方法在不同子类中有不同实现。Java示例代码展示了如何通过private属性、getter/setter方法实现封装,通过extends实现继承,以及通过方法重写和向上转型实现多态。这些特性共同构成了面向对象编程的基础,提高了代码的可维护性和扩展性。

2025-08-11 14:41:59 471

原创 15.面向对象和面向过程的区别

面向过程与面向对象编程各有特点:面向过程性能更高,适用于嵌入式开发等对性能要求高的场景,但维护性和扩展性较差;面向对象具有封装、继承、多态三大特性,能设计低耦合系统,更易维护、复用和扩展,但性能相对较低。两种范式分别适用于不同场景,开发者需根据项目需求进行选择。

2025-08-10 15:04:36 201

原创 14. Java静态变量,代码块和静态方法的执行顺序是什么

Java中代码块执行顺序遵循特定规则:静态代码块最先执行,其次是构造代码块和构造函数,普通代码块最后执行。在继承关系中,父类静态代码块优先于子类静态代码块,接着执行父类构造代码块和构造函数,最后才是子类的构造代码块和构造函数。这种执行顺序确保了类初始化时静态成员的优先加载,以及父类先于子类初始化的继承特性。

2025-08-10 15:03:54 133

原创 13. 是否可以在static环境中访问非static变量

在static环境中不能直接访问非static变量,因为static成员在类加载时就初始化,而非static变量需要对象实例化后才存在。解决方法是通过创建对象实例来访问非static变量。static变量属于类本身,存储在方法区;非static变量属于对象,存储在堆内存。代码示例展示了如何在static方法中通过对象引用访问实例变量。

2025-08-10 15:02:50 449

原创 12. “static关键字是什么意思”,Java中是否可以覆盖(override)一个private或者是static的方法

在Java中,static关键字表示属性和方法可以不实例化直接调用。private方法由于仅对当前类可见,子类无法访问或覆盖它。static方法属于静态绑定,而方法覆盖是基于运行时动态绑定的,因此也不能被真正覆盖。当子类声明与父类同名的static方法时,实际上是隐藏而非覆盖父类方法。通过父类引用调用时仍会执行父类的static方法。因此,Java中既不能覆盖private方法,也不能真正覆盖static方法。

2025-08-09 21:51:35 197

原创 11. 为什么要用static关键字

static关键字用于: 共享数据:类变量被所有实例共享,节省内存(如员工计数器); 直接调用:无需实例化即可访问静态方法(如工具类); 初始化资源:通过静态代码块在类加载时执行(如数据库连接)。 示例:Employee类使用static统计实例数,MathUtils提供静态加法方法,Database类用静态块初始化连接。 (字数:99)

2025-08-09 21:50:48 186

原创 10.final, finally, finalize的区别

Java中final、finally和finalize的区别: final:修饰类不可继承,修饰方法不可重写,修饰变量为常量(引用不可变) finally:异常处理中确保执行的代码块(除非调用System.exit()) finalize:Object类方法,对象被GC回收时调用(不推荐使用) 三者分别用于不可变性保证、资源清理和垃圾回收,功能完全不同。

2025-08-09 21:49:43 358

原创 9. break,continue和return的区别及作用

这篇代码示例展示了Java中break、continue和return的区别及使用场景。break用于完全终止当前循环,continue用于跳过当前循环的剩余部分继续下一次循环,而return则用于结束当前方法并返回结果。在订单处理示例中,continue跳过无效订单,break在收益达标时提前终止循环,return最终返回计算的总收益。三种控制语句分别适用于不同的循环控制需求。

2025-08-06 13:18:45 401

原创 8.访问修饰符public,private, protected,以及不写(默认)时的区别

Java访问修饰符控制类成员的可见性:public在任何地方可访问;private仅限当前类;protected允许当前类、同包类及子类访问;默认(default)则限于当前类和同包类。protected还允许不同包子类访问,而default不行。这些修饰符实现了面向对象编程的封装特性。

2025-08-06 13:17:55 160

原创 7.switch是否作用在byte上,是否能作用在long上,是否能作用在String上

Java中switch语句的使用限制

2025-08-06 13:16:52 264

原创 1. Java基础部分总结

Java基础与程序设计摘要

2025-08-05 15:47:15 1439

原创 6.Java有哪些数据类型

Java数据类型分为基本类型和引用类型两大类。基本类型包括8种:boolean布尔型、char字符型,以及6种数值类型(byte、short、int、long、float、double)。引用类型则包括类、接口、数组等。基本类型直接存储数据值,而引用类型存储对象引用地址。这种分类方式体现了Java作为强类型语言的特点,确保了数据的安全性和程序的可靠性。

2025-08-05 10:34:32 244

原创 5.Oracle JDK 和 Open JDK 的区别

Oracle JDK 和 OpenJDK 在开源程度、稳定性及性能方面存在差异。OpenJDK 是完全开源的参考模型,而 Oracle JDK 是其商业实现版本,具有更完善的类库和错误修复,稳定性更高。Oracle JDK 经过专业团队维护和全面测试,更适合企业开发,同时在 JVM 性能和响应速度方面表现更优。商业软件建议选用 Oracle JDK,而开源项目则可考虑 OpenJDK。

2025-08-05 10:32:21 297

原创 4. 什么是字节码采用字节码的好处是什么

字节码是Java源文件编译后生成的中间代码(.class文件),它是实现Java"一次编写,到处运行"特性的关键。字节码通过类加载器被不同平台识别执行,具有高度可移植性。相比传统解释性语言,字节码提高了执行效率,同时保持了跨平台优势。以HelloWorld程序为例,javac编译后生成与平台无关的字节码文件,JVM在不同系统上都能执行该字节码。这种设计使Java兼具可移植性和较高性能。

2025-08-05 10:27:03 409

原创 3.JVM,JRE和JDK的关系是什么

JDK、JRE和JVM是Java开发中的核心组件,三者呈包含关系。JDK(Java开发工具包)是完整的开发环境,包含JRE以及编译器、调试器等开发工具。JRE(Java运行环境)仅支持运行编译后的Java程序,包含JVM和基础类库。JVM(Java虚拟机)负责执行Java字节码。简单来说,JDK包含JRE,JRE又包含JVM,三者共同构成Java从开发到运行的完整体系。

2025-08-04 20:43:48 298

原创 2.Java和C++有什么区别

Java和C++虽然都是面向对象语言,但在实现上有显著区别:Java不支持操作符重载和多继承(但可通过接口多实现),内置垃圾回收和多线程机制;而C++支持操作符重载、多继承,但需要手动内存管理且无原生多线程支持。此外,Java保留了但不使用goto关键字,代码更简洁。这些差异体现了Java的简化设计理念与C++的灵活性。

2025-08-04 20:40:45 182

原创 1.Java语言有什么特点

Java语言具有以下主要特点:1.面向对象,支持封装、继承和多态,便于设计低耦合项目;2.跨平台性强,通过JVM实现"一次编译,到处运行";3.支持网络编程;4.内置多线程机制;5.可靠性高且安全;6.兼具编译与解释特性。这些特点使Java成为广泛应用的编程语言。

2025-08-04 20:36:46 410

原创 RequestBody注解中Map

摘要: @RequestBody Map<String, Object> 在Spring Boot中用于动态接收不确定结构的JSON请求数据,适用于动态表单、快速原型开发等场景。相比固定DTO,它更灵活但需手动类型转换和校验。示例展示了如何操作Map字段、处理嵌套JSON及类型转换问题。虽然方便调试,但缺乏类型安全,建议生产环境优先使用DTO。注意事项包括字段校验、空值处理和性能权衡,适用于临时需求,长期项目推荐结构化DTO方案。(150字)

2025-05-23 22:43:28 1088

原创 MyBatis—动态 SQL

MyBatis 的动态 SQL 功能通过灵活的标签(如 <if>、<choose>、<where>、<set>、<foreach> 等)实现根据输入参数生成不同的 SQL 语句,提升代码的灵活性、可维护性和安全性。动态 SQL 的核心作用包括条件查询、批量操作、多表关联等复杂业务场景。其实现原理基于 XML 解析、SQL 拼接、参数绑定和预编译。最佳实践建议避免复杂嵌套、合理使用标签、测试生成的 SQL 并进行参数校验。通过动态 SQL,开发者可以

2025-05-16 23:56:02 1132

原创 SpringBoot文件上传

SpringBoot 文件上传的核心是通过 MultipartFile 接口处理 HTTP 文件上传。MultipartFile 封装了文件内容和元数据,提供了获取文件名、文件大小、文件类型等方法。在 Controller 层,通过 @RequestParam("file") MultipartFile file 接收前端上传的文件。为避免文件名冲突,通常使用 UUID.randomUUID().toString() 生成唯一文件名,并保留原始文件扩展名。接着,通过 Paths.get(

2025-05-14 00:35:15 1121

原创 Spring框架请求注解

Spring框架提供了多种请求注解,用于从不同来源提取请求参数。@RequestParam用于查询参数或表单数据,@RequestBody用于请求体中的JSON或XML数据,@PathVariable用于URL路径中的变量,@RequestHeader用于请求头,@CookieValue用于Cookie,@RequestPart用于处理文件上传与表单字段混合数据,@ModelAttribute用于将表单字段绑定到Java对象,@Param用于MyBatis中的SQL参数。这些注解提供了灵活性和清晰性,支持复

2025-05-13 19:58:48 334

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除