Android和Java中String.substring的不同实现
2014-09-25 00:25
387 查看
今天有幸去搜狗霸笔,有一题很有意思
考点是str2是否生成新的字符数组来保存"for sougou"
当时我认为String内部是封装了一个char[],无法像cpp一样首地址加上一个数字来做到char[]的重用
新的字符串必须进行一次ArrayCopy才能实现substring功能,所以肯定有新的内存生成
回来看了下实现
因为android studio开着,就看了下android下String.substring的实现,并截图发给了同学
利用成员变量offset保存下偏移量,直接把char[]引用给了新的String,没有申请内存
感叹好精妙的实现的同时,发现自己做错了
谁知道同学看了源代码后问我用的什么版本的jdk,和他那边的实现不一样
是的!!!在JDK中new了新内存了!!!
不得不说,google程序员确实更高一筹
更正下,不是google的修改,是openjdk和jdk的区别
String str1 = "test for sougou"; String str2 = str1.substring(5);
考点是str2是否生成新的字符数组来保存"for sougou"
当时我认为String内部是封装了一个char[],无法像cpp一样首地址加上一个数字来做到char[]的重用
新的字符串必须进行一次ArrayCopy才能实现substring功能,所以肯定有新的内存生成
回来看了下实现
因为android studio开着,就看了下android下String.substring的实现,并截图发给了同学
public String substring(int start) { if (start == 0) { return this; } if (start >= 0 && start <= count) { return new String(offset + start, count - start, value); } throw indexAndLength(start); }
String(int offset, int charCount, char[] chars) { this.value = chars; this.offset = offset; this.count = charCount; }
利用成员变量offset保存下偏移量,直接把char[]引用给了新的String,没有申请内存
感叹好精妙的实现的同时,发现自己做错了
谁知道同学看了源代码后问我用的什么版本的jdk,和他那边的实现不一样
public String substring(int beginIndex) { if (beginIndex < 0) { throw new StringIndexOutOfBoundsException(beginIndex); } int subLen = value.length - beginIndex; if (subLen < 0) { throw new StringIndexOutOfBoundsException(subLen); } return (beginIndex == 0) ? this : new String(value, beginIndex, subLen); }
public String(char value[], int offset, int count) { if (offset < 0) { throw new StringIndexOutOfBoundsException(offset); } if (count < 0) { throw new StringIndexOutOfBoundsException(count); } // Note: offset or count might be near -1>>>1. if (offset > value.length - count) { throw new StringIndexOutOfBoundsException(offset + count); } this.value = Arrays.copyOfRange(value, offset, offset+count); }除了beginIndex=0是直接返回当前外,其他都进行ArrayCopy
是的!!!在JDK中new了新内存了!!!
不得不说,google程序员确实更高一筹
更正下,不是google的修改,是openjdk和jdk的区别
相关文章推荐
- 【String实现】面试官,请不要再用Java面试题考Android开发者了!
- [置顶] Android开发之 当前日期String类型转date类型 java代码中实现方法
- android、Java下判断两个String是否相等 、EditText输入是否为空,限定输入数字的实现 总结
- HashMap在Android和Java中的不同实现
- Android开发之 当前日期String类型转date类型 java代码中实现方法
- android、Java下判断两个String是否相等 、EditText输入是否为空,限定输入数字的实现 总结
- HashMap在Android和Java中的不同实现
- 使用Kotlin实现Android简单Demo,对比JAVA实现分析具体语法不同之处(一)
- 使用Kotlin实现Android简单Demo,对比JAVA实现分析具体语法不同之处(二)
- Android使用typeface实现不同字体的调用显示及String转换为Unicode
- Android开发之 当前日期String类型转date类型 java代码中实现方法
- HashMap在Android和Java中的不同实现
- android、Java下判断两个String是否相等 、EditText输入是否为空,限定输入数字的实现
- Android的布局管理器与java中的实现方式不同
- 【贪吃蛇—Java程序员写Android游戏】系列 3. 用J2ME实现Android的Snake Sample详解
- 【贪吃蛇—Java程序员写Android游戏】系列5.Android新浪微博客户端实现——准备篇
- 【贪吃蛇—Java程序员写Android游戏】系列 2. 用J2ME实现Android的Snake Sample预览
- java反射中两种方法的不同(反射能否实现对类的私有方法的调用)
- 【贪吃蛇—Java程序员写Android游戏】系列5.Android新浪微博客户端实现——准备篇
- Android判断网络状态是否断开+Android完全关闭应用程序+ 本文讲述了Android中不同Activity之间的数据传递 — Bundle对象的实现(-)+Android中Bundle的使用示例