问题描述
/*
问题:写一个mask函数,可以将传入的字符串的前4个字符转换为#后输出。
举例:mask("123456789")//"#####6789"
*/
关键字:StringBuilder、replace(int begin,int end ,String replace)、System.arrayCopy();
思路:
- 一开始只知道用String类的replace方法去做,但是忽略了replace方法,是全部替换啊!!!结果就做错了。
- 痛定思痛:在网上找到一个方法,没错StringBuilder类的replace(int begin,int end ,String replace);顾名思义,就是用字符串替换指定区间的字符(包前不包后);
- 代码是可以实现了,研究下源码吧。发现很多数组复制底层调用的都是System.arrayCopy(),所以附一下这个函数的解释
/**
* 1.(阿里外包)写一个mask函数,可以将传入的字符串的前4个字符转换为#后输出。
* 2.可以使用StringBuilder类的replace方法
* 3.但是我翻了源码,哈哈,写一个调用源码的算法,只是模拟而已mask2()
*/
public class MaskString {
public static void main(String[] args) {
// mask("123454321");
mask2("123454321");
}
public static void mask(String test){
if(test==null||"".equals(test)){
System.out.println(test);
return;
}
if (test.length()<3){
System.out.println(test);
return;
}
StringBuilder stringBuilder = new StringBuilder(test);
stringBuilder.replace(0,4,"####");
System.out.println(stringBuilder.toString());
}
/**
* native方法,说明是调用的操作系统内存直接实现,效率肯定会很高
* @param src 源对象对象
* @param srcPos 源对象开始点
* @param dest 目标对象
* @param destPos 目标对象开始点
* @param length 从源对象中去数据的长度
*/
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
public static void mask2(String test){
if(test==null||"".equals(test)){
System.out.println(test);
return;
}
if (test.length()<3){
System.out.println(test);
return;
}
char[] charExchange = new char[]{'#','#','#','#'};
char[] charBase = test.toCharArray();
// 1.
System.arraycopy(charExchange,0,
charBase,0,
charExchange.length);
System.out.println(new String(charBase));
}
}