字符串初识
字符串在C++ & Java中有着截然不同的处理办法,这与其存储方式有关,在C++中字符串类似数组,但在Java中一旦输入字符串的内容不可变。 Java和C++中均为数组形式的存储,但Java里String类是被final修饰,不可被修改。
Java
Java中针对字符串的操作有API.String/StringBuilder/StringBuffer
String
- 介绍引用
- String类代表字符串。 Java程序中的所有字符串文字(例如"abc")都被实现为此类的实例。 字符串不变,它们的值在创建后不能被更改。
- 字符串缓冲区支持可变字符串。 因为String对象是不可变的,它们可以被共享。
例如:String str = “abc”;
相当于:char data[] = {‘a’, ‘b’, ‘c’}; String str = new String(data); - String类包括用于检查序列的各个字符的方法,用于比较字符串,搜索字符串,提取子字符串以及创建将所有字符翻译为大写或小写的字符串的副本。
- Java语言为字符串连接运算符(+)提供特殊支持,并为其他对象转换为字符串。 字符串连接是通过StringBuilder (或StringBuffer )类及其append方法实现的。 字符串转换是通过方法来实现toString
- 常用方法
- >int length();返回此字符串的长度。
char charAt(int index) :返回 char指定索引处的值。
int indexOf(String str) :返回指定子字符串第一次出现的字符串内的索引。
int indexOf(String str, int fromIndex) :返回指定子串的第一次出现的字符串中的索引,从指定的索引开始。
int lastIndexOf(String str) :返回指定子字符串最后一次出现的字符串中的索引。
int lastIndexOf(String str, int fromIndex) :返回指定子字符串的最后一次出现的字符串中的索引,从指定索引开始向后搜索。
int compareTo(String anotherString):比较两个字符串的大小
- >boolean isEmpty();返回 true如果,且仅当 length()为 0
boolean equals(Object obj);比较字符串的内容是否相同
boolean equalsIgnoreCase(String anotherString);与equals方法类似,忽略大 小写
boolean contains(CharSequence s):当且仅当此字符串包含指定的 char 值序列 时,返回 true
boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束
boolean startsWith(String prefix):测试此字符串是否以指定的前缀开始
boolean startsWith(String prefix, int toffset):测试此字符串从指定索引开始的 子字符串是否以指定前缀开始
boolean matches(String regex):告知此字符串是否匹配给定的正则表达式。
- >String toLowerCase():使用默认语言环境,将 String 中的所有字符转换为小写
String toUpperCase():使用默认语言环境,将 String 中的所有字符转换为大写
String trim():返回字符串的副本,忽略前导空白和尾部空白
String concat(String str):将指定字符串连接到此字符串的结尾。 等价于用“+”
String substring(int beginIndex):返回一个新的字符串,它是此字符串的从 beginIndex开始截取到最后的一个子字符串。
String substring(int beginIndex, int endIndex) :返回一个新字符串,它是此字 符串从beginIndex开始截取到 endIndex(不包含)的一个子字符串。
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 替换此字符串匹配给定的正则表达式的第一个子字符串。
String[] split(String regex):根据给定正则表达式的匹配拆分此字符串。
String[] split(String regex, int limit):根据匹配给定的正则表达式来拆分此 字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中。
- >char[] toCharArray() ;将此字符串转换为新的字符数组。
String toString() ;此对象(已经是字符串!)本身已被返回。
StringBuilder/StringBuffer
-
细节理解(持续更新)
- 此类不可以直接赋值操作,报错
- 字符串类比较==与equals()区别: ==针对引用元素比较的是引用,类似于c的指针,eauals比较的hash和值本身。
-
介绍引用
- StringBuilder
- 一个可变的字符序列。 此类提供与StringBuffer的API,但不保证同步。 此类设计用作简易替换为StringBuffer在正在使用由单个线程字符串缓冲区的地方(如通常是这种情况)。 在可能的情况下,建议使用这个类别优先于StringBuffer ,因为它在大多数实现中将更快。
- StringBuilder的StringBuilder不能安全使用多线程。
- StringBuffer
- 线程安全,可变的字符序列。 字符串缓冲区就像一个String ,但可以修改。 在任何时间点,它包含一些特定的字符序列,但可以通过某些方法调用来更改序列的长度和内容。
- 字符串缓冲区可以安全地被多个线程使用。 这些方法在必要时进行同步,以便任何特定实例上的所有操作都按照与所涉及的各个线程所执行的方法调用顺序一致的顺序发生。
- StringBuilder
-
常用方法(以下内容中的StringBuilder/StringBuffer可互相修改)
-
StringBuilder append(type b)
将 type参数的字符串表示追加到序列末位。 (支持重载)
StringBuilder insert(int offset, type b)
将 type参数的字符串表示插入到此序列中。 (支持重载)
StringBuilder insert(int index, char[] str, int offset, int len)
在此序列中插入 str数组参数的子阵列的字符串表示形式。
StringBuilder insert(int dstOffset, CharSequence s, int start, int end)
将指定的CharSequence的子 CharSequence插入到此序列中。 -
char charAt(int index)
返回 char在指定索引在这个序列值。 -
int length()
返回长度(字符数)。 -
int indexOf(String str)
返回指定子字符串第一次出现的字符串内的索引。
int indexOf(String str, int fromIndex)
返回指定子串的第一次出现的字符串中的索引,从指定的索引开始。
int lastIndexOf(String str)
返回指定子字符串最右边出现的字符串内的索引。
int lastIndexOf(String str, int fromIndex)
返回指定子字符串最后一次出现的字符串中的索引
-
C++(简单汇总)
- 长度
- size()
length() ;前两者的功能一致
maxsize() ;函数返回 string 类型对象最多包含的字符数
- size()
- 索引
- 字符串中元素的访问是允许的,一般可使用两种方法访问字符串中的单一字符:下标操作符[] 和 成员函数at()。
- 下标操作符 [] 在使用时不检查索引的有效性,如果下标超出字符的长度范围,会示导致未定义行为。对于常量字符串,使用下标操作符时,字符串的最后字符(即 ‘\0’)是有效的。对应 string 类型对象(常量型)最后一个字符的下标是有效的,调用返回字符 ‘\0’。
- 函数 at() 在使用时会检查下标是否有效。如果给定的下标超出字符的长度范围,系统会抛出 out_of_range 异常。
- 字符串中元素的访问是允许的,一般可使用两种方法访问字符串中的单一字符:下标操作符[] 和 成员函数at()。
- 比较
- compare()
- int compare (size_type pos, size_type n, string& s,size_type pos2, size_type n2) ;
- 参与比较的两个串值相同,则函数返回 0;若字符串 S 按字典顺序要先于 S2,则返回负值;反之,则返回正值。
- 比较运算符
- 对于参加比较的两个字符串,任一个字符串均不能为 NULL,否则程序会异常退出。
- compare()
- 修改
- erase();删除
- swap();交换
- replace();
- insert();插入
-
basic_string& insert (size_type p0 , const E * s); //插人 1 个字符至字符串 s 前面
basic_string& insert (size_type p0 , const E * s, size_type n); // 将 s 的前 3 个字符插入p0 位置
basic_string& insert (size_type p0, const basic_string& str);
basic_string& insert (size_type p0, const basic_string& str,size_type pos, size_type n); //选取 str 的子串
basic_string& insert (size_type p0, size_type n, E c); //在下标 p0 位置插入 n 个字符 c
iterator insert (iterator it, E c); //在 it 位置插入字符 c
void insert (iterator it, const_iterator first, const_iterator last); //在字符串前插入字符
void insert (iterator it, size_type n, E c) ; //在 it 位置重复插入 n 个字符 c
-
- append();添加
-
basic_string& append (const E * s); //在原始字符串后面追加字符串s
basic_string& append (const E * s, size_type n);//在原始字符串后面追加字符串 s 的前 n 个字符
basic_string& append (const basic_string& str, size_type pos,size_type n);//在原始字符串后面追加字符串 s 的子串 s [ pos,…,pos +n -1]
basic_string& append (const basic_string& str);
basic_string& append (size_type n, E c); //追加 n 个重复字符
basic_string& append (const_iterator first, const_iterator last); //使用迭代器追加
-
- 寻找
- find()
-
size_type find (value_type _Chr, size_type _Off = 0) const;
//find()函数的第1个参数是被搜索的字符、第2个参数是在源串中开始搜索的下标位置
size_type find (const value_type* _Ptr , size_type _Off = 0) const;
//find()函数的第1个参数是被搜索的字符串,第2个参数是在源串中开始搜索的下标位置
size_type find (const value_type* _Ptr, size_type _Off = 0, size_type _Count) const;
//第1个参数是被搜索的字符串,第2个参数是源串中开始搜索的下标,第3个参数是关于第1个参数的字符个数,可能是 _Ptr 的所有字符数,也可能是 _Ptr 的子串宇符个数
size_type find (const basic_string& _Str, size_type _Off = 0) const;
//第1个参数是被搜索的字符串,第2参数是在源串中开始搜索的下标位置
-
- rfind();和find相比是反向寻找
- find()