`
朱秋旭
  • 浏览: 228216 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

String与StringBuffer中substring性能分析

    博客分类:
  • JDK
阅读更多

在jdk1.6中,substring的使用要格外引起注意,首先我们来看看substring是如何实现的: 



 

通过源代码我们看到,直接返回了String对象,我们继续看一下String类的这个构造函数:

 

 

通过源代码我们清晰的看到其实就是直接修改了offset,和count,那就面临一个问题,如果我当前对象长度是1000,但是我只需要前2个,那么就会浪费掉998,通过给出的注释我们可以看到,这是jdk做的一次性能优化,所以我们在使用的时候要额外的小心空间的浪费。

 

注:String类中trim和split这两个常用的方法也用到了substring方法,所以在使用他们的时候要斟酌一下。

 

提到String就必须提到StringBuffer,同样看看StringBuffer类中的substring是如何实现的:

StringBuffer类调用的是AbstractStringBuilder中的substring方法:



 

 

 我们看到了明显的不同:StringBuffer中的substring方法调用的String的构造函数进行了一次数组的copy,这样就不存在String类中的空间浪费的问题了。

 

YY:应该是jdk的作者认为StringBuffer是用来拼接的,所以会比较长,理所当然要重新copy,防止浪费空间,而String一般都不会初始化那么长,所以做了一次offset,count改变达到优化性能,节省时间的母的。

可是笔者发现jdk1.7中String类的substring也是用了copy的方式,是有很多场景会出现从长的String取出短的几位吗?不知道!

不过总结一句:对的时间对的地点使用对的方法才是提高性能的王道。这里做一下简单的分析,大家使用的时候多多注意吧。

  • 大小: 26.5 KB
  • 大小: 10.5 KB
  • 大小: 19.9 KB
  • 大小: 27.7 KB
1
0
分享到:
评论
2 楼 朱秋旭 2014-09-11  
xurping 写道
jdk1.6的实现同时与String和StringBuffer的不同特点有关

1.String是不可变对象,所以可以多个String直接引用同一个char[]数组而不出现问题
2.StringBuffer是可以修改的,所以substring()必须使用copy,否则会导致修改源StringBuffer可能导致substring()结果改变的情况。

至于jdk1.7和jdk1.6的实现那个空间效率更高,还是看场景吧,如果同时保留源String和substring()得到的String,显然jdk1.6的实现性能更好。

如楼主所说,对的时间对的地点使用对的方法才是提高性能的王道。

谢谢回复,个人第二点说的很有道理,StringBuffer必须要用copy的方式,谢谢提醒
1 楼 xurping 2014-09-11  
jdk1.6的实现同时与String和StringBuffer的不同特点有关

1.String是不可变对象,所以可以多个String直接引用同一个char[]数组而不出现问题
2.StringBuffer是可以修改的,所以substring()必须使用copy,否则会导致修改源StringBuffer可能导致substring()结果改变的情况。

至于jdk1.7和jdk1.6的实现那个空间效率更高,还是看场景吧,如果同时保留源String和substring()得到的String,显然jdk1.6的实现性能更好。

如楼主所说,对的时间对的地点使用对的方法才是提高性能的王道。

相关推荐

    java字符串操作大全

    7、regionMatches() 用于比较一个字符串中特定区域与另一特定区域,它有一个重载的形式允许在比较中忽略大小写。  boolean regionMatches(int startIndex,String str2,int str2StartIndex,int numChars)  ...

    利用Java代码实现无字符+中文转换为全中文的代码

    //将字符串存入StringBuffer中 BufferedReader br = new BufferedReader(isr); String line = null; while ((line = br.readLine()) != null) { sb.append(line + "\n"); } br.close(); isr.close(); ...

    JavaCrawler

    StringBuffer sb = new StringBuffer();// 存储参数 String params = "";// 编码之后的参数 try { // 编码请求参数 if(parameters.size()==1){ for(String name:parameters.keySet()){ sb.append(name)....

    JAVA精华.rar

    String x=”a” 4 ”c”编译时等效于String x=new StringBuffer().append(“a”).append(4).append(“c”).toString(); 字符串常量是一种特殊的匿名对象,String s1=”hello”;String s2=”hello”;则s1==s2;因为...

    java计算器程序.doc

    static StringBuffer BS=new StringBuffer(""); //可创建空的字符串对象,这个很重要 static String str23=str22; public static void main(String args[]) throws IOException { frm1.setLayout(null); ...

    复杂邮件程序完整Java源码,支持添加附件,图片,HTML格式文本,支持远程WebService调用

    void sendMail(String sender,String password,String addressee,String subject,String text,Map<String,File> enclosures,Map<String,RecipientType> copyToSends) throws Exception; /** * sendMail 发送...

    java发送短信之AT指令

    public String sendAT(String atcommand) throws java.rmi.RemoteException { String s = ""; try { Thread.sleep(100); writeln(atcommand); Thread.sleep(80); s = read(); Thread.sleep(100); } catch ...

    Java精华(免费版)

    (1)在每一次循环中,都要先将string类型转换为stringbuffer类型,然后将‘*’追加进去,然后再调用tostring()方法,转换为string类型,效率很低。 (2)在没次循环中,都只是调用原来的那个stringbuffer对象,...

    一个web爬虫的事例.txt

    String disallowPath = line.substring("Disallow:" .length());// 获取不允许访问路径 // 检查是否有注释。 int commentIndex = disallowPath.indexOf("#"); if (commentIndex != -1) { disallowPath = ...

    Jsoup学习——Saz2Csv解析器

    5、Java中字符串的处理:String类和StringBuffer类,substring()、indexOf()、lastIndexOf()、replace()、replaceAll()、trim()、toLowerCase()、endsWith()、equals()、split()等方法的使用 6、Java类集:List,...

    fastjson-1.2.7.jar通用json文本解析实例(轻开IOS和安卓App服务器开发)

    String str = json.substring(0,pos); str = str.trim(); if(str.equals("")) { try { JSONArray jsonArr = JSON.parseArray(json); jsonArray2Bag(jsonArr,prefix,0); } catch ...

    ganymed-ssh2-build210.jar java远程访问linux服务器操作、上传下载文件

    String newPathName = tmpPathName.substring(0, tmpPathName.lastIndexOf(".")); sess.execCommand("mv " + remoteFileName + " " + newPathName);//重命名回来 conn.close(); } } catch (IOException ex) { ...

    java 编程基础题

    public String substring(int beginIndex, int endIndex):返回一个新的字符串,该 子字符串始于指定索引处的字符,一直到此字符串末尾。 public class GradeDemo { public static void main(String[] args) {...

    springmybatis

    性能也比hibernate好。而且也比较轻量级,因为当时在项目中,没来的及做很很多笔记。后来项目结束了,我也没写总结文档。已经过去好久了。但最近突然又对这个ORM 工具感兴趣。因为接下来自己的项目中很有可能采用这...

    蓝桥杯-基础练习12 十六进制转八进制 (最大测试数据10万位) 源码

    5.最后将StringBuffer转换为String输出,不然就是一直等待测评,我也不知道为什么,或许是我自己的问题吧。这里写图片描述 6.本题注意以下函数用法: ①BufferedReader in = new BufferedReader(new ...

    java8源码-JavaHomework:Java作业

    练习String对象与StringBuffer对象互相转换,测试StringBuffer类的添加、插入、删除、反转操作。 3. 写一个例子, 实现包装类与基本数据类型之间转换;实现包装类与字符串相互转换;实现基本数据类型与字符串之间...

    最新JAVA编程题全集_50题及答案

    String s = str.substring(i,i+1); set.add(s); } Iterator it = set.iterator(); while(it.hasNext()) { String sr =(String)it.next(); int k=0; for(int j=0;j();j++){ if(sr.equals...

    DES加密算法DES加密算法

    StringBuffer sb = new StringBuffer(len*2); for (int i = 0; i ; i++) { if ((A[i] & 0xFF) ) sb.append("0"); sb.append(Integer.toHexString(A[i] & 0xFF)); } return sb.toString(); } ...

    jsp探针 ver0.1

    String macAddressCandidate = line.substring(macAddressPosition + 6).trim(); if(linuxIsMacAddress(macAddressCandidate)) { lastMacAddress = macAddressCandidate; continue; } } java.text.ParseException ...

Global site tag (gtag.js) - Google Analytics