由于我们处理的日志需要过滤一些空格,因此大部分处理日志的程序中都用到了java.lang.String.trim()函数。直到有一次遇到一个诡异的问题,某个包含特殊字符的字符串被trim后居然也为空(虽然这种特殊字符也没有什么太大意义…)。
于是查看这个特殊字段,显示为^I(在Linux下可以通过cat -A命令能够查看这个特殊字符),对应键盘上的Tab键,于是便将trim()函数拉出来看了一下:
public String trim() { int len = value.length; int st = 0; char[] val = value; /* avoid getfield opcode */ while ((st < len) && (val[st] <= ' ')) { st++; } while ((st < len) && (val[len - 1] <= ' ')) { len--; } return ((st > 0) || (len < value.length)) ? substring(st, len) : this; }
果然,方法中表明,如果字符小于空格,就过滤掉,仔细阅读trim()函数的注释也可以得出这个结论:
Returns a string whose value is this string, with any leading and trailing whitespace removed. If this String object represents an empty character sequence, or the first and last characters of character sequence represented by this String object both have codes greater than '\u005Cu0020' (the space character), then a reference to this String object is returned. Otherwise, if there is no character with a code greater than '\u005Cu0020' in the string, then a String object representing an empty string is returned. Otherwise, let k be the index of the first character in the string whose code is greater than '\u005Cu0020', and let m be the index of the last character in the string whose code is greater than '\u005Cu0020'. A String object is returned, representing the substring of this string that begins with the character at index k and ends with the character at index m-that is, the result of this.substring(k, m + 1). This method may be used to trim whitespace (as defined above) from the beginning and end of a string. Returns: A string whose value is this string, with any leading and trailing white space removed, or this string if it has no leading or trailing white space.
那么,究竟什么样的字符会被删除过滤掉呢,搜索出ASCII码表:
其中可以看出,空格对应32,按照trim的逻辑,32之前的字符都是可以被过滤掉的,其中包含我们比较熟悉的水平制表符(^I),回车(^M),以及Hive中默认使用的字段分隔符^A等等。
正常应用情况下,我们不需要考虑trim()函数造成的这个影响,但是当不希望去掉这些特殊字符的时候,就必须要认真详细地研究一下这个可能会出现的问题了。
相关推荐
7. **String.trim()方法**:这个方法用于去除字符串开头和结尾的空白字符,如空格、制表符和换行符等。 8. **String的不可继承性**:由于String是final的,所以不能被其他类继承。这确保了String的实现细节不会被...
【Java初级教程】Java语言程序设计的第7章主要探讨了Java中的一些常用类,包括`java.lang.String`、`java.lang.StringBuilder`和`java.util.StringTokenizer`。以下是对这些类的详细解释: 1. **`java.lang.String`...
11. `public String trim()`:去除字符串两端的空白字符,如空格、制表符等。 了解并熟练掌握这些方法对于编写Java程序至关重要。例如,`substring(int beginIndex, int endIndex)`方法的使用需要注意,返回的字符...
3. **字符串操作**:`java.lang.String`类提供了大量的字符串处理方法,如concat()、substring()、trim()、indexOf()等,用于字符串连接、截取、去除空格、查找子串等操作。另外,`java.util.regex`包中的Pattern和...
- **编译**:使用`javac -d <目录> 源文件名.java`命令进行编译,其中`<目录>`是指定的存放`.class`文件的目录。 - **运行**:使用`java 包名.类名`命令来运行该类。 #### 六、jar文件 `jar`文件是Java的一种压缩...
* trim():去掉字符串前后的空格。 三、文本框和文本区 文本框和文本区是 Java 语言中常用的 GUI 组件。常用的方法包括: * TextField():构造文本框,一个字符长。 * TextField(int x):构造文本框,x 个字符长...
此外,`String`类还提供了`trim()`去除前导和尾部空格,`toUpperCase()`和`toLowerCase()`转换大小写,以及`split(regex)`根据正则表达式分割字符串等方法。 总之,`JAVA_String`是Java编程中不可或缺的部分,理解...
`StringUtils` 是一个针对 `java.lang.String` 类型对象进行操作的工具类,它作为 JDK 内置 `String` 类方法的一种补充。与原生的 `String` 类不同的是,`StringUtils` 提供了更加丰富的字符串处理功能,并且在设计...
- `StringUtils.isNotBlank(String str)`:判断字符串是否非空且不全是空白字符(包括空格、制表符、换行符等)。 - **Trimming** - `StringUtils.trim(String str)`:去除字符串两端的空白字符。 - `...
4. **字符串处理**:在Java中,可以使用`String`类的方法如`trim()`、`replace()`、`replaceAll()`来去除字符串中的空格、回车等字符。 5. **获取工程根路径**:在Java中,可以使用`System.getProperty("user.dir")...
Java.lang 包在编译时是被缺省导入的,在使用包中的任意类(例如:String)时,不需要使用 import 语句声明导入该包。 Object 类 Object 类是所有类的父类,提供了 equals 方法来比较两个对象的是否相等。equals ...
`trim`方法用于去除字符串首尾的空白字符(包括但不限于空格、制表符等),同时也会去除控制字符(ASCII码小于等于32的字符)。如果传入的字符串为`null`,则直接返回`null`。 **示例:** ```java System.out....
例如:<select id="selectByName" resultType="com.entity.Data" parameterType="java.lang.String"> select * from data where trim(data.name)=#{name} 通过对char类型字段的特殊处理,可以确保mybatis框架对...
如果你不希望这些空白,可以在正则表达式中添加`\b`来匹配边界,或者使用`trim()`方法去除额外的空格。 总的来说,Java中的`split()`方法是处理字符串的强大工具,它利用正则表达式的灵活性来满足各种分割需求。...
在Java编程方面,这个工具可能使用了Java的基础类库,如`java.util.Scanner`进行输入读取,`java.io`包进行文件操作,以及`java.lang.String`和`java.util.ArrayList`等处理文本和存储数据。可能还涉及到了字符串...
6. 去掉首尾空格:`trim()`方法。 7. 替换字符或子串:`replace()`方法。 8. 分割字符串:`split()`方法,根据指定的分隔符将字符串拆分成一个字符串数组。 掌握这些基础知识对于理解和编写Java程序至关重要,无论...
String newText = String.join(" ", words).trim(); // 重构句子 System.out.println("删除后的文本: " + newText); } } ``` 以上就是使用`StringBuffer`类判断一个字符串是否为对称字符串以及使用`...
if (f.getType().getName().equals("java.lang.String")) { ``` 如果字段是字符串类型,方法将获取该字段的名称,并使用`getFieldValue`方法获取对应的值。如果值为null,则跳过。否则,使用`trim()`方法去除空格,...
`StringUtils` API 是 Apache Commons Lang 库中的一个实用工具类,专门为处理 `java.lang.String` 对象提供了丰富的静态方法。这个库是对 Java 标准库中的 `String` 类方法的一个扩展,尤其在处理 `null` 和空白...