📄🦌🙌🐟🏖️
乘与零-cenyuio
让生活变的更有趣~
热门文章
按住 Shift 横向滚动
Java面试-6:基本数据类型

Java面试-6:基本数据类型

Java的基本数据类型分为数值型和非数值型两大类,共8种。数值型包括字节型(byte)、短整型(short)、整型(int)、长整型(long)、单精度浮点(float)和双精度浮点(double),用于存储数字;非数值型包括布尔型(boolean)和字符型(char),分别用于存储布尔值和单个字符。每种类型有不同的占用字节、取值范围和默认值,适用于不同的场景。例如,int是最常用的整型,double是最常用的小数类型,char支持Unicode编码,可存储中文字符。使用时需注意long和float的声明后缀(L和f),以及boolean只能取true/false,不能用0/1替代。基本数据类型直接存储值,速度快,是Java编程的基础。

Java面试-5:移位运算符

Java面试-5:移位运算符

移位运算符是编程语言中的基本运算符,广泛应用于高效计算、内存节省、位字段管理、哈希算法、数据压缩、数据校验和内存对齐等领域。Java 中有三种移位运算符:左移(`<<`)、带符号右移(`>>`)和无符号右移(`>>>`)。左移操作相当于乘以 2 的幂次方,右移操作相当于除以 2 的幂次方。移位运算符在 `HashMap` 等 JDK 源码中也有应用。移位操作符仅支持 `int` 和 `long` 类型,对 `short`、`byte`、`char` 类型进行移位前会先转换为 `int`。当移位位数超过数据类型的位数时,会先求余再进行移位操作。掌握移位运算符知识有助于理解源码和优化代码。

Java面试-4:自增自减运算符

Java面试-4:自增自减运算符

在Java编程中,处理整数类型变量的增减操作时,可以使用自增运算符(`++`)和自减运算符(`--`)来简化代码。这两种运算符可以放在变量之前(前缀形式)或之后(后缀形式)。前缀形式(如`++a`)会先对变量进行自增或自减操作,然后再使用变量的值;后缀形式(如`a++`)则会先使用变量的当前值,然后再进行自增或自减操作。为了方便记忆,可以采用口诀:“符号在前就先加/减,符号在后就后加/减”。通过示例代码可以看出,不同形式的运算符会导致变量在赋值或使用时的值不同。

Java面试-3:为什么说 Java 语言“编译与解释并存”?

Java面试-3:为什么说 Java 语言“编译与解释并存”?

文章详细解释了编译与解释的核心区别,并深入探讨了Java的“编译+解释”执行流程。编译型语言如C/C++直接将源代码编译成机器码,运行时无需额外处理;而解释型语言如早期Python则在运行时逐行解释执行源代码,无中间代码生成。Java则结合了两者的优点:首先,通过`javac`编译器将`.java`源代码编译成`.class`字节码文件(中间代码),这一步实现了“一次编译,到处运行”的跨平台特性;然后,JVM在执行字节码时,采用解释执行和即时编译(JIT)相结合的方式,解释器逐行翻译字节码为机器码,同时对热点代码进行编译优化,提升了运行效率。这种设计既保证了跨平台性,又优化了性能,是Java“Write Once, Run Anywhere”理念的核心支撑。

Java面试-2:什么是字节码?采用字节码的好处是什么?

Java面试-2:什么是字节码?采用字节码的好处是什么?

字节码(Bytecode)是介于源代码和机器码之间的中间代码,常见的例子是Java编写的`.java`源代码通过编译生成`.class`文件,其中包含的就是字节码。字节码并非直接供人类阅读或CPU执行,而是由Java虚拟机(JVM)执行。 采用字节码的主要好处有以下三点: 1. **跨平台性**:Java编译后的字节码可以在任何安装了JVM的系统上运行,实现了“一次编写,到处运行”的特性。 2. **虚拟机优化**:JVM可以对字节码进行即时编译(JIT)以提升性能,并提供内存管理、垃圾回收和安全检查等功能。 3. **语言无关性**:只要编译成标准字节码,多种语言如Kotlin、Scala、Groovy等都可以在JVM上运行,虚拟机负责屏蔽底层系统差异。 总结来说,字节码是虚拟机能理解和执行的中间指令,具备跨平台、可优化、安全和多语言兼容的优势。

Java面试-1:JVM、JDK、JRE的区别与联系

Java面试-1:JVM、JDK、JRE的区别与联系

本文详细介绍了Java开发中的三个核心概念:JVM、JRE和JDK,并分析了它们之间的关系和实际应用场景。JVM(Java虚拟机)是运行Java字节码的虚拟计算机,负责跨平台运行Java程序,管理内存和垃圾回收。JRE(Java运行时环境)是运行Java程序所需的最小环境,包含JVM和核心类库,适用于仅运行Java程序的场景。JDK(Java开发工具包)是开发Java程序的完整工具包,包含JRE和编译、调试等开发工具,适用于编写、编译和调试Java代码的场景。三者之间的关系可以总结为:**JDK ⊃ JRE ⊃ JVM**。实际使用中,开发用JDK,仅运行用JRE,跨平台靠JVM。

Spring框架在面试中常问的问题

Spring框架在面试中常问的问题

Spring框架是一个轻量级的JavaEE框架,主要解决企业应用的复杂性问题。其核心模块包括IOC(控制反转)容器、AOP(面向切面编程)和数据访问/集成层。IOC容器管理对象的创建和关系,实现松耦合和可扩展性;AOP处理横向关注点,如事务和安全;数据访问层支持多种持久化技术。Spring框架具有轻量级、控制反转、AOP支持、扩展性强等优点,并提供了统一的异常处理和事务管理接口。 控制反转(IOC)是一种编程技巧,将对象的装配和依赖关系的管理从应用程序转移到装配器,通过依赖注入实现。依赖注入有三种实现方式:构造器注入、Setter方法注入和接口注入。Spring的IOC容器通过配置文件管理对象的创建和生命周期,降低了代码耦合度。 Bean的生命周期包括实例化、属性填充、调用aware接口方法、前置和后置处理、初始化方法调用、完整对象获取和销毁。Spring的AOP实现和回调接口注册也在Bean生命周期中进行。

SpringBoot 的启动流程

SpringBoot 的启动流程

Spring Boot 应用启动过程包括多个步骤:首先,寻找带有 `@SpringBootApplication` 注解的启动类,并在其中执行 `main()` 方法。随后,实例化 `SpringApplication` 对象,设置应用参数(如是否显示 banner 或以 web 环境启动)。接着,调用 `SpringApplication.run()` 启动应用,准备环境并解析配置文件。之后,创建并刷新应用上下文,注册所有 Bean,包括自动配置的 Bean。应用启动监听器和初始化器执行自定义逻辑,自动配置机制根据类路径和配置属性自动配置应用。如果是 web 应用,启动内嵌服务器。启动完成后,执行 `CommandLineRunner` 和 `ApplicationRunner` 接口的 Bean,最终应用进入运行状态,准备接受请求。

SpringBoot 是如何实现自动配置的?

SpringBoot 是如何实现自动配置的?

SpringBoot 的自动配置基于“约定大于配置”的思想,通过多个关键机制实现。启动时,SpringBoot 会扫描 `classpath` 下的 `META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports` 文件,加载其中的自动配置类。这些类通过条件注解(如 `@ConditionalOnClass`、`@ConditionalOnMissingBean`)确保仅在满足特定条件下生效。例如,引入 `spring-boot-starter-data-redis` 时,自动配置会检测到 `LettuceConnectionFactory` 类,并在未创建 `RedisTemplate` 时自动配置连接池和模板对象。自动配置类通常存在于 `spring.factories` 或 `AutoConfiguration.imports` 中,条件装配避免冲突,配置优先级可通过 `@AutoConfigureAfter` 控制。`@EnableAutoConfiguration` 注解是触发整个自动配置链路的开关,许多第三方库(如 Nacos、MyBatis-Plus)也遵循这一模式,简化了初始化配置。

线上CPU飙高如何排查?

线上CPU飙高如何排查?

本文详细介绍了如何排查和定位系统中高 CPU 使用情况,特别是针对 Java 进程的高 CPU 问题。主要步骤包括:首先通过 `top` 命令查看系统整体 CPU 使用情况,重点关注用户态和内核态的 CPU 占比;其次,使用 `top` 命令定位高 CPU 的 Java 进程,并记录其 PID;最后,通过 `top -H -p <PID>` 命令查看该进程下的线程 CPU 占用情况,并将高消耗线程的 TID 转换为 16 进制,使用 `jstack` 抓取该线程的堆栈信息,分析 `RUNNABLE` 状态的线程以确定 CPU 消耗原因。 常见的高 CPU 场景包括正则表达式灾难性回溯、频繁序列化大对象以及线程池积压等问题。文章还补充了线上应急排查的建议,推荐使用 `top + jstack` 组合,并提到在容器环境中如何进行排查。总结指出,CPU 飙高排查的核心是通过系统、进程、线程/堆栈三步递进,关键命令包括 `top`、`printf`、`jstack`,常见问题多为正则回溯、大对象序列化和线程池积压。