`
jiayj198609
  • 浏览: 149877 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

java.lang.String中的trim()方法的详细使用介绍

    博客分类:
  • Java
阅读更多

String.Trim()方法到底为我们做了什么,仅仅是去除字符串两端的空格吗?

一直以为Trim()方法就是把字符串两端的空格字符给删去,其实我错了,而且错的比较离谱。

首先我直接反编译String类,找到Trim()方法:

public string Trim()
{
    return this.TrimHelper(WhitespaceChars, 2);
}TrimHelper方法有两个参数,第一个参数名WhitespaceChars,首字母尽然是大写的,肯定有文章,真不出我所料:

internal static readonly char[] WhitespaceChars; 这里只是定义它,没有赋值,而且是静态的,我们看看构造函数去,果然找到:

String类的构造函数static String(){ Empty = " "; WhitespaceChars = new char[] { '\t', '\n', '\v', '\f', '\r', ' ', '\x0085', '\x00a0', '?', ' ', ' ', ' ', ' ', '?', '?', '?', '?', '?', ' ', '?', '?', '\u2028', '\u2029', ' ', '?' }; }  
Trim方法就是把字符串两端的这些字符给删去?我很坚定的猜想到。
继续我们的探索,直接反编译TrimHelper,哇,也许这个才是我想要的,私有的TrimHelper方法:

TrimHelper方法private string TrimHelper(char[] trimChars, int trimType)
{
    int num = this.Length - 1;
    int startIndex = 0;
    if (trimType != 1)
    {
        startIndex = 0;
        while (startIndex < this.Length)
        {
            int index = 0;
            char ch = this[startIndex];
            index = 0;
            while (index < trimChars.Length)
            {
                if (trimChars[index] == ch)
                {
                    break;
                }
                index++;
            }
            if (index == trimChars.Length)
            {
                break;
            }
            startIndex++;
        }
    }
    if (trimType != 0)
    {
        num = this.Length - 1;
        while (num >= startIndex)
        {
            int num4 = 0;
            char ch2 = this[num];
            num4 = 0;
            while (num4 < trimChars.Length)
            {
                if (trimChars[num4] == ch2)
                {
                    break;
                }
                num4++;
            }
            if (num4 == trimChars.Length)
            {
                break;
            }
            num--;
        }
    }
    int length = (num - startIndex) + 1;
    if (length == this.Length)
    {
        return this;
    }
    if (length == 0)
    {
        return Empty;
    }
    return this.InternalSubString(startIndex, length, false);
} 经过分析和运行,基本上知道了这个方法是干什么的了。

TrimHelper方法有两个参数:

第一个参数trimChars,是要从字符串两端删除掉的字符的数组;

第二个参数trimType,是标识Trim的类型。就目前发现,trimType的取值有3个。当传入0时,去除字符串头部的空白字符,传入1时去除字符串尾部的空白字符,传入其他数值(比如2) 去除字符串两端的空白字符。

最后再看看真正执行字符串截取的方法:

InternalSubStringprivate unsafe string InternalSubString(int startIndex, int length, bool fAlwaysCopy)
{
    if (((startIndex == 0) && (length == this.Length)) && !fAlwaysCopy)
    {
        return this;
    }
    string str = FastAllocateString(length);
    fixed (char* chRef = &str.m_firstChar)
    {
        fixed (char* chRef2 = &this.m_firstChar)
        {
            wstrcpy(chRef, chRef2 + startIndex, length);
        }
    }
    return str;
} 原来也用指针的?第一次看到,效率应该比较高吧。
最后总结一下:
String.Trim()方法会去除字符串两端,不仅仅是空格字符,它总共能去除25种字符:
('\t', '\n', '\v', '\f', '\r', ' ', '\x0085', '\x00a0', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '?', '\u2028', '\u2029', ' ', '?')


如果你想保留其中的一个或多个(例如\t制表符,\n换行符,\r回车符等),请慎用Trim方法。

请注意,Trim删除的过程为从外到内,直到碰到一个非空白的字符为止,所以不管前后有多少个连续的空白字符都会被删除掉。

最后附上两个相关的方法(也是String类直接提供的),分别去除字符串头部空白字符的TrimStart方法和去除字符串尾部空白字符的 TrimEnd方法:

TrimStart和TrimEnd方法public string TrimStart(params char[] trimChars)
{
    if ((trimChars == null) || (trimChars.Length == 0))
    {
        trimChars = WhitespaceChars;
    }
    return this.TrimHelper(trimChars, 0);
}

public string TrimEnd(params char[] trimChars)
{
    if ((trimChars == null) || (trimChars.Length == 0))
    {
        trimChars = WhitespaceChars;
    }
    return this.TrimHelper(trimChars, 1);
}如果想去除字符串两端其他任意字符,可以考虑Trim他的重载兄弟:String.Trim(Char[]),传入你想要去除的哪些字符的数组。

源码奉上:

public string Trim(params char[] trimChars)
{
    if ((trimChars == null) || (trimChars.Length == 0))
    {
        trimChars = WhitespaceChars;
    }
    return this.TrimHelper(trimChars, 2);
}空格 != 空白字符,删除空格请使用: Trim(‘ ‘);

1
0
分享到:
评论
2 楼 悲水点画扇 2012-03-04  
而且trim(Char[]),trimStart()这些方法javaAPI中没有
1 楼 悲水点画扇 2012-03-04  
不错!不过我试了试。不能去掉‘?’

相关推荐

    Java类库复习——java.lang.String

    在Java编程语言中,`java.lang.String`是最重要的类之一,它是所有字符串操作的基础。这个类位于核心类库中,因此无需显式导入即可使用。本文将深入探讨`String`类的一些关键知识点,包括它的特性、构造方法、常用...

    Mybatis单个参数的if判断报异常There is no getter for property named 'xxx' in 'class java.lang.Integer'的解决方案

    然而,当遇到单个参数是基本类型如`java.lang.Integer`或`java.lang.String`时,如果按照处理对象类型的参数方式直接在`&lt;if&gt;`中使用参数名,可能会遇到异常`There is no getter for property named 'xxx' in 'class ...

    org.apache.commons.lang3.StringUtils.jar.rar

    Apache Commons Lang 是一个由 Apache 软件基金会开发的 Java 类库,它提供了一系列实用工具类,用于增强 JDK 内置的 String 类的功能。在给定的标题 "org.apache.commons.lang3.StringUtils.jar.rar" 中,我们可以...

    commons-lang-StringUtils.zip

    Commons Lang是Apache软件基金会开发的一个Java工具包,它提供了许多实用的函数,扩展了Java标准库中关于字符串处理的功能。`StringUtils`类是这个工具包中的核心类之一,专门用于处理字符串的各种操作,包括但不...

    10个Java经典的String面试题

    了解 String 的特点和使用方法是 Java 开发者必备的技能之一。下面我们将对 10 个 Java 经典的 String 面试题进行详细解答。 1. String 是基本数据类型吗? 答案:String 不是基本数据类型。Java 中的基本数据类型...

    10个Java经典的String面试题!.pdf

    9. **自定义java.lang.String类**:虽然理论上可以自定义`java.lang.String`,但由于Java类加载机制,系统会优先使用已存在的标准库版本,导致自定义版本无法正常使用。 10. **String与byte[]之间的转换**:要将...

    JAVA中常用类的常用方法.docx

    JAVA 中有许多常用的类,每个类都有其特定的方法,本文将对 java.lang.Object 类、String 类和 StringBuffer 类的常用方法进行讲解。 一、java.lang.Object类 java.lang.Object 类是 JAVA 中所有类的父类,它提供...

    Java常用包

    * trim()方法:删除字符串中的空白字符 * valueOf()方法:返回String对象 三、StringBuffer类 StringBuffer类提供了多种实例方法,包括: * append()方法:将字符串追加到缓冲区 * charAt()方法:返回缓冲区中的...

    Java中String类.pdf

    String类位于java.lang包中,意味着它无需显式导入即可在任何Java程序中使用。由于字符串在Java中被视为不可变对象,即一旦创建,就不能改变其内容,这确保了线程安全,并允许JVM对字符串进行优化。 String类提供了...

    完整版 Java初级教程 Java语言程序设计 第7章 Java中的常用类(共14页).ppt

    【Java初级教程】Java语言程序设计的第7章主要探讨了Java中的一些常用类,包括`java.lang.String`、`java.lang.StringBuilder`和`java.util.StringTokenizer`。以下是对这些类的详细解释: 1. **`java.lang.String`...

    java工具类.zip

    `java.lang.String`类本身就包含了大量用于操作字符串的工具方法,如concat、substring、replace、trim等。此外,`java.util.regex`包提供了正则表达式相关的工具,用于字符串匹配和替换。 8. **数学运算**: `...

    在Java程序中获取当前运行程序的路径

    首先,我们可以通过`java.lang.Class`类的`getResource`或`getResourceAsStream`方法来获取类路径中的资源文件路径。这两个方法都是在类路径中查找资源,返回一个URL对象,从中可以获取路径信息。例如,如果我们有一...

    java常用工具类

    以下是根据标题“java常用工具类”和描述中提到的“date工具类”、“string工具类”等进行的详细知识点解析: 1. **Date和Calendar工具类**: - `java.util.Date`:表示特定瞬间,精确到毫秒。但直接操作日期对象...

    java-API-String类

    通过上述介绍,我们了解了Java中的包概念以及`String`类的基本使用方法。在实际开发过程中,合理利用包的概念可以帮助我们更好地组织代码,提高程序的可读性和可维护性。同时,掌握`String`类的使用对于编写高质量的...

    Java-String类的常用方法总结.pdf

    String类还有许多其他的方法,如`trim()`(去除字符串两端的空白字符)、`toUpperCase()`和`toLowerCase()`(转换为大写或小写)、`indexOf()`和`lastIndexOf()`(查找子字符串的索引)、`startsWith()`和`endsWith...

    Java标准包中基本常用类和方法.docx

    Java 语言中的标准包(java.lang、java.util、java.awt 等)提供了许多基本常用类和方法,这些类和方法是 Java 编程的基础。本文将对 Java 标准包中基本常用类和方法进行概括和总结。 一、java.util 包 java.util ...

    比较全的java工具类

    - `java.lang.String`:不可变的字符串类,提供了丰富的操作方法,如`substring`, `indexOf`, `replace`, `trim`等。 - `java.lang.StringBuilder` 和 `java.lang.StringBuffer`:可变的字符串对象,用于构建和...

    JAVA【第5章:面向对象基础】_String类的常用方法.rar

    `String`类位于`java.lang`包中,因此在使用时无需显式导入。 下面我们将详细讲解几个重要的`String`类的方法: 1. **构造方法**: - `String()`:创建一个空字符串。 - `String(char[] array)`:根据字符数组...

    整理的若干java常用工具类

    3. **字符串操作**:`java.lang.String`类提供了大量的字符串处理方法,如concat()、substring()、trim()、indexOf()等,用于字符串连接、截取、去除空格、查找子串等操作。另外,`java.util.regex`包中的Pattern和...

Global site tag (gtag.js) - Google Analytics