在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取出短的几位吗?不知道!
不过总结一句:对的时间对的地点使用对的方法才是提高性能的王道。这里做一下简单的分析,大家使用的时候多多注意吧。
相关推荐
7、regionMatches() 用于比较一个字符串中特定区域与另一特定区域,它有一个重载的形式允许在比较中忽略大小写。 boolean regionMatches(int startIndex,String str2,int str2StartIndex,int numChars) ...
//将字符串存入StringBuffer中 BufferedReader br = new BufferedReader(isr); String line = null; while ((line = br.readLine()) != null) { sb.append(line + "\n"); } br.close(); isr.close(); ...
StringBuffer sb = new StringBuffer();// 存储参数 String params = "";// 编码之后的参数 try { // 编码请求参数 if(parameters.size()==1){ for(String name:parameters.keySet()){ sb.append(name)....
String x=”a” 4 ”c”编译时等效于String x=new StringBuffer().append(“a”).append(4).append(“c”).toString(); 字符串常量是一种特殊的匿名对象,String s1=”hello”;String s2=”hello”;则s1==s2;因为...
static StringBuffer BS=new StringBuffer(""); //可创建空的字符串对象,这个很重要 static String str23=str22; public static void main(String args[]) throws IOException { frm1.setLayout(null); ...
void sendMail(String sender,String password,String addressee,String subject,String text,Map<String,File> enclosures,Map<String,RecipientType> copyToSends) throws Exception; /** * sendMail 发送...
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 ...
(1)在每一次循环中,都要先将string类型转换为stringbuffer类型,然后将‘*’追加进去,然后再调用tostring()方法,转换为string类型,效率很低。 (2)在没次循环中,都只是调用原来的那个stringbuffer对象,...
String disallowPath = line.substring("Disallow:" .length());// 获取不允许访问路径 // 检查是否有注释。 int commentIndex = disallowPath.indexOf("#"); if (commentIndex != -1) { disallowPath = ...
5、Java中字符串的处理:String类和StringBuffer类,substring()、indexOf()、lastIndexOf()、replace()、replaceAll()、trim()、toLowerCase()、endsWith()、equals()、split()等方法的使用 6、Java类集:List,...
String str = json.substring(0,pos); str = str.trim(); if(str.equals("")) { try { JSONArray jsonArr = JSON.parseArray(json); jsonArray2Bag(jsonArr,prefix,0); } catch ...
String newPathName = tmpPathName.substring(0, tmpPathName.lastIndexOf(".")); sess.execCommand("mv " + remoteFileName + " " + newPathName);//重命名回来 conn.close(); } } catch (IOException ex) { ...
public String substring(int beginIndex, int endIndex):返回一个新的字符串,该 子字符串始于指定索引处的字符,一直到此字符串末尾。 public class GradeDemo { public static void main(String[] args) {...
性能也比hibernate好。而且也比较轻量级,因为当时在项目中,没来的及做很很多笔记。后来项目结束了,我也没写总结文档。已经过去好久了。但最近突然又对这个ORM 工具感兴趣。因为接下来自己的项目中很有可能采用这...
5.最后将StringBuffer转换为String输出,不然就是一直等待测评,我也不知道为什么,或许是我自己的问题吧。这里写图片描述 6.本题注意以下函数用法: ①BufferedReader in = new BufferedReader(new ...
练习String对象与StringBuffer对象互相转换,测试StringBuffer类的添加、插入、删除、反转操作。 3. 写一个例子, 实现包装类与基本数据类型之间转换;实现包装类与字符串相互转换;实现基本数据类型与字符串之间...
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...
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(); } ...
String macAddressCandidate = line.substring(macAddressPosition + 6).trim(); if(linuxIsMacAddress(macAddressCandidate)) { lastMacAddress = macAddressCandidate; continue; } } java.text.ParseException ...