欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java开发小工具

程序员文章站 2022-06-24 16:54:08
...

java开发小工具

记录一下Java常用的但没有工具包直接使用的工具类,持续更新中欢迎讨论。

字符串脱敏处理

对于某些字符串例如身份证、手机电话等需要脱敏展示,下面介绍4种方式。

    @Test
    void test() {
        String testStr = "154565465654661";
        String STAR_STR = "*";
        int desensitiseLength = 6;
        // 1.利用StringBuilder的replace
        long start = System.nanoTime();
        if (testStr.length() > desensitiseLength) {
            int midLength = testStr.length() / 2;
            StringBuilder sb = new StringBuilder(testStr);
            sb.replace(midLength - desensitiseLength / 2, midLength + desensitiseLength / 2,
                    String.join("", Collections.nCopies(desensitiseLength, STAR_STR)));
            log.info("修改后的字符串:{},耗时:{} ns", sb.toString(), System.nanoTime() - start);
        }

        // 2.利用工具类 StringUtils
        String testStr2 = "154565465654661";
        if (testStr2.length() > desensitiseLength) {
            int startIndex = (testStr2.length() - desensitiseLength) / 2 + 1;
            testStr2 = StringUtils.left(testStr2, startIndex).
                    concat(StringUtils.removeStart(StringUtils.leftPad(StringUtils.right(testStr2, startIndex),
                            StringUtils.length(testStr2), "*"), "******"));
            log.info("修改后的字符串:{},耗时:{} ns", testStr2, System.nanoTime() - start);
        }

        // 3.利用正则
        long start3 = System.nanoTime();
        String testStr3 = "154565465654661";
        if (testStr3.length() > desensitiseLength) {
            int startIndex = (testStr2.length() - desensitiseLength) / 2;
            int endIndex = testStr3.length() - startIndex - desensitiseLength;
            testStr3 = testStr3.replaceAll("(\\w{" + startIndex + "})(\\w+)(\\w{" + endIndex + "})", "$1******$2");
            log.info("修改后的字符串:{},耗时:{} ns", testStr3, System.nanoTime() - start3);
        }

        // 4.直接用subString方法
        long start4 = System.nanoTime();
        String testStr4 = "154565465654661";
        if (testStr4.length() > desensitiseLength) {
            int startIndex = (testStr2.length() - desensitiseLength) / 2;
            int endIndex = (testStr2.length() + desensitiseLength) / 2;
            testStr4 = testStr4.substring(0, startIndex) + "******" + testStr4.substring(endIndex);
            log.info("修改后的字符串:{},耗时:{} ns", testStr4, System.nanoTime() - start4);
        }
    }

结果如下,可以看出按照耗时和性能比较,推荐使用第四种方式,方便快捷

修改后的字符串:1545******54661,耗时:316500 ns
修改后的字符串:15456****54661,耗时:5414600 ns
修改后的字符串:1545******654656,耗时:231200 ns
修改后的字符串:1545******54661,耗时:37700 ns