串
一、String基本操作方法
- 获取字符串长度方法length()
格式:int length = str.length();
- 获取字符串中的第i个字符方法
charAt(i)
格式:char ch = str.charAt(i); //i为字符串的索引号,可得到字符串任意位置处的字符,保存到字符变量中
- 获取指定位置的字符方法
getChars(4个参数)
格式:char array[] = new char[80]; //先要创建以一个容量足够大的char型数组,数组名为array
str.getChars(indexBegin,indexEnd,array,arrayBegin);
下面就上代码简单演示一下三种方法的用法:
//String类基本操作方法public class StringBasicOpeMethod {public static void main(String args[]){String str = "如何才能变得像棋哥一样优秀?算了吧,憋吹牛逼!"; //定义一个字符串System.out.println(str); //输出字符串/***1、length()方法***/int length = str.length();//得到字符串长度System.out.println("字符串的长度为:"+length);/***2、charAt()方法***/char ch = str.charAt(7); //得到索引为7的字符System.out.println("字符串中的第8个字符为:"+ch);/***3、getChars()方法***/char chardst[] = new char[80]; //定义容量为80的字符数组,用于存储从字符串中提取出的一串字符str.getChars(0,14,chardst,0);//System.out.println("字符数组中存放的内容为:"+chardst);//错误,输出的是编码System.out.println(chardst); //**括号中不可带其他字符串}}
二、字符串比较
首先看一下第一种比较大小这类需求中的方法:
(1)不忽略字符串大小写情况下字符串的大小比较方法
compareTo(another str)格式:`int result = str1.compareTo(str2);`输出三种比较结果:若该字符串的Unicode值<参数字符串的Unicode值,结果返回一负整数;若若该字符串的Unicode值=参数字符串的Unicode值,结果返回0;若该字符串的Unicode值>参数字符串的Unicode值,结果返回一正整数。
(2) 忽略字符串大小写情况下字符串的大小比较方法
compareTOIgnoreCase(another str)格式:`int result = str1.compareToIgnoreCase(str2);` 在忽略字符串大小写情况下,返回三种比较结果:输出三种比较结果:若该字符串的Unicode值<参数字符串的Unicode值,结果返回一负整数;若若该字符串的Unicode值=参数字符串的Unicode值,结果返回0;若该字符串的Unicode值>参数字符串的Unicode值,结果返回一正整数。然后看一下第二种判别两种字符串是否相等(相等情况下必须保证二者长度相等)需求中的方法:
(1)不忽略字符串大小写情况下判别字符串相等的方法
eaquals(another str)格式:`boolean result = str1.equals(str2);` 当且仅当str1和str2的长度相等,且对应位置字符的Unicode编码完全相等,返回true,否则返回false (2) 忽略字符串大小写情况下判别字符串相等的方法`equalsIgnoreCase(another str)` 格式:`boolean result = str1.equals(str2);`
三、字符串与其他数据类型的转换
由于数据类型较多,因而转换使用的方法也比较多,在此我就用一个表格罗列一下:
| 数据类型 | 字符串转换为其他数据类型的方法 | 其它数据类型转换为字符串的方法1 | 其他数据类型转换为字符串的方法2 |
|---|---|---|---|
| byte | Byte.parseByte(str) | String.valueOf([byte] bt) | Byte.toString([byte] bt) |
| int | Integer.parseInt(str) | String.valueOf([int] i) | Int.toString([int] i) |
| long | Long.parseLong(str) | String.valueOf([long] l) | Long.toString([long] l) |
| float | Float.parseFloat(str) | String.valueOf([float] f) | Float.toString([float] f) |
| double | double.parseDouble(str) | String.valueOf([double] d) | Double.toString([double] b) |
| char | str.charAt() | String.valueOf([char] c) | Character.toString([char] c) |
| Boolean | Boolean.getBoolean(str) | String.valueOf([Boolean] b) | Boolean.toString([Boolean] b) |
四、字符串查找
(1)查找字符出现的位置
1. indexOf()方法
格式:1. str.indexOf(ch);
2. str.indexOf(ch,fromIndex); //包含fromIndex位置
格式1返回指定字符在字符串中第一次出现位置的索引
格式2返回指定索引位置之后第一次出现该字符的索引号
2. lastIndexOf()方法
格式:1. str.lastIndexOf(ch);
2. str.lastIndexOf(ch,fromIndex);
格式1返回指定字符在字符串中最后一次出现位置的索引
格式2返回指定索引位置之前最后一次出现该字符的索引号
(2) 查找字符串出现的位置
1. indexOf()方法
格式:1. str.indexOf(str);
2. str.indexOf(str,fromIndex);
格式1返回指定子字符串在字符串中第一次出现位置的索引
格式2返回指定索引位置之前第一次出现该子字符串的索引号
2. lastIndexOf()方法
格式:1. str.lastIndexOf(str);
2. str.lastIndexOf(str,fromIndex);
格式1返回指定子字符串在字符串中最后一次出现位置的索引
格式2返回指定索引位置之前最后一次出现该子字符串的索引号
五、截取与拆分
这类方法是截取出一个长字符串中的一个子字符串或将字符串按照正则表达式的要求全部拆分保存到一个字符串数组中。具体方法如下所示:
(1) 截取方法
substring()方法
格式1:String result = str.substring(index);
格式2:String result = str.substring(beginIndex,EndIndex);//实际索引号[beginIndex,EndIndex-1]
结果:截取出范围内的字符串
(2)拆分方法
1. split()方法
格式1 :String strArray[] = str.split(正则表达式);// 拆分的结果保存到字符串数组中
格式2:String strArray[] = str.split(正则表达式,limit);
六、替换或修改
终于到最后一类方法了,开心!!有时候我们需要对原字符串中的某些子字符串进行替换或修改,此时也需要String类提供的一些简单快捷好用的方法啦
(1)concat()方法:合并字符串
格式:String result = str1.concat(str2); //将str1和str2合并
(2) toLowerCase()方法:将字符全部转化为小写
格式: String result = str.toLowerCase();
(3) toUpperCase()方法: 将字符全部转化为大写
格式:String result = str.toUpperCase();
(4)replaceAll()、replaceFirst()方法:需要匹配正则表达式
七、kmp
package kmp;
import java.util.Arrays;
/**
* @program: text
* @description: kmp算法
* @author: min
* @create: 2019-10-17 16:08
**/
public class KMPAlgorithm {
public static void main(String[] args) {
String str1 = "BBC ABCDAB ABCDABCDABDE";
String str2 = "ABCDABD";
//String str2 = "BBC";
int[] next = kmpNext("ABCDABD"); //[0, 1, 2, 0]
System.out.println("next=" + Arrays.toString(next));
int index = kmpSearch(str1, str2, next);
System.out.println("index=" + index); // 15 了
}
/**
* @param str1 源字符串
* @param str2 子串
* @param next 部分匹配表, 是子串对应的部分匹配表
* @return 如果是-1 就是没有匹配到,否则返回第一个匹配的位置
*/
public static int kmpSearch(String str1, String str2, int[] next) {
//遍历
for (int i = 0, j = 0; i < str1.length(); i++) {
//需要处理 str1.charAt(i) != str2.charAt(j), 去调整 j 的大小
//KMP 算法核心点, 可以验证...
while (j > 0 && str1.charAt(i) != str2.charAt(j)) {
j = next[j - 1];
}
if (str1.charAt(i) == str2.charAt(j)) {
j++;
}
if (j == str2.length()) {//找到了 // j = 3 i
return i - j + 1;
}
}
return -1;
}
//获取到一个字符串(子串) 的部分匹配值表
public static int[] kmpNext(String dest) {
//创建一个 next 数组保存部分匹配值
int[] next = new int[dest.length()];
next[0] = 0; //如果字符串是长度为 1 部分匹配值就是 0
for (int i = 1, j = 0; i < dest.length(); i++) {
//当 dest.charAt(i) != dest.charAt(j) ,我们需要从 next[j-1]获取新的 j
//直到我们发现 有 dest.charAt(i) == dest.charAt(j)成立才退出
//这时 kmp 算法的核心点
while (j > 0 && dest.charAt(i) != dest.charAt(j)) {
j = next[j - 1];
}
//当 dest.charAt(i) == dest.charAt(j) 满足时,部分匹配值就是+1
if(dest.charAt(i) == dest.charAt(j)) {
j++;
}
next[i] = j;
}
return next;
}
}
