5分钟快速了解String.trim()到底做了什么事

目录
  • 前言
  • 说我们认知的trim()
  • 复习一个小概念
  • 养成一个好习惯
  • 动起来,不瞎掰
    • 示例1
    • 示例2
    • 示例3
    • 示例4
    • 示例5
    • 示例6
  • 5分钟直接看这里
  • 总结

前言

项目中遇到用String.trim()的地方,点进去看了trim()源码,以前一直以为trim()的作用只是去除字符串中的首尾的“空格”符,但是源码看下来,好像这个说法不太准确呢。

搞技术嘛,严谨一些,在这记录一下,大佬们也瞅瞅哈~

说我们认知的trim()

说到String.trim() 函数 ,就像前言说的一样,我的认知它就是搞首尾空格用的,虽然这个说法也没错哈。

那这都说到这了,不试试看说不过去对吧:

String str = " Hello World ";
System.out.println(str.length());
System.out.println(str.trim().length());

小字都是旁白:“搞掉了吗?看样子是搞掉了。” 所以说它去除首尾空格没毛病哈。

复习一个小概念

Java 语言规范规定,Java 的 char 类型是 UTF-16 的 code unit,也就是一定是16位(2字节)。

char(字符)的范围是:0-65535 or(\u0000~\uFFFF)

看图看图!

知乎一个大佬答主的回答:Java 语言中一个字符占几个字节?

我怎么会让各位大佬去看别的链接呢,当然,如果有时间的话,我会单独整理一篇奉上。

养成一个好习惯

养成一个好习惯,多看看源码,其实很多时候,源码里的注释或者源码流程中就已经很好的解释了。

而我们往往很多时候都不愿意去看源码。

小字都是旁白:“源码都是英文,看着都头疼。坚持看完,可解偏头疼哟~”

当然,即使大佬你真的不愿意去看源码。大佬您这都赏脸点进来了,自然由我来说给您听。

在 JDK 1.8 中trim()的源码注释里其实已经解释的很清楚了:

1. 删除任何前置和后置空格;

2. 如果String对象表示一个空字符,则返回对这个String对象的引用;

总结:【trim()大佬说了:你这有一个二五崽(空格),我换一个新崽给你】

3. 如果String对象表示的字符的首和尾字符的编码都大于'\u0020'(空格字符),则返回对这个String对象的引用;

总结:【trim()大佬说了:空格前后有兄弟,我不搞你】

4. 如果String字符串中没有编码大于'\u0020'的字符,则返回一个表示空字符串的string对象;

总结:【trim()大佬说了:看你可怜,给你送你一个新崽(新String对象,空的,长度为0的)】

5. 假设 k 是代码大于'\u0020'的字符串中第一个字符的索引,假设 m 是代码大于''\u0020'的字符串中最后一个字符的索引。返回一个表示该字符串的子字符串,该子字符串以下标 k 处的字符开始,以下标 m 处的字符结束。即 substring(k, m + 1)。
总结:【trim()大佬说了:前后的二五崽(小于'\u0020')我都带走,老实崽和有兄弟的二五仔都给你留下了】
6. 如果使用trim()后的字符串长度不等于使用前的长度,就返回一个新崽(新String对象)给你;如果等于,就还给你以前的崽(原String对象)。
总结:【trim()大佬说了:不等于 -> 你这个崽有猫腻(长度变了),给你换一个新崽;等于 -> 你这个崽没得问题,带回去好好养起】

动起来,不瞎掰

示例 1-6 对应了上面6条 trim() 源码说明。实践是实现真理的唯一标准实践是实现,大佬们,我直接开整了哈。

示例1

   /**
	* 1.删除任何前置和后置空格;
	*/
	@Test
	public void str1(){
	   String str = " Hello World ";
	   System.out.println(str.length());
	   System.out.println("trim():" + str.trim().length());
	}

示例2

   /**
     * 你这有一个二五崽(空格),我换一个新崽给你
     */
    @Test
    public void str2(){
        // 如果String对象表示一个空字符,则返回对这个String对象的引用;
        String str1 = " ";
        System.out.println(str1.length());
        String str2 = str1.trim();
        System.out.println("trim()->" + str2.length());
        System.out.println(str1 == str2);
    }

示例3

    /**
     * 空格前后有兄弟,我不搞你
     */
    @Test
    public void str3(){
        String str1 = "aaa bbb ccc";
        System.out.println(str1.length());
        String str2 = str1.trim();
        System.out.println(str2.length());
    }

示例4

  /**
    * 看你可怜,给你送你一个新崽(新String对象,空的,长度为0的)
    */
    @Test
    public void str4(){
        // 你有32个崽;
        char[] chars = new char[32];
        for (int i = 0; i < 32; i++) {
            chars[i] = (char) i;
        }
        String oldStr = new String(chars);
        System.out.println(oldStr.length());
        // 可惜是32个二五崽
        String newStr = oldStr.trim();
        System.out.println(newStr.trim().length());
        System.out.println(oldStr == newStr);
    }

示例5

   /**
     * 假设 k 是代码大于'\u0020'的字符串中第一个字符的索引,
     * 假设 m 是代码大于''\u0020'的字符串中最后一个字符的索引。
     * 返回一个表示该字符串的子字符串,该子字符串以下标 k 处的
     * 字符开始,以下标m处的字符结束。即substring(k, m + 1)。
     */
    @Test
    public void str5(){
        // 先准备8个崽
        char[] chars = new char[8];
        // 3个二五崽
        for (int i = 0; i < 3; i++) {
            chars[i] = (char) i;
        }
        chars[3] = 65;
        chars[4] = 66;
        // 二五崽(小于空格符,空格符是32)
        chars[5] = 31;
        chars[6] = 68;
        // 二五崽(小于空格符,空格符是32)
        chars[7] = 21;
        String oldStr = new String(chars);
        System.out.println("oldStr.length():" + oldStr.length());
        System.out.println("oldStr:" + oldStr);
        String newStr = oldStr.trim();
        System.out.println("newStr.length():" + newStr.length());
        System.out.println("newStr:" + newStr);
    }

示例6

/**
     * 不等于 -> 你这个崽有猫腻(长度变了),给你换一个新崽;等于 -> 你这个崽没得问题,带回去好好养起
     */
    @Test
    public void str6(){
        // 准备5个崽
        char[] chars = new char[5];
        // 3个二五崽
        for (int i = 0; i < 3; i++) {
            chars[i] = (char) i;
        }
        chars[3] = 65;
        chars[4] = 66;
        String str1 = new String(chars);
        String str2 = "ABCDE";

        String newStr1 = str1.trim();
        String newStr2 = str2.trim();

        System.out.println("str1.length():" + str1.length());
        System.out.println("newStr1.length():" + newStr1.length());
        System.out.println(str1 == newStr1);
        System.out.println("=========================\n");

        System.out.println("str2.length():" + str2.length());
        System.out.println("newStr2.length():" + newStr2.length());
        System.out.println(str2 == newStr2);
    }

5分钟直接看这里

trim()到底做了什么事

  1. 去除 String 中的首尾空格;
  2. 无法去除字符串中间含有空格的;
  3. 准确说实际去除的是小于十进制32(32就是空格,可以去看Ascii表)的所有字符。
  4. 当 String 中全是小于32的字符时,返回一个新的字符给你。
  5. String.trim() 长度变化就是新对象,无变化就还是自己。

trim()方法可以去除的字符明细可以通过以下函数进行输出:

public class StringTest {

public static void main(String[] args) {

char[] chars = new char[20];

chars[0] = ‘\u0000';

chars[1] = ‘\u0001';

chars[2] = ‘\u0002';

chars[3] = ‘\u0003';

chars[4] = ‘\u0004';

chars[5] = ‘\u0005';

chars[6] = ‘\u0006';

chars[7] = ‘\u0007';

chars[8] = ‘\u0008';

chars[9] = ‘\u0009';

chars[10] = ‘\u0010';

chars[11] = ‘\u0012';

chars[12] = ‘\u0013';

chars[13] = ‘\u0014';

chars[14] = ‘\u0015';

chars[15] = ‘\u0016';

chars[16] = ‘\u0017';

chars[17] = ‘\u0018';

chars[18] = ‘\u0019';

chars[19] = ‘\u0020';

for (int i = 0; i < chars.length; i++) { System.out.print("(" + i + ")" + chars[i] + " "); if (i != 0 && i % 5 == 0) { System.out.println(); } } } }

输出如下:

总结

到此这篇关于5分钟快速了解String.trim()到底做了什么事的文章就介绍到这了,更多相关5分钟了解String.trim()内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java中string.trim()函数的作用实例及源码

    trim()的作用:去掉字符串首尾的空格. public static void main(String arg[]){ String a=" hello world "; String b="hello world"; System.out.println(b.equals(a)); a=a.trim(); //去掉字符串首尾的空格 System.out.println(a.equals(b)); } 执行结果: a: hello world ,false a:h

  • Java string.trim()究竟去掉了什么

    String.Trim()方法到底为我们做了什么,仅仅是去除字符串两端的空格吗? trim()方法去掉了哪些字符? trim()/substring()怎样返回字符串对象? trim()方法去掉了哪些字符? 在Stack Overflow上看到一个问题(点此查看): I am receiving a string from server trailing one or two lines of spaces like below given string. String str = "abc**

  • 5分钟快速了解String.trim()到底做了什么事

    目录 前言 说我们认知的trim() 复习一个小概念 养成一个好习惯 动起来,不瞎掰 示例1 示例2 示例3 示例4 示例5 示例6 5分钟直接看这里 总结 前言 项目中遇到用String.trim()的地方,点进去看了trim()源码,以前一直以为trim()的作用只是去除字符串中的首尾的"空格"符,但是源码看下来,好像这个说法不太准确呢. 搞技术嘛,严谨一些,在这记录一下,大佬们也瞅瞅哈~ 说我们认知的trim() 说到String.trim() 函数 ,就像前言说的一样,我的认知

  • 使用jQuery5分钟快速搞定双色表格的简单实例

    先看看这个使用jQuery做的双色表格的效果: 这个双色表格看上去应该觉得挺专业的,不过它用jQuery实现的确很简单. 第一步:写好css. <style type="text/css"> th { /*表头样式*/ background:#0066FF; color:#FFFFFF; line-height:20px; height:30px; } td { padding:6px 11px; border-bottom:1px solid #95bce2; verti

  • 30分钟快速入门掌握ES6/ES2015的核心内容(下)

    前言 在 30分钟掌握ES6/ES2015核心内容(上)我们讲解了es6最常用的一些语法:let, const, class, extends, super, arrow functions, template string, destructuring, default, rest arguments 俗话说打铁要趁热,今天我们继续讲es6其他几个非常有用的新特性. import export 这两个家伙对应的就是es6自己的module功能. 我们之前写的Javascript一直都没有模块化

  • 30分钟快速入门掌握ES6/ES2015的核心内容(上)

    前言 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015. 也就是说,ES6就是ES2015. 虽然目前并不是所有浏览器都能兼容ES6全部特性,但越来越多的程序员在实际项目当中已经开始使用ES6了.所以就算你现在不打算使用ES6,但为了看懂别人的你也该懂点ES6的语法了... 在我们正式讲解ES6语法之前,我们得先了解下Babel. Babel Babel是一个广泛使用的ES6转码器,

  • 3分钟快速搞懂Java的桥接方法示例

    什么是桥接方法? Java中的桥接方法(Bridge Method)是一种为了实现某些Java语言特性而由编译器自动生成的方法. 我们可以通过Method类的isBridge方法来判断一个方法是否是桥接方法. 在字节码文件中,桥接方法会被标记为ACC_BRIDGE和ACC_SYNTHETIC,其中ACC_BRIDGE用于表示该方法是由编译器产生的桥接方法,ACC_SYNTHETIC用于表示该方法是由编译器自动生成. 什么时候生成桥接方法? 为了实现哪些Java语言特性会生成桥接方法?最常见的两种

  • Vue.js 60分钟快速入门教程

    vuejs是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们能够快速地上手并使用Vue.js. 如果你之前已经习惯了用jQuery操作DOM,学习Vue.js时请先抛开手动操作DOM的思维,因为Vue.js是数据驱动的,你无需手动操作DOM.它通过一些特殊的HTML语法,将DOM和数据绑定起来.一旦你创建了绑定,DOM将和数据保持同步,每当变更了数据,DOM也会相应地更新. 当

  • 反向Ajax 30分钟快速掌握

    场景1:当有新邮件的时候,网页自动弹出提示信息而无需用户手动的刷新收件箱. 场景2:当用户的手机扫描完成页面中的二维码以后,页面会自动跳转. 场景3:在类似聊天室的环境中有任何人发言,所有登录用户都可以即时看见信息. 与传统的MVC模型请求必须从客户端发起由服务器响应相比,使用反向Ajax能够模拟服务器端主动向客户端推送事件从而提高用户体验.本文将分两个部分讨论反向Ajax技术,包括:Comet和WebSocket.文章旨在演示如何实现以上两种技术手段,Struts2或SpringMVC中的应用

  • 1分钟快速生成用于网页内容提取的xslt

    1分钟快速生成用于网页内容提取的xslt,具体内容如下 1.项目背景 在<Python即时网络爬虫项目说明>一文我们说过要做一个通用的网络爬虫,而且能节省程序员大半的时间,而焦点问题就是提取器使用的抓取规则需要快速生成.在python使用xslt提取网页数据一文,我们已经看到这个提取规则是xslt程序,在示例程序中,直接把一长段xslt赋值给变量,但是没有讲这一段xslt是怎么来的. 网友必然会质疑:这个xslt这么长,编写不是要花很长时间? 实际情况是,这个xslt是通过GooSeeker的

  • 5分钟快速上手Spring Boot

    概述 与一些动态语言(如Ruby.Groovy.Node.js)相比,Java开发显得异常笨重.接触过外包项目的朋友也有所了解,如果要开发一个小型项目,首选的编程语言并不是Java,而是PHP.为什么呢?因为开发起来快!目前很多大型互联网公司的早起编程语言都是类似PHP这种能够快速开发的语言. 既然问题出现了,那必然有解决问题的方案,SpringBoot做到了.SpringBoot是由Pivotal公司所属团队研发,该公司的企业宗旨为: 致力于"改变世界构造软件的方式(We are transf

随机推荐