JavaSE核心API--字符串操作类

java.lang.String

1)理论讲解:charAt方法

char charAt(int index)
获取给定位置对应的字符

代码演示:

                0123456789012345
    String str="thinking in java";
    char c=str.charAt(10);
    System.out.println(c);//输出为n


//  //判断回文
//  String line="上海自来水来自海上";
//  for (int i = 0; i < line.length()/2; i++) {
//      if (line.charAt(i)!=line.charAt(line.length()-1-i)) {
//          System.out.println("不是回文!");
//          break;
//      }
//  }
//  System.out.println("是回文!");

//  //判断回文
//  String line="上海自来水来自海上";
//  for (int i = 0; i < line.length()/2; i++) {
//      if (line.charAt(i)!=line.charAt(line.length()-1-i)) {
//          System.out.println("不是回文!");
//          return;//对于返回值类型为void的方法,return的作用是结束该方法,下面语句都不执行
//      }
//  }
//  System.out.println("是回文!");


    //判断回文
    String line="上海自来水来自来海上";
    for (int i = 0; i < line.length()/2; i++) {
        if (line.charAt(i)!=line.charAt(line.length()-1-i)) {
            System.out.print("不");//如果不相等则输出“不”不换行与“是回文!”进行拼接
            break;
        }
    }
    System.out.println("是回文!");//这是必走语句

2)理论讲解: indexOf方法

int indexOf(String str)
获取给定字符串在当前字符串中的位置,若当前字符串中不含有给定内容则返回值为-1

代码演示:

    //          0123456789012345
    String str="thinking in java";

    int index=str.indexOf("in");//默认从0开始查找
    System.out.println(index);//2

    index=str.indexOf("in",3);//从指定位置开始查找
    System.out.println(index);//5

    index=str.lastIndexOf("in");//返回最后一次查找到的位置
    System.out.println(index);//9

3)理论讲解:length方法

int length()
获取当前字符串的长度(字符个数)

代码演示:

    /**
     * 专门用于统计字符个数
     */
    String str="我爱java";
    int len=str.length();
    System.out.println("len:"+len);

4)理论讲解:正则表达式方法一

字符串支持正则表达式方法一:
boolean matches(String regex)
使用给定的正则表达式验证当前字符串是否符合格式要求,符合则返回true

以下需要注意:
无论给定的正则表达式是否指定了边界匹配(^...$)都是做完全匹配验证的。

代码演示:

//  String email="fancq@tedu.cn";
    /**
     * 邮箱的正则表达式
     * \w+@[a-zA-Z0-9]+(\.[a-zA-Z]+)+
     */

    Scanner scan=new Scanner(System.in);
    System.out.println("请输入邮箱:");
    String email=scan.nextLine();


    String regex="\\w+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";
    boolean match=email.matches(regex);
    if (match) {
        System.out.println("是邮箱!");
    } else {
        System.out.println("不是邮箱");
    }

    scan.close();

5)理论讲解:正则表达式方法二

字符串支持正则表达式方法二:
String[] split(String regex)
将当前字符串中按照满足正则表达式的部分进行拆分,并将拆分出的每部分以一个字符串数组形式返回

代码演示:

    String str="abc123def456ghi";
    /*
     * 按照数字部分拆分,得到所有的字母部分
     */
    String[] arr=str.split("[0-9]+");
    System.out.println(arr.length);
    System.out.println(Arrays.toString(arr));

6)理论讲解:正则表达式方法三

字符串支持正则表达式方法三:
String replaceAll(String regex,String str)
将当前字符串中满足正则表达式的部分替换为str

代码演示:

    String str="abc123def456ghi";
    /*
     * 将当前字符串的数字部分替换为"*******"
     */
    str=str.replaceAll("\\d+", "*******");
    System.out.println(str);
    /*
     * 将敏感词汇和谐******
     * 输入密码不可见******
     */
    String s="123";
    s=s.replaceAll(s, str);
    System.out.println(s);

7)理论讲解:startsWith和endsWith方法

boolean startsWith(String str)
boolean endsWith(String str)
判断字符串是否是以给定的字符串开始或结尾的

代码演示:

    String str="thinking in java";

    boolean starts=str.startsWith("thin");
    System.out.println(starts);

    boolean ends=str.endsWith("ava");
    System.out.println(ends);

    //xxx.png   判断文件名是否是以.png结尾
    Scanner sc=new Scanner(System.in);
    System.out.println("请输入文件名:");
    String str2=sc.nextLine();
    boolean flagend=str2.endsWith(".png");

    if (flagend) {
        System.out.println("该文件是图片!");
    } else {
        System.out.println("该文件不是图片!");
    }

    sc.close();

8)理论讲解:StringBuilder类

StringBuilder是专门设计用来编辑字符串内容的API
由于String不适合频繁修改,所以在实际开发中如果有经常修改字符串的操作时,可以使用StringBuilder来完成

StringBuilder内部维护一个可变的字符数组,所以修改的过程中资源占用小,并且提供了对应的操作:增,删,改,插

代码演示:

    String str="好好学习java";
    //默认方式创建内部表示一个空字符串:""
//  StringBuilder builder=new StringBuilder();
    //创建时表示给定字符串内容
    StringBuilder builder=new StringBuilder(str);
    /**
     * 好好学习java
     * 好好学习java,为了找个好工作!
     * append:将指定内容追加到当前字符串末尾
     */
    builder.append(",为了找个好工作!");
    str=builder.toString();
    System.out.println(str);
    /**
     * 好好学习java,为了找个好工作!
     * 好好学习java,就是为了改变世界!
     * replace:将指定范围内的字符串替换为给定内容
     */
    builder.replace(9, 16, "就是为了改变世界");
    str=builder.toString();
    System.out.println(str);
    /**
     * 好好学习java,就是为了改变世界!
     * ,就是为了改变世界!
     * delete:删除指定范围内的字符串
     */
    builder.delete(0, 8);
    str=builder.toString();
    System.out.println(str);
    /**
     * ,就是为了改变世界!
     * 活着,就是为了改变世界!
     * insert:将指定内容插入到指定位置
     */
    builder.insert(0, "活着");
    str=builder.toString();
    System.out.println(str);

9)理论讲解:String类

String是不变对象,要想改变需重新创建另一个对象
JVM对String有一个优化,即:常量池
当使用字面量形式创建字符串对象时,JVM会将其缓存在常量池中,
当再次使用该字面量创建字符串对象时即重用对象,避免内存中堆积大量内容一样的字符串对象,减少内存占用

字符串只适合重用,不适合频繁修改

代码演示:

    String s1="123abc";
    String s2="123abc";
    String s3="123abc";

    /**------------常见面试题
     * 这里发挥了编译器的一个特性:
     * 编译器在编译源代码时,若发现一个计算表达式
     * 参与计算的内容是一个确定不变的值时,会在编译期间直接进行计算
     * 并将计算结果编译到.class文件中,避免jvm在每次执行程序时再次重复运算,
     * 从而提高性能(即虚拟机的优化)。
     * 如下代码,编译器编译后改为了:
     * String s4="123abc";
     */
    String s4="123"+"abc";
    //编译器在执行该行代码时,若结果是确定不变的(即常量,非变量),则直接把结果编译好了,而不用在虚拟机上面再次编译
    //此处String s4="123"+"abc";就相当于String s4="123abc";
    System.out.println(s4);//123abc
    System.out.println(s2==s4);//true

    String s5="123";
    String s6=s5+"abc";//遇到计算表达式看运算结果是不是确定值,如果有变量则需要重新创建对象,此时s6和s5都引用了不同的对象
    System.out.println(s6);//123abc
    System.out.println(s2==s6);//false

10)理论讲解:substring方法

String substring(int start,int end)----含头不含尾start~end-1
截取指定范围内的字符串

代码演示:

    //          0123456789012
    String str="www.baidu.com";
    /*
     * java API中有一个特点,通常使用两个数字表示范围时,都是“含头不含尾”的
     */
    String sub=str.substring(4, 9);//实际上的范围是4-8
    System.out.println(sub);//结果输出为baidu

    sub=str.substring(4);//从位置4一直截取到末尾
    System.out.println(sub);//输出结果为baidu.com

11)理论讲解:toUpperCase和toLowerCase方法

String toUpperCase()
String toLowerCase()
将当前字符串中的英文部分转换成全大写或全小写

代码演示:

    String str="我爱java";

    String upper=str.toUpperCase();
    System.out.println(upper);

    String lower=str.toLowerCase();
    System.out.println(lower);

12)理论讲解:trim方法

String trim()
该方法返回一个去除原字符串两边空白之后的新字符串

代码演示:

    String str="  Hello           World      ";
    String trim=str.trim();
    System.out.println(str);
    System.out.println(trim);

13)理论讲解:valueOf方法

字符串提供了一组重载的valueOf方法,可以将其他类型转换为字符串

代码演示:

    int d=123;
    String str=String.valueOf(d);//把d转成字符串类型str

    //任何内容和字符串连接结果也能转换为字符串,但执行性能较差
    str=d+"";
    System.out.println(str);

    double dou=123.123;
    String str2=String.valueOf(dou);
    System.out.println(str2);