Java常用API详解(一):基础高频API+实战避坑,新手必看

张开发
2026/4/21 9:46:24 15 分钟阅读

分享文章

Java常用API详解(一):基础高频API+实战避坑,新手必看
Java常用API详解一基础高频API实战避坑新手必看哈喽各位Java学习者、开发者小伙伴Java API是我们日常开发的“工具库”熟练掌握常用API能大幅提升开发效率避免重复造轮子。但很多新手刚接触时容易混淆API的用法甚至写出冗余、不安全的代码比如硬编码魔法值。本文作为Java常用API系列的第一篇聚焦最基础、最高频的API包括String类、StringBuilder/StringBuffer类、Object类以及结合你之前提供的「枚举替代魔法值」案例串联API的实战用法所有代码可直接复制运行同时标注新手常踩的坑帮你快速上手、少走弯路先回顾你之前提供的经典案例——用枚举替代魔法值这也是API结合枚举的基础实战我们以此为切入点展开今天的常用API讲解前置实战枚举替代魔法值避免硬编码衔接API实战在讲解API之前先巩固一个基础实战场景日常开发中我们经常会用到“固定常量”如用户角色新手容易直接硬编码字符串魔法值导致代码可读性差、修改困难而用枚举配合API能完美解决这个问题这也是枚举API的核心用法之一。反例魔法值硬编码新手常踩坑// 反例魔法值硬编码可读性差修改困难易出错 public class UserService { public void setUserRole(String role) { // 硬编码ADMIN、USER后续修改需逐个修改易遗漏 if (ADMIN.equals(role)) { // 管理员逻辑 } else if (USER.equals(role)) { // 普通用户逻辑 } } }正例枚举替代魔法值推荐结合枚举API// 正例枚举替代魔法值推荐可读性强类型安全 public enum UserRole { ADMIN(管理员), USER(普通用户); private final String desc; // 私有构造器禁止外部实例化枚举API的核心特性 private UserRole(String desc) { this.desc desc; } // 自定义API获取角色描述 public String getDesc() { return desc; } // 拓展API根据描述获取枚举实例实战常用 public static UserRole getByDesc(String desc) { for (UserRole role : UserRole.values()) { // values()是枚举的默认API if (role.getDesc().equals(desc)) { return role; } } return null; } } // 使用枚举避免魔法值代码更清晰结合String API public class UserService { public void setUserRole(UserRole role) { // 枚举直接比较无需字符串强转类型安全 if (UserRole.ADMIN role) { // 管理员逻辑 System.out.println(执行管理员操作角色 role.getDesc()); } else if (UserRole.USER role) { // 普通用户逻辑 System.out.println(执行普通用户操作角色 role.getDesc()); } } // 测试结合枚举API和String API public static void main(String[] args) { UserService service new UserService(); // 直接使用枚举常量 service.setUserRole(UserRole.ADMIN); // 输出执行管理员操作角色管理员 // 调用自定义API根据描述获取枚举 UserRole userRole UserRole.getByDesc(普通用户); service.setUserRole(userRole); // 输出执行普通用户操作角色普通用户 } }说明这里用到了枚举的默认APIvalues()和自定义APIgetDesc()、getByDesc()后续我们讲解的String、Object等API会频繁和枚举结合实现更优雅的代码。一、String类API最常用没有之一String类是Java中最基础的类用于表示字符串**不可变**一旦创建内容无法修改日常开发中几乎所有场景都会用到重点掌握以下高频API避免冗余代码和踩坑。1.1 核心构造方法常用2种// 1. 直接赋值推荐会复用常量池中的对象节省内存 String str1 Java常用API; // 2. 通过new关键字创建每次都会创建新对象不推荐频繁使用 String str2 new String(Java常用API); // 3. 通过字符数组创建偶尔用到 char[] chars {J,a,v,a}; String str3 new String(chars);坑点abc new String(abc)结果为false因为前者指向常量池后者指向堆内存判断字符串内容是否相等必须用equals()方法后面会讲。1.2 高频成员方法必记按“使用频率”排序重点掌握前8个结合代码示例理解可直接复制运行public class StringApiTest { public static void main(String[] args) { String str Java常用API新手必看; String str2 java常用api; // 1. equals()判断字符串内容是否相等区分大小写【最常用】 System.out.println(str.equals(Java常用API新手必看)); // true System.out.println(str.equals(str2)); // false // 2. equalsIgnoreCase()判断字符串内容是否相等不区分大小写 System.out.println(str.equalsIgnoreCase(str2)); // true // 3. length()获取字符串长度 System.out.println(str.length()); // 13包含中文、逗号、感叹号 // 4. charAt(int index)获取指定索引的字符索引从0开始 System.out.println(str.charAt(0)); // J System.out.println(str.charAt(4)); // 常 // 5. substring(int beginIndex)从指定索引开始截取字符串到末尾 String sub1 str.substring(4); System.out.println(sub1); // 常用API新手必看 // 6. substring(int beginIndex, int endIndex)截取[begin, end)之间的字符串左闭右开 String sub2 str.substring(0, 4); System.out.println(sub2); // Java // 7. contains(CharSequence s)判断字符串是否包含指定字符/字符串 System.out.println(str.contains(API)); // true System.out.println(str.contains(java)); // false // 8. isEmpty()判断字符串是否为空长度为0 String emptyStr ; System.out.println(emptyStr.isEmpty()); // true // 9. trim()去除字符串前后的空白字符空格、制表符等不去除中间空白 String str3 Java API ; System.out.println(str3.trim()); // Java API // 10. replace(CharSequence oldStr, CharSequence newStr)替换字符串中的指定内容 String str4 str.replace(新手必看, 开发者必备); System.out.println(str4); // Java常用API开发者必备 // 11. split(String regex)根据指定正则分割字符串返回字符串数组 String str5 Java,Python,Go; String[] arr str5.split(,); for (String s : arr) { System.out.print(s ); // Java Python Go } } }1.3 新手常踩坑点坑点1用判断字符串内容忽略equals()→ 解决判断内容用equals()判断地址用坑点2频繁使用String拼接字符串如循环中str a→ 解决用StringBuilder后面讲解避免创建大量临时对象坑点3substring(begin, end)误认为是“[begin, end]” → 记住左闭右开end索引对应的字符不包含坑点4isEmpty()和 null混淆 →isEmpty()判断长度为0 null判断对象是否存在两者无关联。二、StringBuilder StringBuffer 类API字符串拼接首选由于String类是不可变的每次拼接都会创建新的String对象频繁拼接如循环中会浪费内存、降低效率。而StringBuilder和StringBuffer是可变的专门用于字符串拼接两者用法几乎一致核心区别是StringBuilder线程不安全效率高日常开发首选单线程场景StringBuffer线程安全效率低多线程场景极少用。2.1 高频方法两者通用public class StringBuilderTest { public static void main(String[] args) { // 1. 创建对象推荐无参构造后续拼接 StringBuilder sb new StringBuilder(); // 2. append()拼接字符串最常用可拼接任意类型 sb.append(Java); sb.append(常用API); sb.append(1); sb.append(true); System.out.println(sb); // Java常用API1true // 3. insert(int offset, 任意类型)在指定位置插入内容 sb.insert(4, 基础); // 在索引4的位置插入基础 System.out.println(sb); // Java基础常用API1true // 4. delete(int start, int end)删除[start, end)之间的内容 sb.delete(8, 10); // 删除索引8-10之间的内容API中的AP System.out.println(sb); // Java基础常用I1true // 5. reverse()反转字符串 sb.reverse(); System.out.println(sb); // eurt1I用常础基avaJ // 6. toString()将StringBuilder转为String必用因为很多方法需要String类型 String result sb.toString(); System.out.println(result); // eurt1I用常础基avaJ // 7. setCharAt(int index, char ch)修改指定索引的字符 sb.setCharAt(0, T); System.out.println(sb); // Turt1I用常础基avaJ } }2.2 实战对比String vs StringBuilder 拼接效率看一个循环拼接的案例直观感受两者的效率差异public class EfficiencyTest { public static void main(String[] args) { // 1. String拼接效率极低 long start1 System.currentTimeMillis(); String str ; for (int i 0; i 10000; i) { str i; // 每次拼接都创建新对象 } long end1 System.currentTimeMillis(); System.out.println(String拼接耗时 (end1 - start1) ms); // 2. StringBuilder拼接效率极高 long start2 System.currentTimeMillis(); StringBuilder sb new StringBuilder(); for (int i 0; i 10000; i) { sb.append(i); // 直接在原有对象上修改不创建新对象 } long end2 System.currentTimeMillis(); System.out.println(StringBuilder拼接耗时 (end2 - start2) ms); } }运行结果参考String拼接耗时120ms StringBuilder拼接耗时1ms结论只要涉及频繁字符串拼接尤其是循环中优先用StringBuilder避免String拼接导致的效率问题。三、Object类API所有类的父类必懂Java中所有类包括我们自定义的类、String、枚举等都默认继承java.lang.Object类Object类中的方法是所有对象都具备的重点掌握4个高频方法也是面试常考的点。3.1 高频方法详解结合实战public class ObjectApiTest { public static void main(String[] args) { User user1 new User(张三, 20); User user2 new User(张三, 20); User user3 user1; // 1. equals(Object obj)判断两个对象是否相等默认比较地址可重写 // 未重写equals()时比较的是对象地址和一致 System.out.println(user1.equals(user2)); // false两个不同对象地址不同 System.out.println(user1.equals(user3)); // true同一个对象地址相同 // 2. hashCode()返回对象的哈希码int值用于哈希表如HashMap // 未重写hashCode()时哈希码和对象地址相关 System.out.println(user1.hashCode()); // 随机值不同对象不同 System.out.println(user2.hashCode()); // 随机值和user1不同 // 3. toString()返回对象的字符串表示默认格式类名哈希码十六进制 System.out.println(user1); // 未重写com.example.User1b6d3586 // 重写后见下面的User类返回自定义格式 System.out.println(user1.toString()); // 重写后User{name张三, age20} // 4. getClass()返回对象的运行时类Class对象不能重写 Class? clazz user1.getClass(); System.out.println(clazz.getName()); // 输出com.example.User } } // 自定义User类重写Object的equals()、hashCode()、toString()方法实战必备 class User { private String name; private int age; public User(String name, int age) { this.name name; this.age age; } // 重写equals()判断两个User对象的内容是否相等按业务需求定义 Override public boolean equals(Object o) { if (this o) return true; // 地址相同直接返回true if (o null || getClass() ! o.getClass()) return false; // 类型不同返回false User user (User) o; // 按业务字段判断name和age都相等才认为两个对象相等 return age user.age Objects.equals(name, user.name); } // 重写hashCode()和equals()保持一致相等的对象哈希码必须相同 Override public int hashCode() { return Objects.hash(name, age); } // 重写toString()返回直观的对象信息便于调试 Override public String toString() { return User{ name name \ , age age }; } // getter/setter省略 }3.2 核心注意点面试高频1.equals()和的区别比较对象的内存地址基本类型比较值引用类型比较地址equals()默认比较地址重写后可比较对象内容如String、User类。2. 重写equals()必须重写hashCode()规则相等的对象equals()返回true哈希码必须相同反之哈希码相同的对象equals()不一定返回true哈希冲突。3.toString()建议重写默认格式不直观重写后便于调试和日志输出。四、实战综合案例API结合使用结合前面讲解的String、StringBuilder、Object、枚举API写一个企业开发中常见的“用户角色校验”案例整合所有知识点代码可直接复用import java.util.Objects; // 1. 枚举定义用户角色避免魔法值 enum UserRole { ADMIN(管理员, 1), USER(普通用户, 2), GUEST(游客, 3); private final String desc; private final int code; UserRole(String desc, int code) { this.desc desc; this.code code; } // 自定义API根据角色编码获取枚举 public static UserRole getByCode(int code) { for (UserRole role : UserRole.values()) { if (role.code code) { return role; } } return null; } // 自定义API根据角色描述获取枚举结合String API public static UserRole getByDesc(String desc) { // 避免空指针先判断desc是否为空 if (desc null || desc.isEmpty()) { return null; } for (UserRole role : UserRole.values()) { // 不区分大小写提升用户体验结合String的equalsIgnoreCase() if (role.desc.equalsIgnoreCase(desc)) { return role; } } return null; } // getter方法 public String getDesc() { return desc; } public int getCode() { return code; } } // 2. 自定义User类重写Object的API class User { private String name; private int age; private UserRole role; public User(String name, int age, UserRole role) { this.name name; this.age age; this.role role; } // 重写equals()和hashCode() Override public boolean equals(Object o) { if (this o) return true; if (o null || getClass() ! o.getClass()) return false; User user (User) o; return age user.age Objects.equals(name, user.name) role user.role; } Override public int hashCode() { return Objects.hash(name, age, role); } // 重写toString()结合StringBuilder拼接 Override public String toString() { return new StringBuilder() .append(User{) .append(name).append(name).append(\) .append(, age).append(age) .append(, role).append(role.getDesc()) .append(, roleCode).append(role.getCode()) .append(}) .toString(); } // getter/setter省略 } // 3. 业务逻辑用户角色校验整合所有API public class UserRoleCheck { public static void main(String[] args) { // 1. 根据角色编码获取枚举实战中编码可能来自数据库 UserRole adminRole UserRole.getByCode(1); // 2. 创建用户对象 User admin new User(张三, 25, adminRole); // 3. 角色校验结合枚举API if (UserRole.ADMIN admin.getRole()) { System.out.println(用户 admin.getName() 是管理员拥有全部权限); } // 4. 输出用户信息重写的toString() System.out.println(admin); // 输出User{name张三, age25, role管理员, roleCode1} // 5. 字符串拼接结合StringBuilder StringBuilder sb new StringBuilder(); sb.append(用户名称).append(admin.getName()) .append(角色).append(admin.getRole().getDesc()) .append(权限等级).append(admin.getRole().getCode()); System.out.println(sb.toString()); // 输出用户名称张三角色管理员权限等级1 } }五、总结与后续预告本文作为Java常用API系列的第一篇重点讲解了3个核心类的高频API以及枚举API的实战用法都是日常开发中每天都会用到的知识点总结如下1. String类不可变字符串重点掌握equals()、substring()、contains()2. StringBuilder可变字符串拼接效率高重点掌握append()、toString()3. Object类所有类的父类重点掌握equals()、hashCode()、toString()的重写4. 枚举API替代魔法值提升代码可读性和安全性重点掌握values()和自定义API。新手建议把本文的代码全部复制运行一遍亲手操作才能记住API的用法同时注意规避文中提到的坑点如String拼接、equals和的区别。后续预告Java常用API二将讲解「集合类API」ArrayList、HashMap等这是后端开发中存储数据的核心工具敬请关注原创不易点赞收藏关注后续持续更新Java核心干货欢迎在评论区交流API使用中的问题~

更多文章