【Java】字符串

参考书籍资料:《零基础学Java》——明日科技 编著
部分内容来自百度百科


说明:文中代码框中的内容都应该填写在下面的<content>处:

//类的导入语句要写在开头这里
public class Name{
    public static void main(String args[]){
        <content>
    }
}

1. String 类

1.1 声明字符串

Java 通过java.lang.String这个类来创建可以保存字符串的变量,所以字符串变量是一个对象。

注意:在不给字符串变量赋值的情况下,其默认值为null,如果此时调用String的方法,则会发生空指针异常

1.2 创建字符串

给字符串变量赋值的 4 种方法:

  1. 引用字符串常量

    String a = "Hello, world!";
    
    /*下面这种写法也是正确的,但 s 是 null, 并没有保存任何字符串,
    因此不能调用任何方法,否则会引起空指针异常*/
    String s = null;
    
  2. 利用构造方法实例化

    String a = new String("Hello, world!");
    String b = new String(a);
    
  3. 利用字符数组实例化

    char[] arr = {'t', 'i', 'm', 'e'};
    String a = new String(arr);
    //最终,a = "time"
    
  4. 提取字符数组中的一部分创建字符串对象

    char[] arr = {'t', 'i', 'm', 'e'};
    String a = new String(arr, 2, 2);	//表示从数组 arr 的索引 2 开始,提取两个元素,创建一个字符串
    

2. 字符串的连接

2.1 连接字符串

使用+运算符可以连接多个字符串并产生一个String对象(+=同样可以实现字符串的连接)。

除此之外,String自带的concat()方法可以实现将指定字符串连接到此字符串结尾的功能,例子如下:

//使用格式:a.concat(str)  其中 a 是原字符串,str 是要拼接到末尾的字符串
String a = "Hello, ";
String b = a.concat("world!");

2.2 连接其他数据类型

字符串也可以同其他基本数据类型进行连接。如果字符串同这些数据类型的数据进行连接,会将这些数据直接转换成字符串(自动调用toString方法将其转换成字符串形式,然后参与连接)。

注意:只要+运算符的一个操作数是字符串,编译器就会将另一个操作数转换成字符串形式,所以应谨慎地将其他数据类型与字符串相连,以免出现意想不到的结果

此外,字符串在计算公式中的先后顺序会影响到运算结果。例如:

//碰到字符串后,直接输出后面内容
String a = "1" + 2 + 3 + 4;		//a 的值是 "1234"

//碰到字符串前,先做运算,后输出内容
String b = 1 + 2 + 3 + "4";		//b 的值是 "64"

//碰到字符串后,先运算大括号中的值,后输出内容
String c = "1" + (2 + 3 + 4)	//c 的值是 "19"

3. 提取字符串信息

3.1 获取字符串长度

length()方法会返回字符数量,获取字符串长度。

//使用格式:str.length()
String str = "Hello, world!";		//共 13 个字符
int size = str.length();
//size 的值也是 13

注意:字符串的length()方法与数组的length属性虽然都是用来获取长度的,但两者也有不同。前者是类的成员方法,要加括号,后者是;类的属性,没有括号

3.2 获取指定位置的字符

charAt()方法用来获取指定索引的字符。

//使用格式:str.charAt(index);	index 是索引值
String str = "Hello, world!";
char size = str.charAt(5);
//size 的值是 ','

3.3 获取子字符串索引位置

indexOf()方法返回的是搜索的字符或字符串在字符串中首先出现的索引位置,如果没有检索到要查找的字符或字符串,返回值为-1

//使用格式:str.indexOf(substr);		substr是要搜索的字符或字符串
String str = "Hello, world!";
int pos = str.indexOf("ld");
//pos 的值是 11

3.4 判断字符串首尾内容

startsWith()方法和endswith()方法分别用于判断字符串是否以指定的内容开始或结束。这两个方法的返回值都是boolean类型。

3.4.1 startsWith(String prefix) 方法

该方法用于判断字符串是否以指定的前缀开始。

//使用格式:str.startsWith(prefix);	str 是要判断的字符串,prefix 是作为前缀的字符串
String str = "Hello, world!";
System.out.println(str.startsWith("hel"));
//输出结果:false
System.out.println(str.startsWith("Hel"));
//输出结果:true
3.4.2 endsWith(String suffix) 方法

该方法判断字符串是否以指定的后缀结束。

//使用格式:str.endsWith(suffix);	str 是要判断的字符串,suffix 是作为后缀的字符串
String str = "Hello, world!";
System.out.println(str.endsWith("ld"));
//输出结果:false
System.out.println(str.endsWith("ld!"));
//输出结果:true

3.5 获取字符数组

toCharArray()方法可以将字符串转换为一个字符数组。

//使用格式:str.toCharArray();
String str = "Hello, world!";
char[] ch = str.toCharArray();
//ch 便是一个字符数组,长度为 13

3.6 判断子字符串是否存在

contains()方法可以判断字符串中是否包含指定的内容。

//使用格式:str.contains(string);
String str = "Hello, world!";
System.out.println(str.contains("Hel"));
//输出结果:true

4. 字符串的操作

4.1 截取字符串

substring()方法返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的beginIndex处的字符串开始,直到索引endIndex - 1处的内容。

/*使用格式:
str.substring(beginIndex);			从 beginIndex 开始一直输出到末尾
str.substring(beginIndex, endIndex);从指定的 beginIndex 开始,直到索引 endIndex - 1 处
*/
String str = "Hello, world!";
System.out.println(str.substring(7));		//输出:world!
System.out.println(str.substring(0, 5));	//输出:Hello

4.2 字符串替换

replace()方法可以实现将指定的字符序列替换成新的字符序列。

//使用格式:str.replace(oldstr, newstr);
//如果字符串 str 中没有找到需要被替换的子字符序列 oldstr ,则将原字符串返回
String str = "嘿哈!嘿哈!嘿哈!";
String newstr1 = str.replace("嘿", "哈");
System.out.println(newstr1);
//输出结果:哈哈!哈哈!哈哈!
String newstr2 = str.replace("哈!", "哟~");
System.out.println(newstr2);
//输出结果:嘿哟~嘿哟~嘿哟~

4.3 字符串分割

split()方法可根据给定的分隔符对字符串进行拆分,支持正则表达式(正则表达式入门的文章:正则表达式30分钟入门教程——deerchao 作),最后返回一个字符串数组

//使用格式:str.split(regex);	regex 是分隔符的正则表达式
String str = "<Jan.><Feb.><Mar.><Apr.><May.><Jun.><Jul.><Aug.><Sep.><Oct.><Nov.><Dec.>";
String[] month = str.split("^<|><|>$");
//分隔符这里选择了三种:'^<', '><', '>$'	'^'代表字符串开始,'$'代表字符串结尾
for(int i = 0; i < month.length; i++) {
	System.out.println(month[i]);
}

数组month的长度为13,第一个元素是空字符串(产生的原因可参考这篇CSDN文章:Java split()后开头多出空字符串的原因分析)。输出结果:


Jan.
Feb.
Mar.
Apr.
May.
Jun.
Jul.
Aug.
Sep.
Oct.
Nov.
Dec.

4.4 大小写转换

4.4.1 toLowerCase() 方法

该方法将字符串中的所有字符串转换为小写。如果字符串中没有应该被转换的字符,则将原字符串返回。

//使用格式:str.toLowerCase();
String str = "Hello, world!";
String newstr = str.toLowerCase();
//newstr 是 "hello, world!"
4.4.2 toUpperCase() 方法

该方法可以将字符串中的所有字符转换为大写。如果字符串中没有应该被转换的字符,则将原字符串返回。

//使用格式:str.toUpperCase();
String str = "api gui";
String newstr = str.toUpperCase();
//newstr 是 "API GUI"

4.5 去除空白内容

trim()方法可以将字符串首尾处的空白内容都删除(包括转义的换行符\n、制表符\t)。

//使用格式:str.trim();
String str = "	\n	Hello, world!	\t		";
System.out.print("a[");			//这里用了"print"是为了突出去除效果,下同
System.out.print(str.trim());
System.out.print("]b");

输出结果:

a[Hello, world!]b

4.6 比较字符串是否相等

想要比较两个字符串对象的内容是否相同,就需要用equals()方法。当且仅当进行比较的字符串不为null,并且与被比较的字符串内容相同时,结果才为true

//使用格式:str1.equals(str2);
String password = "162534";
String againPassword = "165234";
System.out.println(password.equals(againPassword));
//输出结果:false

5. 可变字符串 StringBuffer 类

StringBuffer类是线程安全的可变字符序列,一个类似于String类的字符串缓冲区,两者实质上是一样的,但StringBuffer类的执行效率要比String类快很多。前面内容介绍过String类创建的字符串对象是不可修改的,这一节介绍的StringBuffer类创建的字符串序列是可修改的,且实体容量会随着存放的字符串增加而自动增加。

这里的 Stringbuffer 其实和 C++ 里的 string 比较像

下面介绍StringBuffer类的创建及常用方法:

5.1 创建 StringBuffer 类

创建一个新的StringBuffer对象必须用关键字new,而不能像String对象那样直接引用字符串常量。

//下面三个语句都合法:
StringBuffer sbf = new StringBuffer();		//创建一个对象,无初始值
StringBuffer sbf = new StringBuffer("hello");//创建一个对象,初始值为"hello"
StringBuffer sbf = new StringBuffer(32);	//创建一个对象,初始容量为32个字符

5.2 append () 方法

append()方法可将参数转换成字符串,然后追加到对象后面。

//使用格式:sbf.append(obj);
//obj 可以是任意数据类型的对象,如 int, double, boolean 等,都会转变成字符串的表示形式
StringBuffer sbf = new StringBuffer("Hello");
sbf.append(", world!");
//追加后,sbf 的值为 "Hello, world!"

5.3 setCharAt (int index, char ch) 方法

setCharAt()方法可以将给定索引处的字符修改为ch

StringBuffer sbf = new StringBuffer("12365468750");
for(int i = 3; i < 7; i++){
    sbf.setCharAt(i, 'X');
}
System.out.println(sbf);
//输出结果:123XXXX8750

5.4 insert(int offset, String str) 方法

将字符串str插入到指定的索引值offset位置上。

//使用格式:sbf.insert(offset, str);		offset 是指定索引位置,str是待插入的字符串
StringBuffer sbf = new StringBuffer("Hello!");
sbf.insert(5, ", world");
System.out.println(sbf);
//输出结果:Hello, world!

5.5 delete(int start, int end) 方法

delete()方法可移除此序列的子字符串中的字符。该子字符串是从指定的索引start处开始,一直到索引end - 1处,如果end - 1超出最大索引范围,则一直到序列尾部。如果start等于end,则不发生任何更改。

//使用格式:sbf.delete(start, end);
StringBuffer sbf = new StringBuffer("Hello, my world!");
sbf.delete(7, 10);
System.out.println(sbf);
//输出结果:Hello, world!

5.6 其他方法

前面String中的length()charAt()indexOf()substring()equals()都可以用在StringBuffer的对象上,格式还是一样的。而replace()的使用方法就不太一样了,而且使用格式不对会报错:

StringBuffer sbf = new StringBuffer("Hello, my world!");

//错误的使用格式:
sbf.relpace("my", "your");

//正确的使用格式,应该先给出两个索引 start 和 end,再给出要替换的字符串
sbf.replace(7, 9, "your");	//正确的替换后,sbf 的值为 "Hello, your world!"

前面列出的String能用的函数中,这里没有提及的函数在StringBuffer中都是未定义的。有:+连接符,stratsWith()endsWith()toCharArray()contains()split()toLowerCase()toUpperCase()trim()

6. StringBuffer 与 String 的不同之处

String只能赋值一次,每一次内容发生改变都生成了一个新的对象,然后原有的对象引用新的对象,所以说String本身是不可改变的。每一次改变String的字符串内容,都会在内存创建新的对象,而每一次生成新对象都会对系统性能产生影响,这会降低 Java 虚拟机的工作效率。

StringBuffer不同,每次都是操作自身对象,而不是生成新的对象,其所占空间会随着字符内容增加而扩充,做大量的修改操作时,不会因生成大量匿名对象而影响系统性能。


字符串部分的内容就到此结束了。

下篇预告:【Java】面向对象编程基础

链接指路:
上一篇:【Java】 基础部分中相较于C的新知识

下一篇:【Java】面向对象编程基础

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值