Java不愧有高级语言的高级语言之称,对比于C,Java将String中常见操作进行了封装,使用户之间调用方法就行了,这当然要归功JDK。而C面对的String和基本数据类型并不不同,要自己手写底层的操作。以下就是Java-String常用方法,应用场景,及解析。
源码解析:
public char charAt(int index) {
if ((index < 0) || (index >= value.length)) {
throw new StringIndexOutOfBoundsException(index);
}
return value[index];
}
没想到这么简单吧,直接返回了数组内元素了,这是怎么回事,value[]从哪来的?
原来,String是披着字符串外衣的字符数组啊,穿上马甲我就不认识你了。final修饰很好理解,字符串一旦定义了就不能更改了。
注意:index索引是数组下标,从零开始。第一位的index为0。
2,int indexOf(String str): 返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。源码解析:
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;
}
算法
1)找出俩(母子 )字符串中,母串中首次与子串第一个字符相等的下标索引m;
2)从索引m开始遍历,判断后面的字符是否相等;
3)如何判断相等?设置两个头尾指针(头指针指向m+1;尾指针指向m+子串长度),当头指针到达尾指针的位置,或者遍历过程中存在字符不相等的情况,则跳出循环;再找下一个相等索引m。
4)判断头指针等于尾指针,等于则返回头指针前一个位置;否则返回-1。
应用场景:判断某字符串是否为另一字符串的子串。
3,char[] toCharArray() 将此字符串转换为一个新的字符数组。源码解析:
public char[] toCharArray() {
// Cannot use Arrays.copyOf because of class initialization order issues
char result[] = new char[value.length];
System.arraycopy(value, 0, result, 0, value.length);
return result;
}
创建一个新字符数组,将原字符串(字符数组)copy到新数组上,返回新数组。
应用场景:经常是对字符串拆分,对其字符进行操作。