String StringBuilder StringBuffer

idea快捷键:ctrl+n  查找功能  继续按ctrl+F12将当前类所有的方法列出来

 

 



练习1•
/**
*十分制的地址是x.x.x.x的格式,四个x的取值范围是【0,255】,写出程序
* 检查输入的ip地址是否合法,true表示合法
*/
public class StringCheck{
    private static boolean checkIpAdress(String ip) {
        String[] str = ip.split("\\.");  //split函数,以"."为间隔将字符串分开
        if (str.length != 4) {    //145.59.的情况,有小于四个有效数据的情况
            return false;
        }
        for (int i = 0; i < str.length; i++) {
            str[i] = str[i].trim();    //将空格省去
            if (str.length == 0) {     //空格的情况,如果两个点之间是空格,返回错误
                return false;
            }
        }
        /**
         * try catch语句处理45.34.87.988的情况,不是0-255的情况
         */
            try {
                for (int i = 0; i < str.length; i++) {
                    int data = Integer.valueOf(str[i]);   //将str转为整型
                    if (data < 0 || data > 255) {
                        return false;
                    }
                }
            } catch (NumberFormatException err) {
                return false;
            }
            return true;
        }
    public static void main(String[] args) {
        String ip="127.8.0.1";
        System.out.println(checkIpAdress(ip));//true
        String ip1="12.546.4.5";
        System.out.println(checkIpAdress(ip1));//false
        String ip2="12.56.";
        System.out.println(checkIpAdress(ip2));//false
        String ip3="12.54g.75.90";
        System.out.println(checkIpAdress(ip3));//false
    }
}

 练习2:

String字符串拼接

public class StringTest {
    public static void main(String[] args) {
        String str1="test";
        String str2="ok";
        String str3=str1+" "+str2;
        System.out.println(str3);
    }
}

 

/**拼接两个字符串,需要new一次StringBuilder对象,调用三次append方法
*因为new对象时默认为空
*StringBuilder sb = new StringBuilder();
* sb.append(str1);
* sb.append(" ");
* sb.append("ok");
* String str3 = sb.toString(); //StringBuilder返回toString方法的时候,需要new String("xxxxxx");
*/
反汇编代码(javap -c 类名.class)

 根据底层实现可得,字符串的拼接是通过StringBuilder的append方法实现,所以每拼接一次就要new一次StringBuilder对象,再调用append方法;当有如下这种程序时,便会产生大量的对象;

 String str = "hello";
        for(int i=0; i<10; ++i){
            str = str + String.valueOf(i);
        }
        System.out.println(str);
        

因为StringBuilder对象没有toString方法,所以每次打印时,都会new String()对象;

每拼接一次,都会执行下面代码,会产生一个StringBuilder对象和String对象,会产生大量的对象

    /**

     * StringBuilder sb = new StringBuilder();

 * sb.append(str);
* sb.append(String.valueOf(i));
* str = sb.toString(); new String(xxx);
*/

所以直接用StringBuilder对象
        String string = "hello";
        StringBuilder sb = new StringBuilder(string);
        for(int i=0; i<10000; ++i){
            sb.append(String.valueOf(i));
        }
        string=sb.toString(); // new String(xxxx)
        System.out.println(string);

这样的内层实现只是在第一次new一次StringBuilder对象,在for循环里面持续调用append方法,将要添加的字符串拼接起来,然后再new String对象,调用它的toString方法,将它赋给string字符串,最后打印。这样的处理,只需要new一个StringBuilder()和String()对象。

 

StringBuffer类的所有方法都被synchronized关键词修饰,所以StringBuffer用在多线程环境中,单线程环境用StringBuilder就行。

 

posted @ 2019-10-27 13:45  acehm  阅读(411)  评论(0)    收藏  举报