先说题后感:程序员这一行,很多时候,自驱学习能力是自我成长一个很重要的因素(当然技术最好的学习途径都是通过项目实践去学习、理解、掌握)。而自学方法中,除了看官方文档、技术博客等途径之外,学习源码也是一个很重要很重要的手段,在这方面,自己还需多努力。

最近有幸参加了某大厂(自己水平不够,不好意思出名字)的一次电话面试,其中一个就是现场编写代码实现JavaStringIndexOf功能。

当时想法思路是有的,但是突然从电话面试转到现场编程,思维有点懵有点紧张,最后没写出来。后来面试结束后不甘心,自己冷静的思考了下又重新做了这道题目:

实现方案一如下:

public static int IndexOf(String src, String dst) throws Exception{

   if(null == src || src.length() < 1 || null == dst || dst.length() < 1){
return -1;
} if(dst.length() > src.length()){
return -1;
}
char[] srcArray = src.toCharArray();
char[] dstArray = dst.toCharArray();
int srcLen = srcArray.length;
int dstLen = dstArray.length; for(int i = 0; i < srcLen; i++){ boolean find = false;
if(srcArray[i] == dstArray[0] && (i+dstLen <= srcLen)){ int equalCount = 0;
for (int j = 0; j < dstLen; j++){
if(srcArray[i+j] == dstArray[j]){
equalCount++;
}
} if(equalCount == dstLen){
find = true;
}
} if(find){
return i;
}
} return -1;
}

实现方案二(可能有点投机取巧了,不过相对方案一可能会耗更多的内存空间):

 public static int IndexOfStr(String src, String dst) throws Exception{

    if(null == src || src.length() < 1 || null == dst || dst.length() < 1 || src.length() < dst.length()){
return -1;
}
if(src.equals(dst)){
return 0;
} int srcLen = src.length();
int dstLen = dst.length();
char[] srcArray = src.toCharArray();
char[] dstArray = dst.toCharArray(); for (int i = 0; i < srcLen; i++){
if (srcArray[i] == dstArray[0] && (i + dstLen) <= srcLen){
// 这里的substring是new新的String空间来存储
String tmpS = src.substring(i, i + dstLen);
if (tmpS.equals(dst)){
return i;
}
}
} return -1;
}

感觉这两个实现还是有点麻烦,我们看下String的源码是如何实现的:

// 1、入口
public int indexOf(String str) {
return indexOf(str, 0);
} // 2、调用下面的:
public int indexOf(String str, int fromIndex) {
return indexOf(value, 0, value.length,
str.value, 0, str.value.length, fromIndex);
} // 3、最终调用:
static int indexOf(char[] source, int sourceOffset, int sourceCount,
char[] target, int targetOffset, int targetCount,
int fromIndex) {
if (fromIndex >= sourceCount) {
return (targetCount == 0 ? sourceCount : -1);
}
if (fromIndex < 0) {
fromIndex = 0;
}
if (targetCount == 0) {
return fromIndex;
} char first = target[targetOffset];
int max = sourceOffset + (sourceCount - targetCount); for (int i = sourceOffset + fromIndex; i <= max; i++) {
/* Look for first character. */
if (source[i] != first) {
while (++i <= max && source[i] != first);
} /* Found first character, now look at the rest of v2 */
if (i <= max) {
int j = i + 1;
int end = j + targetCount - 1;
for (int k = targetOffset + 1; j < end && source[j]
== target[k]; j++, k++); if (j == end) {
/* Found whole string. */
return i - sourceOffset;
}
}
}
return -1;
}

从上面的源码可以看到,String内置的IndexOf方法,是直接对其char[]类型的私有变量value去比较的:

public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
......
......
}

并且String公开的返回char[] 的方法只有toCharArray,所以我们自己实现的话只能是调用这个方法得到字符数组,或者直接通过charAt(int index) 获得当前位置的字符。

而源码实现更精简的地方就是对于原字符串,在for循环里面先通过while循环一直查找到当前字符跟目标字符串的首个字符相等的位置,再开始逐个比较后面的字符是否都相等。

【面试题】Java实现String的IndexOf方法的更多相关文章

  1. 深入分析Java的String类的方法与特点

    字符串是任何编程语言都必须支持的变量类型,有些编程语言是直接提供了原生的变量类型,有些编程语言则使用语法特性以 SDK 的形式提供支持.在Java编程平台中,对字符串的支持使用了后者的形式,就是通过在 ...

  2. Java中String类的方法及说明

    String : 字符串类型 一.      String sc_sub = new String(c,3,2);    //      String sb_copy = new String(sb) ...

  3. 【转载】Java中String类的方法及说明

    转载自:http://www.cnblogs.com/YSO1983/archive/2009/12/07/1618564.html String : 字符串类型 一.      String sc_ ...

  4. 『Java』String类使用方法

    Java中的字符串 java.lang.String类表示字符串类,Java程序中所有字符串文字都可以看作实现该类的实例. 特点: 字符串不可变:字符串的值在创建后不能在发生改变 public cla ...

  5. JAVA中String类的方法(函数)总结--JAVA基础

    1.concat()方法,当参数为两字符串时,可实现字符串的连接: package cn.nxl123.www; public class Test { public static void main ...

  6. String的indexOf方法

    indexOf(String.indexOf 方法)字符串的IndexOf()方法搜索在该字符串上是否出现了作为参数传递的字符串,如果找到字符串,则返回字符的起始位置 (0表示第一个字符,1表示第二个 ...

  7. String 对象-->indexOf() 方法

    1.定义和用法 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置,即下标. 如果没有找到匹配的字符串则返回 -1. 语法: string.indexOf(searchvalue ...

  8. Java中String的intern方法,javap&cfr.jar反编译,javap反编译后二进制指令代码详解,Java8常量池的位置

    一个例子 public class TestString{ public static void main(String[] args){ String a = "a"; Stri ...

  9. java中String的.trim()方法

    该方法去除两边的空白符 原理: 看看源码实现 public String trim() { int len = value.length; ; char[] val = value; /* avoid ...

随机推荐

  1. <发条游戏设计>粗翻——序言、

    序言——————————————————————— 优雅 就像在英语里的很多单词一样,“优雅”有着一些不同意义的解释.一些习惯性的用法常常带有“美”的意思:例如“她穿着一条优雅的裙子”,代表着一种完全 ...

  2. 【摘】Oracle 11g EM安全证书问题无法访问的解决办法

    本文摘自:http://www.cnblogs.com/wenlong/p/5255673.html  感谢攻城师10946无私分享 OS: Windows7 x64 Oracle: 11g R2 x ...

  3. ueditor复制文本有多余的空行问题

    今天从ueditor中复制文本,粘贴到记事本中发现每一行后面都多了一个空行. Ueditor中的文本如图: 本来只有三行,全选复制所有内容,再粘贴到记事本中发现有每一行文本后面都有多余的空行: 如果我 ...

  4. Linux的简单命令

    Linux的简单命令 1.更改linux服务器的登录密码 成功登录后输入命令: passwd 然后按照提示操作即可 2.在当前路径下新建文件夹:mkdir 新建文件夹名 3.解压和压缩文件tar.gz ...

  5. linux 安装配置 sublime 进行 python 开发

    1. 下载sublime 地址:http://www.sublimetext.com/3 2. 解压出来,将sublime_text_3 文件夹的名字改为 sublime_text , 然后将 sub ...

  6. Leetcode-35.搜索插入位置

    题目描述: 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 示例 1: 输入: [1,3,5,6 ...

  7. 百度杯”CTF比赛 2017 二月场 没错!就是文件包含漏洞。

    题目源码: 文件包含漏洞的话,看一下 你么可以使用php://input 伪协议,执行代码(参考了大佬WP)这里使用了POSTMAN, 目录下还有一个dle345aae.php文件,呢么用cat命令打 ...

  8. phpredis扩展实现LBS距离计算和范围筛选

    来源 public function geo(){ $redis = new \redis(); $redis -> connect('127.0.0.1',6379); //位置增加 $res ...

  9. MySQL ERROR 1054(42S22)

    修改用户的密码,网上搜到的命令为如下 执行后报错 ERROR 1054(42S22) Unknown column 'password' in ‘field list’ 错误的原因是 5.7版本下的m ...

  10. LoadRunner HTTP+Json 接口性能测试

    接口的请求参数和返回结果均是JSON字符串,请求可以用POST或者GET方法.先说GET方法: 一.GET方法测试 Insert - New step -选择Custom Request - web_ ...