String及有关字符串操作的补充

1.

compareTo方法
优先比较两个字符串相同位置字符编码差值差值不为0时返回第一个差值
差值都为0时返回两个字符串长度的差值
compareToIgnoreCase方法
IgnoreCase忽略大小写
与compareTo方法相近只不过在比较字母时忽略了大小写

public static void A(){
        String str = "aa";
        String anotherString = "AAA";
        Object objStr = str;

        System.out.println( str.compareTo(anotherString) );
        System.out.println( str.compareToIgnoreCase(anotherString) );
//        System.out.println(objStr);
        System.out.println( str.compareTo(objStr.toString()));
//自己和自己比较
    }

2.

自定义方法传入字符串和下标
利用substring()方法

传入一个int返回int之后的字符串
传入两个int返回int1到int2之间的字符串不包括int2

public static void B(){
        String str = "this is Java";
        System.out.println(removeCharAt(str, 3));
    }
    public static String removeCharAt(String s, int pos) {
        return s.substring(0,pos)+s.substring(pos+1);
    }

3.

StringTokenizer

此类实现了Enumeration<Object>接口

传入字符串时默认以空格为标识将字符串分割

传入字符串和标识字符时以传入的标识字符为标识将字符串分割

由于其实现了Enumeration<Object>接口

可以推测其原理是将字符串拆分成一个个元素以标识字符为切割位

StringTokenizer应该也有Enumeration<Object>的hasMoreElements()方法和nextElement()方法

 public static void C(){
        String str = "A B C D, E, F, ";
        StringTokenizer st = new StringTokenizer(str);

        System.out.println("----- 通过空格分隔 ------");
        while (st.hasMoreElements()) {
            System.out.println(st.nextElement());
        }

        System.out.println("----- 通过逗号分隔 ------");
        StringTokenizer st2 = new StringTokenizer(str, ",");

        while (st2.hasMoreElements()) {
            System.out.println(st2.nextElement());
        }
    }

4.

regionMatches()方法

方法传入参数为

boolean(不传入时默认为false,意义是是否区分大小写),

int(第一个字符串开始比较位置),

String(要比较的字符串),

int(要比较字符串开始比较位置),

int(比较区域长度)

注意当比较区域长度大于字符串长度即便字符串内比较区域相等仍会返回false

测试两个字符串区域相等

public static void D(){
        String first_str = "Welcome";
        String second_str = "welcome";
        boolean match1 = first_str.
                regionMatches(0, second_str, 0, 7);
        boolean match2 = first_str.
                regionMatches(true, 0, second_str, 0, 7); //第一个参数 true 表示忽略大小写区别
        System.out.println("区分大小写返回值:" + match1);
        System.out.println("不区分大小写返回值:" + match2);

    }

5.测试引用对象和直接利用关键字传入字符串的性能比较

public static void E(){
        long startTime = System.currentTimeMillis();
        for(int i=0;i<5000000;i++){
            String s1 = "hello";
            String s2 = "hello";
        }
        long endTime = System.currentTimeMillis();
        System.out.println("通过 String 关键词创建字符串"
                + " : "+ (endTime - startTime)
                + " 毫秒" );
        long startTime1 = System.currentTimeMillis();
        for(int i=0;i<5000000;i++){
            String s3 = new String("hello");
            String s4 = new String("hello");
        }
        long endTime1 = System.currentTimeMillis();
        System.out.println("通过 String 对象创建字符串"
                + " : " + (endTime1 - startTime1)
                + " 毫秒");
    }

测试如下

通过 String 关键词创建字符串 : 2 毫秒
通过 String 对象创建字符串 : 29 毫秒

可以看到通过 String 关键词创建字符串性能更好

同理我们也可以测试intern()方法及String和StringBuffer连接字符串的性能比较及优化

 public static void F(){
        String variables[] = new String[500000];
        for( int i=0;i <500000;i++){
            variables[i] = "s"+i;
        }
        long startTime0 = System.currentTimeMillis();
        for(int i=0;i<500000;i++){
            variables[i] = "hello";
        }
        long endTime0 = System.currentTimeMillis();
        System.out.println("直接使用字符串: "+ (endTime0 - startTime0)  + " ms" );
        long startTime1 = System.currentTimeMillis();
        for(int i=0;i<500000;i++){
            variables[i] = new String("hello");
        }
        long endTime1 = System.currentTimeMillis();
        System.out.println("使用 new 关键字:" + (endTime1 - startTime1) + " ms");
        long startTime2 = System.currentTimeMillis();
        for(int i=0;i<500000;i++){
            variables[i] = new String("hello");
            variables[i] = variables[i].intern();
        }
        long endTime2 = System.currentTimeMillis();
        System.out.println("使用字符串对象的 intern() 方法: "
                + (endTime2 - startTime2)
                + " ms");
    }
public static void H(){
        long startTime = System.currentTimeMillis();
        for(int i=0;i<5000;i++){
            String result = "This is"
                    + "testing the"
                    + "difference"+ "between"
                    + "String"+ "and"+ "StringBuffer";
        }
        long endTime = System.currentTimeMillis();
        System.out.println("字符串连接"
                + " - 使用 + 操作符 : "
                + (endTime - startTime)+ " ms");
        long startTime1 = System.currentTimeMillis();
        for(int i=0;i<5000;i++){
            StringBuffer result = new StringBuffer();
            result.append("This is");
            result.append("testing the");
            result.append("difference");
            result.append("between");
            result.append("String");
            result.append("and");
            result.append("StringBuffer");
        }
        long endTime1 = System.currentTimeMillis();
        System.out.println("字符串连接"
                + " - 使用 StringBuffer : "
                + (endTime1 - startTime1)+ " ms");
    }

6.

除此之外我们还常用有关字符串方法有

字符串查找用方法 indexOf()
字符串分割用方法split()
用 String toUpperCase() 方法将字符串从小写转为大写

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值