Java字符串与数值处理全解析:39个核心问题解决方案

一、字符串操作基础

1.1 字符统计与处理

统计重复字符数量

使用HashMap实现字符频率统计,时间复杂度O(n):

  1. public static Map<Character, Integer> countChars(String str) {
  2. Map<Character, Integer> map = new HashMap<>();
  3. for (char c : str.toCharArray()) {
  4. map.put(c, map.getOrDefault(c, 0) + 1);
  5. }
  6. return map;
  7. }

寻找第一个非重复字符

结合LinkedHashMap保持插入顺序特性:

  1. public static Character findFirstUnique(String str) {
  2. LinkedHashMap<Character, Integer> map = new LinkedHashMap<>();
  3. for (char c : str.toCharArray()) {
  4. map.put(c, map.getOrDefault(c, 0) + 1);
  5. }
  6. for (Map.Entry<Character, Integer> entry : map.entrySet()) {
  7. if (entry.getValue() == 1) return entry.getKey();
  8. }
  9. return null;
  10. }

1.2 字符串变换操作

反转字母与单词

双指针法实现高效反转:

  1. public static String reverseWords(String str) {
  2. String[] words = str.trim().split("\\s+");
  3. int left = 0, right = words.length - 1;
  4. while (left < right) {
  5. String temp = words[left];
  6. words[left] = words[right];
  7. words[right] = temp;
  8. left++;
  9. right--;
  10. }
  11. return String.join(" ", words);
  12. }

字符串回文检测

考虑Unicode字符与大小写敏感问题:

  1. public static boolean isPalindrome(String str) {
  2. String clean = str.replaceAll("[^a-zA-Z0-9]", "").toLowerCase();
  3. int left = 0, right = clean.length() - 1;
  4. while (left < right) {
  5. if (clean.charAt(left++) != clean.charAt(right--)) {
  6. return false;
  7. }
  8. }
  9. return true;
  10. }

二、数值处理进阶

2.1 类型转换与安全

安全类型转换

处理数值溢出场景的转换方法:

  1. public static int safeStringToInt(String str) {
  2. try {
  3. return Integer.parseInt(str);
  4. } catch (NumberFormatException e) {
  5. // 处理溢出或格式错误
  6. if (str.startsWith("-") && str.length() > 11 ||
  7. !str.startsWith("-") && str.length() > 10) {
  8. throw new ArithmeticException("Integer overflow");
  9. }
  10. return 0; // 或其他默认值
  11. }
  12. }

大数求和

使用BigInteger处理超大整数:

  1. public static String bigNumberSum(String num1, String num2) {
  2. BigInteger n1 = new BigInteger(num1);
  3. BigInteger n2 = new BigInteger(num2);
  4. return n1.add(n2).toString();
  5. }

2.2 浮点数处理

有限浮点数检测

避免NaN和Infinity的判断方法:

  1. public static boolean isFinite(double d) {
  2. return !Double.isInfinite(d) && !Double.isNaN(d);
  3. }

相邻浮点数比较

考虑浮点精度问题的比较方法:

  1. public static boolean approximatelyEqual(double a, double b, double epsilon) {
  2. return Math.abs(a - b) <= ((Math.abs(a) < Math.abs(b) ?
  3. Math.abs(b) : Math.abs(a)) * epsilon);
  4. }

三、高级应用场景

3.1 字符串组合与排列

生成全部排列组合

递归实现字符串全排列:

  1. public static List<String> permute(String str) {
  2. List<String> result = new ArrayList<>();
  3. backtrack(result, new StringBuilder(), str.toCharArray(), new boolean[str.length()]);
  4. return result;
  5. }
  6. private static void backtrack(List<String> result, StringBuilder sb,
  7. char[] chars, boolean[] used) {
  8. if (sb.length() == chars.length) {
  9. result.add(sb.toString());
  10. return;
  11. }
  12. for (int i = 0; i < chars.length; i++) {
  13. if (used[i]) continue;
  14. used[i] = true;
  15. sb.append(chars[i]);
  16. backtrack(result, sb, chars, used);
  17. sb.deleteCharAt(sb.length() - 1);
  18. used[i] = false;
  19. }
  20. }

用分隔符连接字符串

Java 8+的Stream实现方式:

  1. public static String joinWithDelimiter(List<String> strings, String delimiter) {
  2. return strings.stream().collect(Collectors.joining(delimiter));
  3. }

3.2 数字格式化处理

紧凑数字格式化

使用DecimalFormat实现千位分隔:

  1. public static String formatCompactNumber(long number) {
  2. DecimalFormat df = new DecimalFormat("#,###");
  3. return df.format(number);
  4. }

数值范围处理

安全计算取整除和模数:

  1. public static long[] safeDivide(long dividend, long divisor) {
  2. if (divisor == 0) throw new ArithmeticException("Division by zero");
  3. return new long[]{dividend / divisor, dividend % divisor};
  4. }

四、性能优化建议

  1. 字符串拼接优化:对于大量拼接操作,优先使用StringBuilder而非”+”操作符
  2. 正则表达式缓存:频繁使用的正则表达式应编译为Pattern对象复用
  3. 数值计算中间值:大数运算时使用更高精度类型作为中间变量
  4. 内存预分配:已知结果长度时,预先分配集合容量减少扩容开销

五、异常处理要点

  1. 数值转换时捕获NumberFormatException
  2. 大数运算前检查数值范围
  3. 浮点运算考虑精度损失问题
  4. 字符串操作注意空指针异常

本文通过39个典型场景的解决方案,系统展示了Java在字符串处理和数值计算方面的最佳实践。开发者可根据实际需求选择合适的方法,特别注意边界条件处理和性能优化,这些技巧在处理大规模数据或高并发场景时尤为重要。建议将常用方法封装为工具类,提高代码复用率和可维护性。