在Java中修剪字符串的正确方法
Posted
技术标签:
【中文标题】在Java中修剪字符串的正确方法【英文标题】:Correct way to trim a string in Java 【发布时间】:2013-12-15 23:27:54 【问题描述】:在 Java 中,我这样做是为了修剪字符串:
String input = " some Thing ";
System.out.println("before->>"+input+"<<-");
input = input.trim();
System.out.println("after->>"+input+"<<-");
输出是:
before->> some Thing <<-
after->>some Thing<<-
有效。但我想知道是否通过为自己分配一个变量,我做对了。我不想通过创建另一个变量并将修剪后的值分配给它来浪费资源。我想就地进行修剪。
那么我这样做对吗?
【问题讨论】:
担心另一个变量消耗的资源几乎总是微优化。这种情况可能对程序的资源使用造成 0.0001% 的差异,但前提是优化编译器出现问题。 【参考方案1】:你做得对。来自the documentation:
字符串是常量;它们的值在创建后无法更改。字符串缓冲区支持可变字符串。因为 String 对象是不可变的,所以它们可以被共享。
同样来自documentation:
修剪
公共字符串修剪()
返回字符串的副本,带有前导和尾随空格 省略。如果此 String 对象表示一个空字符序列, 或表示的字符序列的第一个和最后一个字符 此 String 对象的代码都大于 '\u0020'(空格 字符),则返回对该 String 对象的引用。
否则,如果没有代码大于'\u0020'的字符 在字符串中,然后是一个表示空字符串的新 String 对象 被创建并返回。
否则,设 k 为字符串中第一个字符的索引 其代码大于 '\u0020',设 m 为 字符串中代码大于 '\u0020' 的最后一个字符。一种 创建了新的 String 对象,表示 this 的子字符串 以索引 k 处的字符开始并以 索引 m 处的字符——即 this.substring(k, m+1) 的结果。
此方法可用于从 字符串的开头和结尾。
返回:
删除前导和尾随空格的此字符串的副本,或者如果该字符串没有前导或尾随空格,则为该字符串 空间。
【讨论】:
【参考方案2】:作为strings in Java are immutable objects,无法就地执行修剪。修剪字符串的唯一方法是创建字符串的新修剪版本并将其返回(这就是 trim()
方法所做的)。
【讨论】:
【参考方案3】:理论上,您并没有将变量分配给自身。您正在将 trim() 方法的返回值分配给变量输入。
实际上,trim() 方法的实现已经过优化,因此它仅在必要时创建(并返回)另一个变量。在其他情况下(实际上不需要修剪),它会返回对原始字符串的引用(在这种情况下,您实际上是在为自己分配一个变量)。
见http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/String.java#String.trim%28%29
反正 trim() 不会修改原始字符串,所以这是正确的使用方法。
【讨论】:
【参考方案4】:String::strip…
旧的String::trim
方法有一个strange definition 或whitespace。
正如 here 所讨论的,Java 11 向 String
类添加了新的 strip…
方法。这些使用了更加通晓 Unicode 的空白定义。请参阅 Character::isWhitespace
的 JavaDoc 类中此定义的规则。
示例代码。
String input = " some Thing ";
System.out.println("before->>"+input+"<<-");
input = input.strip();
System.out.println("after->>"+input+"<<-");
或者您可以去除just the leading 或just the trailing 空格。
【讨论】:
【参考方案5】:传统的做法是使用内联的trim方法...例如:
String input = " some Thing ";
System.out.println("before->>"+input+"<<-");
System.out.println("after->>"+input.trim()+"<<-");
如果它是一个应该为所有用途修剪的字符串,请像之前一样修剪它。如果您想将您的意图传达给其他开发人员,那么像您一样重用相同的内存位置并不是一个坏主意。用 Java 编写时,内存管理不是关键问题,因为 Java 的“天赋”是您不需要管理它。
【讨论】:
【参考方案6】:是的,但是在垃圾收集器删除输入指向的原始值之前,仍然会有两个对象。 Java 中的字符串是不可变的。这是一个很好的解释:Immutability of Strings in Java。
【讨论】:
【参考方案7】:如果我们必须在不使用 Java 的 trim()、split() 方法的情况下修剪字符串,那么以下源代码可能会有所帮助。
static String allTrim(String str)
int j = 0;
int count = 0; // Number of extra spaces
int lspaces = 0;// Number of left spaces
char ch[] = str.toCharArray();
int len = str.length();
StringBuffer bchar = new StringBuffer();
if(ch[0] == ' ')
while(ch[j] == ' ')
lspaces++;
j++;
for(int i = lspaces; i < len; i++)
if(ch[i] != ' ')
if(count > 1 || count == 1)
bchar.append(' ');
count = 0;
bchar.append(ch[i]);
else if(ch[i] == ' ')
count++;
return bchar.toString();
【讨论】:
【参考方案8】:java 字符串 trim() 方法消除前导和尾随空格
public class StringTrimExample
public static void main(String args[])
String s1=" hello string ";
System.out.println(s1+"javatpoint");//without trim()
System.out.println(s1.trim()+"javatpoint");//with trim()
输出
hello string javatpoint
hello stringjavatpoint
【讨论】:
以上是关于在Java中修剪字符串的正确方法的主要内容,如果未能解决你的问题,请参考以下文章
java.sql.ResultSet 在增加列长度后返回修剪后的字符串