String类的常用方法以及一些案例

189 阅读3分钟

String类中的常用方法以及案例

常用方法

 int length():返回字符串的长度: return value.length
 char charAt(int index): 返回某索引处的字符return value[index]
 boolean isEmpty():判断是否是空字符串:return value.length == 0
 String toLowerCase():使用默认语言环境,将 String 中的所有字符转换为小写
 String toUpperCase():使用默认语言环境,将 String 中的所有字符转换为大写
 String trim():返回字符串的副本,忽略前导空白和尾部空白
 boolean equals(Object obj):比较字符串的内容是否相同
 boolean equalsIgnoreCase(String anotherString):与equals方法类似,忽略大小写
 String concat(String str):将指定字符串连接到此字符串的结尾。 等价于用“+”
 int compareTo(String anotherString):比较两个字符串的大小  负数:当前对象小。
 String substring(int beginIndex):返回一个新的字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串。
 String substring(int beginIndex, int endIndex) :返回一个新字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。

 boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束
 boolean startsWith(String prefix):测试此字符串是否以指定的前缀开始
 boolean startsWith(String prefix, int toffset):测试此字符串从指定索引开始的子字符串是否以指定前缀开始

 boolean contains(CharSequence s):当且仅当此字符串包含指定的 char 值序列时,返回 true
 int indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引
 int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始
 int lastIndexOf(String str):返回指定子字符串在此字符串中最右边出现处的索引
 int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索
注:indexOf和lastIndexOf方法如果未找到都是返回-1


替换:
 String replace(char oldChar, char newChar):返回一个新的字符串,它是
通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
 String replace(CharSequence target, CharSequence replacement):使
用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
 String replaceAll(String regex, String replacement) : 使 用 给 定 的
replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
 String replaceFirst(String regex, String replacement) : 使 用 给 定 的
replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。

匹配:
boolean matches(String regex):告知此字符串是否匹配给定的正则表达式。

切片:
 String[] split(String regex):根据给定正则表达式的匹配拆分此字符串。
 String[] split(String regex, int limit):根据匹配给定的正则表达式来拆分此
字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中。

案例

  1. 将一个字符串进行反转。将字符串中指定部分进行反转。比如“abcdefg”反转为”abfedcg”
public String reverse(String string, int beginIndex, int endIndex){
    if(string != null){//判断非空串字符
        char[] chars = string.toCharArray();
        for (int i = beginIndex,j=endIndex; i <j ; i++,j--) {
            char temp = chars[i];
            chars[i]= chars[j];
            chars[j] = temp;

        }
        return new String(chars);
    }
    return null;
}
  1. 获取一个字符串在另一个字符串中出现的次数。比如:获取“ ab”在 “abkkcadkabkebfkabkskab” 中出现的次数
public static void acquire(String str1,String str2){
    int count = 0;
    int index = 0;

    int length= str2.length();
    while((index = str1.indexOf(str2,index))!=-1){
        count++;
        index= index+length;
    }
    System.out.println("字符串"+str2+"出现的次数为"+count);

}

2. StringBuffer,StringBuilder一些案例

先聊一下StringBuffer,StringBuilder,String三者的异同

  • StringBuffer,StringBuilder,String三者的异同
  • 同:底层都是使用char[]存储。
  • String:不可变的字符序列
  • StringBuffer:可变的字符序列:线程安全的,效率较低。
  • StringBuilder:可变的字符序列:JDK5.0新增,线程不安全,效率高。
  • 源码分析:
  • String s1 = new String();//new char[0]
  • String s2 = new String("abc");//new char[]{"a","b","c"}
  • StringBuffer sb1 = new StringBuffer();//new char[16],底层创建了一个长度为16的数组
  • sb1.append('a');//value[o]='a'
  • sb1.append('b');//value[1]='b'
  • StringBuffer sb2 = new StringBuffer("abc");char[] value = new char["abc".length+16]
  • 问题1:System.tou.println(sb2.length);//3 只算实际上里面占用了几个字符。
  • 问题2:扩容问题:如果要添加的数据,底层数组装不下了,就需要扩容底层数组。默认情况下:扩容为原来的二倍+2,同时将原有数组中的元素复制到新数组中。

案例

  1. 编写一个方法,将一段文本中的各个单词的字母顺序翻转, 例如:"I like writing code best",将变成"I ekil gnitirw edoc tseb"。
public String Myreserve(String str){
    String[] arr = str.split(" ");//以空格为分界分为几个数组
    StringBuffer newStr = new StringBuffer();
    for (String s : arr) {
        StringBuffer stringBuffer = new StringBuffer(s);
        stringBuffer.reverse();
        newStr.append(stringBuffer).append(" ");
    }

    return newStr.toString();//因为newStr是StringBuffer类型的,需要toString()
}
  1. 字符串压缩:利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串“aabccdd”会变成“a2b1c2d2”。若“压缩”以后的字 符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a-z) *示例 1:输入:aabcccccddddd,输出:a2b1c5d5

*示例 2:输入:“abcdd” 输出:“abcdd” 解释:因为压缩后的字符串为:”a1b1c1d2”,长度大于原字符串

public String task3(String s){
    //考虑极端情况:如果如数的字符串长度为0
    if(s.length()==0){
        return s;
    }
    StringBuffer newStr = new StringBuffer();
    char ch = s.charAt(0);
    int js = 1;
    for(int i=1;i<s.length();i++){
        if(ch==s.charAt(i)){//如果当前字符串与原来的字符相同;
            js++;
        }else{//如果不同,则拼接字符串,然后ch变成当前字符,js归1。
            newStr.append(ch);
            newStr.append(js);
            ch = s.charAt(i);
            js=1;
        }
    }
    newStr.append(ch);
    newStr.append(js);
    return newStr.length()>s.length()?s:newStr.toString();

}
  1. String s="name=王五 age=18 classNum=1101”; 将上面的字符串中包含的信息存放到 Student(里面有 name,age, classNum 三个属性)的对象中。
public void task2(String s){
    Student stu = new Student();
    String[] arr = s.split(" ");//以空格为分界分为几个数组
    for (String s1 : arr) {
        String[] temp = s1.split("=");
        if(temp[0].equals("name")){
            stu.setName(temp[1]);
        }else if(temp[0].equals("age")){
            stu.setAge(Integer.parseInt(temp[1]));
        }else if(temp[0].equals("classNum")){
            stu.setClassNum(Integer.valueOf(temp[1]));
        }
    }
    //直接调用对象名默认调用toString()

    System.out.println(stu);//Student{name='王五', age=18, classNum=1101},输出对象默认调用toString()方法
}