【StringUtils】判断字符串是否有值,判断多个字符串是否相等

本文介绍了一个Android应用程序中使用的文本处理工具类,包括字符串有效性验证、格式化文件大小等功能,并提供了高亮显示和HTML样式字符串的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.dream.makerspace.utils;


import android.text.*;
import android.text.style.CharacterStyle;
import android.text.style.ForegroundColorSpan;

import java.text.DecimalFormat;

/**
 * Created by mwqi on 2014/6/8.
 */
public class StringUtils {
	public final static String UTF_8 = "utf-8";

	/** 判断字符串是否有值,如果为null或者是空字符串或者只有空格或者为"null"字符串,则返回true,否则则返回false */
	public static boolean isEmpty(String value) {
		if (value != null && !"".equalsIgnoreCase(value.trim()) && !"null".equalsIgnoreCase(value.trim())) {
			return false;
		} else {
			return true;
		}
	}

	/** 判断多个字符串是否相等,如果其中有一个为空字符串或者null,则返回false,只有全相等才返回true */
	public static boolean isEquals(String... agrs) {
		String last = null;
		for (int i = 0; i < agrs.length; i++) {
			String str = agrs[i];
			if (isEmpty(str)) {
				return false;
			}
			if (last != null && !str.equalsIgnoreCase(last)) {
				return false;
			}
			last = str;
		}
		return true;
	}

	/**
	 * 返回一个高亮spannable
	 * @param content 文本内容
	 * @param color   高亮颜色
	 * @param start   起始位置
	 * @param end     结束位置
	 * @return 高亮spannable
	 */
	public static CharSequence getHighLightText(String content, int color, int start, int end) {
		if (TextUtils.isEmpty(content)) {
			return "";
		}
		start = start >= 0 ? start : 0;
		end = end <= content.length() ? end : content.length();
		SpannableString spannable = new SpannableString(content);
		CharacterStyle span = new ForegroundColorSpan(color);
		spannable.setSpan(span, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
		return spannable;
	}

	/**
	 * 获取链接样式的字符串,即字符串下面有下划线
	 * @param resId 文字资源
	 * @return 返回链接样式的字符串
	 */
	public static Spanned getHtmlStyleString(int resId) {
		StringBuilder sb = new StringBuilder();
	//	sb.append("<a href=\"\"><u><b>").append(UIUtils.getString(resId)).append(" </b></u></a>");
		return Html.fromHtml(sb.toString());
	}

	/** 格式化文件大小,不保留末尾的0 */
	public static String formatFileSize(long len) {
		return formatFileSize(len, false);
	}

	/** 格式化文件大小,保留末尾的0,达到长度一致 */
	public static String formatFileSize(long len, boolean keepZero) {
		String size;
		DecimalFormat formatKeepTwoZero = new DecimalFormat("#.00");
		DecimalFormat formatKeepOneZero = new DecimalFormat("#.0");
		if (len < 1024) {
			size = String.valueOf(len + "B");
		} else if (len < 10 * 1024) {
			// [0, 10KB),保留两位小数
			size = String.valueOf(len * 100 / 1024 / (float) 100) + "KB";
		} else if (len < 100 * 1024) {
			// [10KB, 100KB),保留一位小数
			size = String.valueOf(len * 10 / 1024 / (float) 10) + "KB";
		} else if (len < 1024 * 1024) {
			// [100KB, 1MB),个位四舍五入
			size = String.valueOf(len / 1024) + "KB";
		} else if (len < 10 * 1024 * 1024) {
			// [1MB, 10MB),保留两位小数
			if (keepZero) {
				size = String.valueOf(formatKeepTwoZero.format(len * 100 / 1024 / 1024 / (float) 100)) + "MB";
			} else {
				size = String.valueOf(len * 100 / 1024 / 1024 / (float) 100) + "MB";
			}
		} else if (len < 100 * 1024 * 1024) {
			// [10MB, 100MB),保留一位小数
			if (keepZero) {
				size = String.valueOf(formatKeepOneZero.format(len * 10 / 1024 / 1024 / (float) 10)) + "MB";
			} else {
				size = String.valueOf(len * 10 / 1024 / 1024 / (float) 10) + "MB";
			}
		} else if (len < 1024 * 1024 * 1024) {
			// [100MB, 1GB),个位四舍五入
			size = String.valueOf(len / 1024 / 1024) + "MB";
		} else {
			// [1GB, ...),保留两位小数
			size = String.valueOf(len * 100 / 1024 / 1024 / 1024 / (float) 100) + "GB";
		}
		return size;
	}
}

<think>好的,我现在要解决用户的问题:如何在编程中判断两个字符串是否相等。用户之前已经询问过浮点数相等的比较方法,现在转向字符串比较。根据用户提供的四个引用,我需要整合同编程语言中的字符串比较方法,并给出清晰的回答。 首先,用户提到的引用[1]是关于Shell脚本中字符串比较的,强调使用" = "或" == "时需要空格,否则会变成赋。引用[2]是ES6中使用严格等于运算符(===)比较字符串。引用[3]是Python中除了等号外,还提到startswith、endswith等方法,但用户当前问题聚焦在相等判断,可能需要重点讲==和is的区别。引用[4]是Java字符串比较,提到equals()方法和处理null的情况。 接下来,我需要考虑用户可能的真实需求。他们可能想知道同语言中字符串比较的正确方法,避免常见的错误,比如在Shell中空格问题,或者在Java中使用==的错误。此外,用户可能希望了解同语言的最佳实践,以及为什么某些方法更安全。 需要组织回答结构,分语言讲解,每个部分包括正确方法、常见误区和示例代码。同时,结合用户之前的浮点数比较回答,保持一致的格式,比如分点说明、代码块和注意事项。还要确保引用正确,比如在Shell部分引用[1],Java引用[4]等。 可能的问题点:用户是否想了解所有语言还是特定语言的比较方法?根据用户的问题,他们可能希望一个跨语言的指南,所以需要涵盖常见语言如Python、JavaJavaScript、Shell等。同时,需要指出同语言中的陷阱,比如Java中==和equals()的区别,Python中is和==的同。 需要验证每个语言的正确比较方式,确保示例代码准确。例如,在Shell中,比较字符串时必须有空格,否则会导致赋。在Java中,使用equals()而是==,因为==比较的是对象引用。在Python中,==比较,is比较对象ID。 最后,添加相关问题,帮助用户深入理解,比如同语言中字符串驻留机制,或者如何处理大小写敏感的比较。确保问题与用户之前的兴趣点相关,比如性能分析或优化方法,但这里可能涉及字符串比较的底层原理或高级技巧。</think>#### 如何正确判断两个字符串是否相等(跨语言指南) --- ### 一、核心原则与常见误区 1. **比较 vs 引用比较** - 比较:判断字符串内容完全相同(字符顺序、大小写、空格等) - 引用比较:判断内存地址是否相同(如Java的`==`操作符) - *误区*:在Java中使用`==`比较字符串内容会得到错误结果[^4] 2. **语言特性差异** - Shell中缺少空格会触发赋而非比较[^1] - Python中`is`运算符比较对象ID而非内容 --- ### 二、主流编程语言实现方法 #### 1. **Python** ```python # 正确方法:使用 == 运算符 str1 = "hello" str2 = "hello" print(str1 == str2) # True(相同) print(str1 is str2) # True(因字符串驻留优化,但可依赖此特性) # 处理大小写敏感比较 print("Hello".lower() == "hello".lower()) # True ``` #### 2. **Java** ```java // 正确方法:使用 equals() 方法 String str1 = new String("hello"); String str2 = new String("hello"); System.out.println(str1.equals(str2)); // true(比较) System.out.println(str1 == str2); // false(引用比较) // 处理null安全比较 boolean safeCompare = Objects.equals(str1, str2); // Java 7+ ``` #### 3. **JavaScript (ES6+)** ```javascript // 正确方法:使用 === 严格等于 const str1 = "hello"; const str2 = new String("hello"); console.log(str1 === str2); // false(同) console.log(str1 === str2.valueOf()); // true // 安全写法:显式转换型 function safeStringCompare(a, b) { return String(a) === String(b); } ``` #### 4. **Shell脚本** ```bash # 正确语法:保留空格[^1] str1="hello" str2="world" if [ "$str1" = "$str2" ]; then echo "Equal" else echo "Not equal" # 输出结果 fi ``` #### 5. **C/C++** ```cpp // 使用 strcmp 函数 #include <string.h> const char* str1 = "hello"; const char* str2 = "hello"; if (strcmp(str1, str2) == 0) { // 返回0表示相等 // 执行逻辑 } ``` --- ### 三、进阶场景处理 | 场景 | 解决方案 | 示例 | |---------------------|-----------------------------|-------------------------------| | **忽略大小写** | 统一转换为相同大小写 | Python: `str1.lower() == str2.lower()` | | **含空白字符** | 先执行`trim()`操作 | Java: `str1.trim().equals(str2.trim())` | | **多语言支持** | 使用Unicode规范化形式 | JavaScript: `'café'.normalize() === 'cafe\u0301'.normalize()` | | **安全比较** | 防时序攻击的恒定时间比较 | Python: `secrets.compare_digest(a, b)` | --- ### 四、最佳实践 1. **防御性编程** - 始终处理`null`/`undefined`(如Java的`Objects.equals()`) - 对用户输入先执行标准化处理(如去除首尾空格) 2. **性能优化** - 对高频比较操作使用`intern()`方法(Java字符串池) - 避免在循环中重复创建字符串对象 3. **代码可读性** - 封装工具函数(如`StringUtils.safeCompare()`) - 添加清晰的注释说明比较规则 --- ### 五、语言特性深度解析 1. **Python字符串驻留** - 小字符串(通常长度≤20)会自动复用内存 - 使用`sys.intern()`强制驻留大字符串优化性能 2. **Java字符串池机制** ```java String a = "hello"; // 放入常量池 String b = new String("hello"); // 堆中新对象 System.out.println(a == b); // false ``` 3. **JavaScript型隐式转换** ```javascript console.log(5 == "5"); // true(型转换) console.log(5 === "5"); // false(严格比较) ``` --- ### 相关问题 1. 如何实现跨语言的统一字符串比较标准? 2. 字符串驻留机制如何影响程序性能? 3. 在多字节编码(如UTF-8)下如何安全比较字符串? 4. 为什么Java的`String.equals()`要同时检查字符数组和长度?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值