参考书籍资料:《零基础学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 种方法:
-
引用字符串常量
String a = "Hello, world!"; /*下面这种写法也是正确的,但 s 是 null, 并没有保存任何字符串, 因此不能调用任何方法,否则会引起空指针异常*/ String s = null;
-
利用构造方法实例化
String a = new String("Hello, world!"); String b = new String(a);
-
利用字符数组实例化
char[] arr = {'t', 'i', 'm', 'e'}; String a = new String(arr); //最终,a = "time"
-
提取字符数组中的一部分创建字符串对象
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】面向对象编程基础