# Java原理示例代码规范 **Repository Path**: jesslee/java ## Basic Information - **Project Name**: Java原理示例代码规范 - **Description**: Java原理示例代码规范 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-09-15 - **Last Updated**: 2024-09-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Java原理示例代码规范 ## [Java 原理用法示例 && JVM && 代码规范详解系列目录](https://zhuanlan.zhihu.com/p/680495588) ## JVM系列 1. [【jvm系列】jstat选项用法示例详解](https://zhuanlan.zhihu.com/p/709745292) 2. [【jvm系列】jmap选项用法示例详解](https://zhuanlan.zhihu.com/p/709905322) 3. [【jvm系列】jinfo选项用法示例详解](https://zhuanlan.zhihu.com/p/709906748) 4. [【jvm系列】jhat选项用法示例详解](https://zhuanlan.zhihu.com/p/709958951) ## 基础篇 1. [Java编程语言中的基本数据类型](https://zhuanlan.zhihu.com/p/696664645)(脑图版) 2. [Java Date and LocalDate](https://zhuanlan.zhihu.com/p/696671563) ### 原理篇 1. [Java 中System原理用法示例源码系列详解](https://zhuanlan.zhihu.com/p/658402342) 2. [ClassLoader原理用法示例中文源码分析](https://zhuanlan.zhihu.com/p/661455457) 3. [Java中Object原理用法示例中文源码详解](https://zhuanlan.zhihu.com/p/659085979) 4. [Java中CLass类的原理用法示例中文源码详解](https://zhuanlan.zhihu.com/p/659375613) 5. [ Java可序列化接口Serializable原理全面用法示例源码分析](https://zhuanlan.zhihu.com/p/676475438) 6. [Java String类中的三个替换方法replaceFirst、replaceAll和replace原理用法示例源码详解](https://zhuanlan.zhihu.com/p/669720148) 7. [String类的split方法原理用法示例源码详解](https://zhuanlan.zhihu.com/p/669719926) 8. [AtomicReference由来原理用法源码详解](https://zhuanlan.zhihu.com/p/658477493) 9. [ScheduledThreadPoolExecutor原理用法示例源码详解](https://zhuanlan.zhihu.com/p/665818353) 10. [URL原理用法示例中文源码分析](https://zhuanlan.zhihu.com/p/661478893) 11. [Thread原理用法示例源码详解](https://zhuanlan.zhihu.com/p/661336681) 12. [ThreadLocal 原理源码详解](https://zhuanlan.zhihu.com/p/655310615) 13. [Enum枚举的原理源码详解](https://zhuanlan.zhihu.com/p/655311181) 14. [Synchronized 关键字的原理用法详解](https://zhuanlan.zhihu.com/p/655311568) 15. [AtomicInteger原理用法源码详解](https://zhuanlan.zhihu.com/p/655333163) ### 设计模式 1. [【设计模式】7种常见设计模型](https://zhuanlan.zhihu.com/p/717298439) 2. [【设计模式】接口隔离原则(Interface Segregation Principle)由来定义场景示例详解](https://zhuanlan.zhihu.com/p/652930356) 3. [【设计模式】迪米特法则(Law of Demeter)由来定义场景示例详解](https://zhuanlan.zhihu.com/p/652929553) 4. [【设计模式】开放封闭原则(Open-Closed Principle)由来定义场景示例详解](https://zhuanlan.zhihu.com/p/652930237) 5. [【设计模式】单一职责原则(Single Responsibility Principle)由来定义场景示例详解](https://zhuanlan.zhihu.com/p/652930442) 6. [【设计模式】Liskov替换原则(Liskov Substitution Principle)由来定义场景示例详解](https://zhuanlan.zhihu.com/p/652930488) 7. [【设计模式】合成复用原则(Composite Reuse Principle)由来定义场景示例详解](https://zhuanlan.zhihu.com/p/652930937) ### io系列 1. [Java FileInputStream 原理用法源码分析](https://zhuanlan.zhihu.com/p/655654717) 2. [Java FileDescriptor原理用法源码分析](https://zhuanlan.zhihu.com/p/655663718) 3. [Java InputStream 原理用法源码分析](https://zhuanlan.zhihu.com/p/655666190) 4. [Java PipedInputStream 原理用法源码分析](https://zhuanlan.zhihu.com/p/655667990) 5. [Java ByteArrayInputStream 原理用法源码分析](https://zhuanlan.zhihu.com/p/655670109) 6. [Java LineNumberReader原理用法源码分析](https://zhuanlan.zhihu.com/p/655694799) 7. [Java Reader原理示例源码分析](https://zhuanlan.zhihu.com/p/655695686) ### 接口系列 1. [java8 interface RandomAccess由来原理源码分析](https://zhuanlan.zhihu.com/p/656908874) 2. [Java8 Comparator interface接口原理示例源码详解](https://zhuanlan.zhihu.com/p/656909170) 3. [Java中interface接口定义用法示例官方详解](https://zhuanlan.zhihu.com/p/656622421) ### 泛型系列 1. [java generics泛型示例分类官方详解](https://zhuanlan.zhihu.com/p/656695573) 2. [Java 泛型示例官方详解](https://zhuanlan.zhihu.com/p/657059090) ### Java8集合系列 1. [Java8 Iterable接口新特性示例源码分析](https://zhuanlan.zhihu.com/p/656783857) 2. [java8 Collection新特性用法示例源码分析](https://zhuanlan.zhihu.com/p/656796340) 3. [Java8 List接口新特性示例源码分析](https://zhuanlan.zhihu.com/p/656817335) 4. [Java8 Map接口新特性示例源码分析](https://zhuanlan.zhihu.com/p/656818744) 5. [Java List原理示例源码详解](https://zhuanlan.zhihu.com/p/655920496) ### 包系列 1. [jdk源码包 java.lang详解](https://zhuanlan.zhihu.com/p/660017828) 2. [jdk源码包 java.io详解](https://zhuanlan.zhihu.com/p/660019148) 3. [jdk源码Java.net包详解](https://zhuanlan.zhihu.com/p/660357484) ## 规范系列 ### JAVA并发规范系列 1. [【Java代码并发规范】使用ThreadLocal时建议使用static修饰](https://zhuanlan.zhihu.com/p/654620105) 2. [【Java代码并发规范】在高并发环境中考虑锁的性能损耗](https://zhuanlan.zhihu.com/p/654621201) 3. [【Java代码并发规范】不允许使用Executors创建线程](https://zhuanlan.zhihu.com/p/654620914) 4. [【Java代码并发规范】通过volatile解决双重检查锁的延迟初始化问题](https://zhuanlan.zhihu.com/p/654620527) 5. [【Java代码并发规范】使用volatile解决多线程内存可见性问题](https://zhuanlan.zhihu.com/p/654620273) 6. [【Java代码并发规范】使用ThreadLocal时建议使用static修饰](https://zhuanlan.zhihu.com/p/654620105) 7. [【Java代码并发规范】使用ScheduledExecutorService代替Timer进行定时任务并行处理](https://zhuanlan.zhihu.com/p/654619962) 8. [【Java代码并发规范】多个资源加锁时保持一致的加锁顺序](https://zhuanlan.zhihu.com/p/654619848) 9. [【Java代码并发规范】并发修改同一记录时的加锁策略](https://zhuanlan.zhihu.com/p/654619755) 10. [【Java代码并发规范】避免多线程共享Random实例](https://zhuanlan.zhihu.com/p/654619676) 11. [【Java代码并发规范】之避免HashMap在高并发下出现死链](https://zhuanlan.zhihu.com/p/654619431) 12. [【Java代码并发规范】SimpleDateFormat的线程安全使用](https://zhuanlan.zhihu.com/p/654619249) 13. [【Java代码并发规范】之使用CountDownLatch实现异步转同步操作](https://zhuanlan.zhihu.com/p/654619085) ### JAVA集合规范系列 1. [【Java代码规范系列集合】之泛型通配符使用](https://zhuanlan.zhihu.com/p/654290680) 2. [【Java代码规范系列集合】之集合转数组方法的使用](https://zhuanlan.zhihu.com/p/654290620) 3. [【Java代码规范系列集合】之避免在foreach循环中进行元素的remove/add操作](https://zhuanlan.zhihu.com/p/654290546) 4. [【Java代码规范系列集合】之Comparator的三个条件](https://zhuanlan.zhihu.com/p/654290502) 5. [【Java代码规范系列集合】之利用Set进行集合去重](https://zhuanlan.zhihu.com/p/654290431) 6. [【Java代码规范系列集合】集合初始化时指定初始值大小](https://zhuanlan.zhihu.com/p/654290351) 7. [【Java代码规范系列集合】之使用entrySet遍历Map集合键值对](https://zhuanlan.zhihu.com/p/654290277) 8. [【Java代码规范系列集合】之合理利用集合的有序性和稳定性](https://zhuanlan.zhihu.com/p/654290195) 9. [【Java代码规范系列集合】Arrays.asList()的限制](https://zhuanlan.zhihu.com/p/654290081) 10. [【Java代码规范系列集合】之注意Map集合存储null值的情况](https://zhuanlan.zhihu.com/p/654289999) ## Web&&后端系列 1. [权限控制 RBAC(Role-Based Access Control)概念角色分类示例](https://zhuanlan.zhihu.com/p/692647712) 2. [MyBatis-Plus 特性全面详解(思维导图图解)](https://zhuanlan.zhihu.com/p/694276753) 3. [【MyBatis教程1】配置、映射器、动态SQL--脑图收藏版](https://zhuanlan.zhihu.com/p/696667559) 4. [【MyBatis教程2】Java API 、SQL 语句构建器--脑图收藏版](https://zhuanlan.zhihu.com/p/696671422) 5. [从格林尼治标准时间(GMT)到世界时间标准UTC](https://zhuanlan.zhihu.com/p/693967384) 6. [OAuth2.0 由来原理认证权威详解](https://zhuanlan.zhihu.com/p/664408570) 7. [FreeMarker模板引擎的由来原理场景示例详解](https://zhuanlan.zhihu.com/p/694578255) 8. [RBAC ABAC ARBAC概念、原理及其在不同场景下的应用](https://zhuanlan.zhihu.com/p/713550482) 9. [【web系列】X-Forwarded-For由来原理语法示例详解](https://zhuanlan.zhihu.com/p/713768773) 10. [【web系列】JSON Web Token (JWT) 简介](https://zhuanlan.zhihu.com/p/714438233) 11. [【web系列】刷新令牌是什么以及如何安全地使用它们](https://zhuanlan.zhihu.com/p/714438667) 12. [【web系列】身份验证 (Authentication) 、 授权 (Authorization) 、 OpenID Connect (OIDC)](https://zhuanlan.zhihu.com/p/714442507) 13. [【mq系列】MQTT 入门指南](https://zhuanlan.zhihu.com/p/720784310) ## 数据库 1. [【Redis入门系列】Jedis java指南](https://zhuanlan.zhihu.com/p/712967922) 2. [【Redis入门系列】连接到 Redis && redis-cli使用选项用法示例详解](https://zhuanlan.zhihu.com/p/712960775) ![img](https://pica.zhimg.com/80/v2-bcb753468326927afd1bb05d41259b84_720w.webp) ## [String类中的三个替换方法replaceFirst、replaceAll和replace原理用法示例源码详解](https://zhuanlan.zhihu.com/p/669720148) *源自专栏《[Java 原理用法示例 &&代码规范详解系列目录](https://zhuanlan.zhihu.com/p/680495588)》欢迎关注、收藏 不错过最新干货文章* ## 原理 这里是三种字符串替换方法的原理: - `replaceFirst()` 方法的原理是通过编译给定的正则表达式,然后使用编译后的模式创建一个匹配器对象,将该匹配器应用于目标字符串,并使用给定的替换字符串替换第一个匹配的子字符串。 - `replaceAll()` 方法的原理与 `replaceFirst()` 类似,也是通过编译给定的[正则表达式](https://zhida.zhihu.com/search?q=正则表达式&zhida_source=entity&is_preview=1),创建一个匹配器对象,将其应用于目标字符串,并使用给定的替换字符串替换所有匹配的子字符串。 - `replace()` 方法的原理是将目标字符串中的所有指定字符序列替换为另一个字符序列。它不使用正则表达式进行匹配,而是直接在目标字符串中搜索并替换目标字符序列。 这些方法都依赖于 `java.util.regex.Pattern` 和 `java.util.regex.Matcher` 类来进行正则表达式的解析和匹配。`Pattern` 类负责编译正则表达式,生成可供匹配使用的模式对象。`Matcher` 类负责应用[模式匹配](https://zhida.zhihu.com/search?q=模式匹配&zhida_source=entity&is_preview=1)器到目标字符串上,并执行[替换操作](https://zhida.zhihu.com/search?q=替换操作&zhida_source=entity&is_preview=1)。 当调用这些方法时,会按照指定的规则进行匹配和替换,并返回替换后的结果字符串。这些方法提供了灵活和强大的字符串替换功能,可以根据需要进行各种类型的替换操作。 ## 用法 ### replaceFirst方法: 1. 该方法使用给定的正则表达式进行匹配,并将第一个匹配到的子字符串替换为指定的替换字符串。 2. 首先,通过Pattern.compile(regex)编译正则表达式,然后创建Matcher对象,并使用replaceFirst方法进行替换操作。 3. 最终返回替换后的结果字符串。 ### replaceAll方法: 1. 该方法与replaceFirst方法类似,但不仅替换第一个匹配到的子字符串,而是替换所有匹配到的子字符串。 2. 同样,通过Pattern.compile(regex)编译正则表达式,创建Matcher对象,并使用replaceAll方法进行替换操作。 3. 返回替换后的结果字符串。 ### replace方法: 1. 该方法用于替换字符串中的目标字符序列(target)为指定的替换字符序列(replacement)。 2. 首先,通过Pattern.compile(target.toString(), Pattern.LITERAL)编译目标字符序列,将其视为字面量进行匹配。 3. 创建Matcher对象,并使用replaceAll方法进行替换操作。在替换过程中,使用Matcher.quoteReplacement方法对替换字符序列进行转义处理,以避免特殊字符的影响。 4. 返回替换后的结果字符串。 这些替换方法提供了在字符串中进行模式匹配并替换的功能,可以根据需要选择合适的方法进行字符串的替换操作。 ## 一般示例 ```java public class StringReplaceExamples { public static void main(String[] args) { // 示例 1: 替换字符串中的单个字符 String str1 = "Hello World"; String replacedStr1 = str1.replace('o', 'O'); System.out.println(replacedStr1); // 输出: HellO WOrld // 示例 2: 替换字符串中的子字符串 String str2 = "Hello World"; String replacedStr2 = str2.replace("World", "Universe"); System.out.println(replacedStr2); // 输出: Hello Universe // 示例 3: 使用正则表达式替换字符串 String str3 = "Hello, my name is John"; String replacedStr3 = str3.replaceAll("John", "Alice"); System.out.println(replacedStr3); // 输出: Hello, my name is Alice // 示例 4: 忽略大小写替换字符串 String str4 = "Hello World"; String replacedStr4 = str4.replaceAll("(?i)hello", "Hi"); System.out.println(replacedStr4); // 输出: Hi World // 示例 5: 替换特殊字符 String str5 = "Hello $ World"; String replacedStr5 = str5.replace("$", "\\$"); System.out.println(replacedStr5); // 输出: Hello \$ World // 示例 6: 替换单词边界处的字符串 String str6 = "Hello Bob, welcome to Bob's World!"; String replacedStr6 = str6.replaceAll("\\bBob\\b", "Alice"); System.out.println(replacedStr6); // 输出: Hello Alice, welcome to Bob's World! // 示例 7: 删除字符串中的空格 String str7 = " Hello World "; String replacedStr7 = str7.replace(" ", ""); System.out.println(replacedStr7); // 输出: HelloWorld // 示例 8: 使用引用替换匹配到的字符串 String str8 = "Hello, my name is John Doe"; String replacedStr8 = str8.replaceAll("John (Doe)", "Mr. $1"); System.out.println(replacedStr8); // 输出: Hello, my name is Mr. Doe // 示例 9: 替换字符串中的数字 String str9 = "Age: 25, Height: 180cm"; String replacedStr9 = str9.replaceAll("\\d+", "*"); System.out.println(replacedStr9); // 输出: Age: *, Height: *cm // 示例 10: 在匹配的子串前后添加特定字符 String str10 = "apple, banana, cherry"; String replacedStr10 = str10.replaceAll("(?<=, )", "-").replaceAll("(?=,)", "-"); System.out.println(replacedStr10); // 输出: apple- banana- cherry } } ``` ## 高级用法 ### 1.正则表达式替换: 使用 replaceAll() 方法可以通过正则表达式来进行字符串替换。正则表达式可以匹配更复杂的模式,从而实现更精确的替换操作。 示例: ```java String str = "Hello, 123456!"; String replacedStr = str.replaceAll("\\d", "*"); System.out.println(replacedStr); // 输出: Hello, ****! ``` ### 2.引用替换: 在替换字符串中,可以使用引用 $ 来引用正则表达式中匹配到的内容。这样可以在替换字符串中动态地插入匹配到的文本。 示例: ```java String str = "Hello, my name is John Doe"; String replacedStr = str.replaceAll("John (Doe)", "Mr. $1"); System.out.println(replacedStr); // 输出: Hello, my name is Mr. Doe ``` ### 3.替换[回调函数](https://zhida.zhihu.com/search?q=回调函数&zhida_source=entity&is_preview=1): Java 8 中引入了 replaceAll() 方法的重载版本,该方法接受一个 Lambda 表达式作为替换参数。可以通过回调函数动态地生成替换字符串。 示例: ```java String str = "Hello World"; String replacedStr = str.replaceAll("o", m -> m.group().toUpperCase()); System.out.println(replacedStr); // 输出: HellO WOrld ``` ### 4.使用预定义[字符集](https://zhida.zhihu.com/search?q=字符集&zhida_source=entity&is_preview=1)和断言: 正则表达式中有一些预定义的字符集和断言,可以用于更精确的替换操作,如单词边界、行首和行尾等。 示例: ```java String str = "Hello, my name is John Doe"; String replacedStr = str.replaceAll("\\bJohn\\b", "Alice"); System.out.println(replacedStr); // 输出: Hello, my name is Alice Doe ``` ### 5.替换特定位置的子串: 使用正则表达式中的捕获组和反向引用,可以在替换字符串中插入原始字符串的特定部分。 示例: ```java String str = "Hello, my name is John Doe"; String replacedStr = str.replaceAll("name is (\\w+)", "name is $1 Smith"); System.out.println(replacedStr); // 输出: Hello, my name is John Smith ``` ### 6.使用替换回调函数进行逻辑处理: 通过编写自定义的替换逻辑,可以实现更复杂的字符串处理。这在需要根据匹配结果进行动态替换时非常有用。 示例: ```java String str = "Hello, today is 2022-02-15"; String replacedStr = str.replaceAll("\\d{4}-\\d{2}-\\d{2}", m -> { String date = m.group(); int year = Integer.parseInt(date.substring(0, 4)); int month = Integer.parseInt(date.substring(5, 7)); int day = Integer.parseInt(date.substring(8, 10)); String newDate = String.format("%02d-%02d-%02d", day, month, year); return newDate; }); System.out.println(replacedStr); // 输出: Hello, today is 15-02-2022 ``` ### 7.字符串替换的性能优化: 对于大量的字符串替换操作,可以考虑使用 StringBuilder 或 StringBuffer 进行拼接,以提高性能。 示例: ```java String str = "Hello, World"; String replacedStr = str.replace("World", "Universe"); System.out.println(replacedStr); // 输出: Hello, Universe // 使用 StringBuilder 进行拼接,提高性能 StringBuilder sb = new StringBuilder(str); int index = sb.indexOf("World"); if (index != -1) { sb.replace(index, index + 5, "Universe"); } replacedStr = sb.toString(); System.out.println(replacedStr); // 输出: Hello, Universe ``` 这些高级用法可以帮助你更好地掌握字符串替换的技巧和方法。根据具体的需求,选择适当的方法和技术来实现复杂的字符串处理操作。 ## 区别 这里是对字符串进行替换的三种方法的区别: - `replaceFirst()` 方法会替换**第一个与给定正则表达式匹配**的子字符串。例如,在字符串 "Hello World" 中,将第一个字母 "l" 替换为大写字母 "L",结果为 "HeLlo World"。 - `replaceAll()` 方法会替换所有与**给定正则表达式匹配**的子字符串。例如,在字符串 "Hello World" 中,将所有字母 "l" 替换为大写字母 "L",结果为 "HeLLo WorLd"。 - `replace()` 方法会替换指定的字符序列。它**不使用正则表达式**进行匹配,而是直接替换目标序列。例如,在字符串 "Hello World" 中,将所有字母 "o" 替换为大写字母 "O",结果为 "HellO WOrld"。 请注意,`replaceFirst()` 和 `replaceAll()` 方法的参数是正则表达式,而 `replace()` 方法的参数是普通的字符序列。在替换过程中,如果替换字符串中包含特殊字符(如反斜杠和美元符号),可能会导致意外的结果。可以使用 `Matcher.quoteReplacement()` 方法来取消这些字符的特殊意义。 ## 如何选择 选择使用哪种替换方法取决于你的需求和情况: - 如果你只想替换第一个匹配的子字符串,可以使用 `replaceFirst()` 方法。 - 如果你想替换所有匹配的子字符串,可以使用 `replaceAll()` 方法。 - 如果你要替换的是固定的字符序列,而不是根据正则表达式进行匹配,可以使用 `replace()` 方法。 除此之外,还需要考虑以下因素: - 正则表达式的复杂度:如果你需要使用复杂的正则表达式进行匹配,那么应该选择使用 `replaceFirst()` 或 `replaceAll()` 方法。 - 性能考虑:在处理大量字符串时,`replace()` 方法通常比正则表达式更高效。因为它不涉及正则表达式的解析和匹配过程。 - 特殊字符的处理:如果你的替换字符串中包含特殊字符(如反斜杠和美元符号),可能会导致意外的结果。在这种情况下,你可以使用 `Matcher.quoteReplacement()` 方法来取消这些字符的特殊意义。 ## 中文源码 ```java /** * 使用给定的正则表达式替换此字符串中第一个与之匹配的子字符串。 * * 调用此方法的形式 str.replaceFirst(regex, repl) 生成的结果与表达式完全相同: * * Pattern.compile(regex).matcher(str).replaceFirst(repl) * * 注意,替换字符串中的反斜杠 (\) 和美元符号 ($) 可能导致结果与将其视为文字替换字符串时不同; * 参见 Matcher.replaceFirst。如果需要,请使用 Matcher.quoteReplacement 来取消这些字符的特殊意义。 * * @param regex 要匹配的正则表达式 * @param replacement 要替换第一个匹配项的字符串 * @return 结果字符串 * @throws PatternSyntaxException 如果正则表达式的语法无效 * @see java.util.regex.Pattern * @since 1.4 * @spec JSR-51 */ public String replaceFirst(String regex, String replacement) { return Pattern.compile(regex).matcher(this).replaceFirst(replacement); } /** * 使用给定的正则表达式替换此字符串中与之匹配的每个子字符串。 * * 调用此方法的形式 str.replaceAll(regex, repl) 生成的结果与表达式完全相同: * * Pattern.compile(regex).matcher(str).replaceAll(repl) * * 注意,替换字符串中的反斜杠 (\) 和美元符号 ($) 可能导致结果与将其视为文字替换字符串时不同; * 参见 Matcher.replaceAll。如果需要,请使用 Matcher.quoteReplacement 来取消这些字符的特殊意义。 * * @param regex 要匹配的正则表达式 * @param replacement 要替换每个匹配项的字符串 * @return 结果字符串 * @throws PatternSyntaxException 如果正则表达式的语法无效 * @see java.util.regex.Pattern * @since 1.4 * @spec JSR-51 */ public String replaceAll(String regex, String replacement) { return Pattern.compile(regex).matcher(this).replaceAll(replacement); } /** * 使用指定的字面目标序列替换此字符串中与之匹配的每个子字符串。替换从字符串的开头到结尾进行, * 例如,在字符串 "aaa" 中用 "b" 替换 "aa" 将导致 "ba" 而不是 "ab"。 * * @param target 要替换的字符序列 * @param replacement 替换的字符序列 * @return 结果字符串 * @since 1.5 */ public String replace(CharSequence target, CharSequence replacement) { return Pattern.compile(target.toString(), Pattern.LITERAL).matcher( this).replaceAll(Matcher.quoteReplacement(replacement.toString())); } ```