Python基础语法(三)—— 函数与面向对象
一、函数1.1 定义与调用用 def 关键字定义函数,不需要声明返回类型: 123456def greet(name): """这是一个文档字符串(docstring),描述函数功能。""" return f"Hello, {name}!"print(greet("Python")) # Hello, Python!print(greet.__doc__) # 查看文档字符串 1.2 参数类型12345678910111213141516171819202122232425# 位置参数 + 默认参数def greet(name, greeting="Hello"): return f"{greeting}, {name}!"print(greet("小明")) # Hello, 小明!print(g...
Java 性能优化实战经验总结
前言性能优化是软件工程中最容易被误解的领域之一。许多开发者凭直觉优化——“String 拼接比 StringBuilder 慢,所以我全局替换为 StringBuilder”——却从未测量过这样做是否真的解决了问题。本文从笔者多年项目经验出发,梳理 Java 性能优化的系统方法论、关键优化点以及常用工具,力求提供一份可操作、可复现的实战手册。 优化方法论:先测量,再优化性能优化的第一条铁律:没有测量就没有优化。在不知道瓶颈是什么的情况下盲目优化,不仅浪费时间,还可能引入新的问题。 推荐的优化流程: 建立性能基线:用工具(JMeter、Gatling、Arthas)记录当前系统的关键指标——响应时间(P50/P90/P99)、吞吐量、CPU 使用率、GC 频率与耗时。 定位瓶颈:通过火焰图、线程 dump、GC 日志、慢查询日志等手段,找出系统的真正瓶颈点。 提出假设:基于数据形成假设——“问题出在线程池满载导致排队”比”感觉是数据库慢了”更有价值。 实施优化:在一个受控的环境中进行改动。 验证效果:对比优化前后的指标,确认改进是真实有效的,而非偶然波动。 重...
Python基础语法(二)—— 流程控制
一、条件分支1.1 if-elif-elsePython 没有 switch,用 if-elif-else 处理所有分支逻辑: 12345678910111213score = 85if score >= 90: print("优秀")elif score >= 80: print("良好")elif score >= 60: print("及格")else: print("不及格")# 三目表达式(条件表达式)status = "及格" if score >= 60 else "不及格" 1.2 match-case(Python 3.10+)Python 3.10 引入了 match-case,类似 Java 的 switch 表达式,但更强大: 1234567891011121314151617181920212223day = 3match day: case 1: print(&qu...
Python基础语法(一)—— 变量与数据类型
一、第一个 Python 程序1print("Hello, Python!") 与 Java 不同,Python 不需要声明类、定义 main 方法——一行代码就能执行。Python 是解释型语言,逐行执行,简洁直观。 几个与 Java 的关键区别: 特性 Java Python 编译方式 先编译为字节码,再执行 解释执行(实际上也有 .pyc 缓存) 类型系统 静态强类型 动态强类型 代码块 { } 大括号 缩进(4 个空格) 语句结尾 ; 分号 换行即可 二、缩进 —— Python 的灵魂Python 用缩进表示代码块,没有大括号。缩进必须一致: 123456789if True: print("正确缩进") # 4 个空格 print("仍在 if 块内")print("if 块已结束") # 回退缩进# 错误示范:if True: print("OK") print("缩进不一致会报...
Java基础语法(三)—— 面向对象编程基础
一、类与对象类是对象的模板,对象是类的实例。 12345678910111213141516171819202122232425262728293031public class Student { // 属性(成员变量/字段) private String name; private int age; // 构造方法:创建对象时自动调用 public Student(String name, int age) { this.name = name; this.age = age; } // 方法(行为) public void study() { System.out.println(name + " 正在学习"); } // getter / setter public String getName() { return name; } public void setName(...
Java基础语法(二)—— 运算符与流程控制
一、运算符1.1 算术运算符12345678910111213141516int a = 10, b = 3;int sum = a + b; // 13 加法int diff = a - b; // 7 减法int prod = a * b; // 30 乘法int quot = a / b; // 3 除法(整数相除得整数,小数部分截断)int mod = a % b; // 1 取余(取模)// 自增自减int x = 5;x++; // 后置自增,x 变为 6(先用后加)++x; // 前置自增,x 变为 7(先加后用)int y = 5;int m = y++; // m = 5, y = 6(先用后加)int n = ++y; // n = 7, y = 7(先加后用) 1.2 赋值运算符123456int a = 10;a += 5; // a = a + 5 → 15a -= 3; // a = a - 3 → 12a *= 2; // a = a * 2 → 24a /= 4...
Java基础语法(一)—— 变量与数据类型
一、Java 程序的基本结构先看一个最简单的 Java 程序: 12345public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); }} 几个关键点: Java 是大小写敏感的语言,HelloWorld 和 helloworld 是两个不同的标识符 public class HelloWorld 声明了一个公共类,类名必须与文件名一致 main 方法是程序的入口,签名固定为 public static void main(String[] args) 每条语句以分号 ; 结尾 二、标识符与命名规范标识符用于给类、方法、变量命名,规则如下: 规则 示例 由字母、数字、下划线、美元符号组成 myVar, _count, $price 不能以数字开头 2var ❌,var2 ✅ 不能是关键字 class ❌,myClass ✅ ...
深入理解 Java 类加载机制
引言当你在代码中写下 new ArrayList<>() 时,JVM 需要先找到 ArrayList.class 的字节码,将其加载到内存中,验证其合法性,解析符号引用,并最终完成初始化——这一切都发生在对象创建之前。这个看似简单的过程背后,是一套精密的类加载机制(Class Loading Mechanism)。理解这一机制,是深入 JVM 和掌握高级 Java 开发的必经之路。 类加载的生命周期一个 Java 类从被加载到 JVM 中,到最终被卸载,其生命周期包含七个阶段: 1加载(Loading) → 验证(Verification) → 准备(Preparation) → 解析(Resolution) → 初始化(Initialization) → 使用(Using) → 卸载(Unloading) 其中,验证、准备、解析三个环节合称为链接(Linking)。 加载(Loading)加载阶段完成三件事: 通过类的全限定名获取定义该类的二进制字节流 将字节流代表的静态存储结构转换为方法区的运行时数据结构 在堆内存中生成代表该类的 java.lang.Clas...
设计模式在 Java 中的经典应用
前言设计模式(Design Patterns)是软件工程中反复出现的典型问题的通用解决方案。GoF(Gang of Four)在 1994 年出版的《设计模式:可复用面向对象软件的基础》一书,定义了 23 种经典设计模式。近三十年过去,这些模式不仅在 Java 生态中扎下了根,更在 Spring 等主流框架中得到了广泛而深刻的体现。本文将结合实际代码和框架源码,梳理设计模式在 Java 中的经典应用。 为什么 Java 开发者必须掌握设计模式Java 语言本身就是一门高度面向对象的语言,其标准库和第三方框架大量运用设计模式。理解设计模式意味着: 读懂框架源码:Spring、MyBatis、Netty 的源码中随处可见工厂、代理、模板方法等模式。 写出可维护的代码:设计模式提供了应对变化的词汇表和蓝图。 在团队中高效沟通:”这里用策略模式”比”这里用 if-else 判断然后调用不同方法”更精准。 创建型模式单例模式(Singleton)单例模式确保一个类只有一个实例,并提供全局访问点。Java 中有多种实现方式,从低到高列出: 123456789101112131415161...
Java 异常处理:从基础到最佳实践
引言异常处理看似简单——try-catch-finally 谁都会写。但在实际项目中,”怎么处理异常”远比”怎么捕获异常”更难回答。你是否见过这样的代码:空 catch 块、catch(Exception e) 一把梭、return null 代替异常传播、日志打印后又重新抛出?本文将梳理 Java 异常处理体系,剖析常见的反模式,并结合 Spring 框架和异步场景给出生产级最佳实践。 Java 异常体系Java 中所有异常事件都继承自 java.lang.Throwable: 1234567891011121314Throwable├── Error(错误)│ ├── OutOfMemoryError│ ├── StackOverflowError│ └── NoClassDefFoundError└── Exception(异常) ├── RuntimeException(运行时异常,非受检) │ ├── NullPointerException │ ├── IllegalArgumentException │ └── Ind...