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就行。