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;
}

从源码可以看出,这个方法实际上是将字符串除了两端ASCII码小于空格的字符之外的部分截取出来返回,如果没有空格则将原字符串返回。

而这里也要再说一下substring()这个方法,同样附上源码:

public String substring(int beginIndex, int endIndex) {
if (beginIndex < 0) {
throw new StringIndexOutOfBoundsException(beginIndex);
}
if (endIndex > value.length) {
throw new StringIndexOutOfBoundsException(endIndex);
}
int subLen = endIndex - beginIndex;
if (subLen < 0) {
throw new StringIndexOutOfBoundsException(subLen);
}
return ((beginIndex == 0) && (endIndex == value.length)) ? this
: new String(value, beginIndex, subLen);
}

从substring()的源码可以看出,当输入的起始索引与同字符串的起始索引一致时,返回原字符串,而如果不一致且不抛异常的情况下,则将起始索引部分从字符串中截取下来,注意这里是新new了一个String对象!!然后将它返回。

所以说,这也是一个坑,举个例子:

        String str = "ab";
String str1 = (" a"+"b ").trim();
String str2 = ("a"+"b").trim();
System.out.println(str==str1);
System.out.println(str==str2);

上面str1因为两边有空格,所以调用trim()方法时,内部的substring()方法将会将截取的部分new成一个String对象,所以str==str1为false,因为一个指向常量池中的值,一个指向堆中的对象,地址不同;而str2因为两边并没有空格,所以trim()

方法直接返回原对象,所以str==str2为true,因为两个都是指向常量池中的值,且常量池中的值是唯一的,所以str和str2都指向常量池中ab的值,地址相同。

最新文章

  1. spring 自动扫描、注册的类是否可以定义构造函数
  2. java基础1_Java数据类型
  3. java 26 - 6 网络编程之 TCP协议 传输思路 以及 代码
  4. JQuery-Table斑马线
  5. Session 入库
  6. perl模块安装
  7. 用css实现3D立方体旋转特效
  8. 数组,集合,字符串,bean,map
  9. 重启tomcat服务操作
  10. C#Redis 常用key操作
  11. jmeter分布式压力测试之添加压力机
  12. lucene源码分析(7)Analyzer分析
  13. Mininet-wifi安装和简单使用
  14. Windows7 64bits下安装TensorFlow CPU版本(图文详解)
  15. ArcGIS API For Silverlight使用在线地图的多种方法总结
  16. C++_标准模板库STL概念介绍4-算法
  17. Entity Framework part1
  18. 各种Lisp系语言大检阅
  19. CODE FESTIVAL 2017 qual A--B-fLIP(换种想法,暴力枚举)
  20. $(&quot;#Upfile&quot;).MultiFile();

热门文章

  1. GDAL读取Shp问题解决:Unable to open EPSG support file gcs.csv
  2. Android 布局渲染流程与卡顿优化
  3. 第十七章 Metasploit Framework
  4. spark Streaming与kafka的集成消费
  5. index-css-添加类-移除类-toggleClass-attr
  6. char数据类型
  7. 数据库 查询第31-40行数据,ID不连续
  8. 【AtCoder】AtCoder Grand Contest 035 解题报告
  9. 题解 P2719 【搞笑世界杯】
  10. 【转】struts2的ActionInvocation分析(action调度者)