1. String类的重要性
在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提供的字符串系列函数完成大部分操作,但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想,而字符串应用又非常广泛,因此Java语言专门提供了String类。
在面试中也频繁被问到,比如:String、StringBuff和StringBulider之间的区别等。
2. 常用方法
2.1 字符串构造
字符串的三种常用定义方式
// 字符串的三种定义方式
public static void main(String[] args) {
String str1 = "hello";
String str2 = new String("abcd");
char[] chars = {'a','b','c'};
String str3 = new String(chars);
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
}
关于这三种定义字符串的存储方式,我们可以通过debug一下,去看看,见下图内容
存储方式:
str1, str2
str3
2.2 求字符串长度
注意:在Java中“ ”引起来的也是String类型对象
例如现在去让我们求一下“hello”的长度
public static void main(String[] args) {
System.out.println("hello".length());
}
2.2.1 .length() 与 .length 的区别
- . l e n g t h 是求数组的长度 \color{red}{.length是求数组的长度} .length是求数组的长度
- . l e n g t h ( ) 是求字符串的长度 \color{red}{.length() 是求字符串的长度} .length()是求字符串的长度
public static void main(String[] args) {
int[] array = {1,2,3,4};
String str = "hello";
System.out.println(array.length);
System.out.println(str.length());
}
2.3 String对象的比较
字符串的比较是常见操作之一,比如:字符串排序。Java中总共提供了4中方式:
-
== 比较是否引用同一个对象(地址)
-
.equals() 方法比较两字符串是否一样
equals返回的是boolean类型
-
compareTo() 方法比较
compareTo返回的是int类型
2.3.1charAt() 方法
我们可以通过使用charAt() 方法来打印字符串
public static void main(String[] args) {
String str1 = "hello";
for (int i = 0; i < str1.length(); i++) {
System.out.print(str1.charAt(i));
}
}
2.4转化
- 数值和字符串转化
2.4.1 数字 --> 字符串
String.valueOf()
String s1 = String.valueOf(1234);
2.4.2 字符串 --> 数字
Integer.parseInt
int data1 = Integer.parseInt("1234")
2.4.3 字符串 --> 数组(常用)
public static void main(String[] args) {
String s1 = "hello";
char[] chars = s1.toCharArray();
for (char x:chars) {
System.out.println(x);
}
System.out.println(s1);
}
2.4.4 数组 --> 字符串(常用)
public static void main(String[] args) {
char[] chars = {'a','b','c'};
String str = new String(chars);
System.out.println(str);
}
2.5 字符串替换
使用一个指定的新的字符串替换掉已有的字符串数据,可用的方法如下:
方法 | 功能 |
---|---|
String replaceAll(String regex, String replacement) | 替换所有的指定内容 |
String replaceFirst(String regex, String replacement) | 替换首个内容 |
2.6 字符串拆分
可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串。
可用方法如下:
方法 | 功能 |
---|---|
String[] split(String regex) | 将字符串全部拆分 |
String[] split(String regex, int limit) | 将字符串以指定的格式,拆分为limit组 |
代码示例:
public static void main(String[] args) {
String str = "welcome to CSDN we are family";
String[] s1 = str.split(" ");
for (String x:s1) {
System.out.println(x);
}
}
String[] split(String regex)
String[] split(String regex, int limit)
public static void main(String[] args) {
String str = "welcome to CSDN we are family";
String[] s1 = str.split(" ",4);
for (String x:s1) {
System.out.println(x);
}
}
注意事项:
- 字符"|“,”*“,”+"都得加上转义字符,前面加上 “\” .
- 而如果是 “” ,那么就得写成 “\\” .
- 如果一个字符串中有多个分隔符,可以用"|"作为连字符.
2.7 字符串截取
从一个完整的字符串之中截取出部分内容。可用方法如下:
方法 | 功能 |
---|---|
String substring(int beginIndex) | 从指定索引截取到结尾 |
String substring(int beginIndex, int endIndex) | 截取部分内容 |
public static void main(String[] args) {
String str = "abcdef";
String ret1 = str.substring(2);//从2位置开始截取
String ret2 = str.substring(3,5);//[3,5)
System.out.println(ret1);
System.out.println(ret2);
}
2.8 其他操作方法
方法 | 功能 |
---|---|
String trim() | 去掉字符串中的左右空格,保留中间空格 |
String toUpperCase() | 字符串转大写 |
String toLowerCase() | 字符串转小写 |
S t r i n g 类的对象,一般返回的都是新的对象 \color{red}{String类的对象,一般返回的都是新的对象} String类的对象,一般返回的都是新的对象
3. StringBuilder和StringBuffer
3.1 StringBuilder
由于String的不可更改特性,为了方便字符串的修改,Java中又提供StringBuilder和StringBuffer类。这两个类大
部分功能是相同的,这里介绍 StringBuilder常用的一些方法
3.1.1 拼接字符串原理
看这几行代码
public static void main(String[] args) {
String s = "hello";
s += " world";
System.out.println(s);
}
实际他还调用的了StringBuilder
public static void main(String[] args) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("hello");
stringBuilder.append(" world");
String str = stringBuilder.toString();
System.out.println(str);
}
3.1.2StringBuilder逆置字符串
public static void main(String[] args) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("hello");
System.out.println(stringBuilder.reverse());
}
String和StringBuilder最大的区别在于String的内容无法修改,而StringBuilder的内容可
以修改。频繁修改字符串的情况考虑使用StringBuilder
注意:String和StringBuilder类不能直接转换。如果要想互相转换,可以采用如下原则:
- String变为StringBuilder: 利用StringBuilder的构造方法或append()方法
- StringBuilder变为String: 调用toString()方法。
3.2 面试题:
String、StringBuffer、StringBuilder的区别??
- String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
- StringBuffer与StringBuilder大部分功能是相似的
- StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操
作
以下代码总共创建了多少个String对象【前提不考虑常量池之前是否存在】
String str = new String("ab"); // 会创建多少个对象
String str = new String("a") + new String("b"); // 会创建多少个对象
String类习题练习
class Solution {
public int firstUniqChar(String s) {
int[] count = new int[26];
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
count[ch-'a']++;
}
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (count[ch-'a'] == 1) {
return i;
}
}
return -1;
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextLine()) { // 注意 while 处理多个 case
String str = in.nextLine();
int index = str.lastIndexOf(" ");
String ret = str.substring(index+1);
System.out.println(ret.length());
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextLine()) { // 注意 while 处理多个 case
String str = in.nextLine();
String[] strings = str.split(" ");
System.out.println(strings[strings.length-1].length());
}
}
class Solution {
private boolean isLegalChar(char ch){
if (ch >= 'a' && ch <= 'z' || ch >= '0' && ch <= '9'){
return true;
}
return false;
}
public boolean isPalindrome(String s) {
s = s.toLowerCase();
int left = 0;
int right = s.length()-1;
while (left<right) {
while (left<right && !isLegalChar(s.charAt(left))){
left++;
}
while (left<right && !isLegalChar(s.charAt(right))){
right--;
}
if (s.charAt(left) != s.charAt(right)){
return false;
}else {
left++;
right--;
}
}
return true;
}
}
今天的分享就到此结束了!
2022年10月12日16:11:19