String,无论是开发还是测试,可以说是Java语言中使用最为频繁的了,因此在学习测试开发的道路上,String类也是非学不可的基础中的基础,重点中的重点
1、什么是String类
- 我们打开jdk的API文档可以看到如下解释:
从API文档中我们得到如此下几个主要信息: String
类位于java.lang
包下,代表字符串- Java程序中的所有字符串文字(例如"abc" )都被实现为此类的实例;意思就是就算没有new对象,只要用双引号括起来的字符串就是类
String
的对象 - 字符串是常量,创建之后不可更改
- 因为字符串不可变,所以可以被共享使用
- 字符串在效果上相当于是char[]数组,但是底层原理是byte[]字节数组
- 创建String对象实际上相当于如下两步:
@Test public void stringTest(){ char[] data = {'1','B'}; //1.先创建一个char类型的数组 String str = new String(data); //再new一个String对象 System.out.println(str); //打印String对象 } //得到结果如下 1B
2、字符串的创建
2.1 构造方法
查看String的构造方法发现有很多
平常也没觉得String有多难啊,怎么这么多构造方法,别慌~
- 仔细看文档的内容发现有很多方法注明了
“已弃用”
,也就是说已经过时了,现在不用了,有更好的方法可以替代;
那么问题又来了,既然已经弃用了还放在这里干嘛,显得罗里吧嗦的;这是因为很多老的项目可能用的是老版本的Java,为了保证这些项目的运行不受影响,所以依然不能直接将它们删除。 - 可以重点记住我们常用的4种字符串创建方式,其余的用到时候再查文档也不迟
2.2 创建对象
- 空参构造创建-
public String(){}
@Test public void stringTest1(){ String str1 = new String(); System.out.println("空参构造创建" + str1); } //测试结果 空参构造创建
- 根据字符数组创建-
public String(char[] array)
@Test public void stringTest2(){ char[] chars = {'a','b','c'}; String str2 = new String(chars); System.out.println("字符数组创建" + str2); } //测试结果 字符数组创建abc
- 根据字节数组创建-
public String(byte[] array)
在这里稍微停一哈,我们从测试结果中可以看到用字节数组创建的结果打印出来后和字符数组创建打印的结果一样,这是因为根据ASCII编码表发现,字节数97,98,99分别就对应代表了a,b,c@Test public void stringTest3(){ byte[] bytes = { 97, 98, 99 }; String str3 = new String(bytes); System.out.println("字节数组创建" + str3); } //测试结果 字节数组创建abc
- 直接创建-
String
,这种也是我们最常用最简单的一种方式@Test public void stringTest4(){ String str4 = "hello tester!"; System.out.println(str4); } //测试结果 hello tester!
3、字符串的使用
3.1 字符串的比较
3.1.1 ==比较
- 如下比较3个字符串内容均为"abc"的字符串:
从结果中看到str1和str2的比较相等,其余均为false,这是为什么呢?@Test public void stringTest(){ String str1 = "abc"; String str2 = "abc"; char[] charArray = {'a','b','c'}; String str3 = new String(charArray); System.out.println(str1 == str2); System.out.println(str1 == str3); System.out.println(str3 == str2); } //测试结果 true false false
因为对于引用类型来说,==
进行的是地址值的比较;且双引号直接写的字符串在常量池中,new的不在池当中
参考如下内存图:
3.1.2 equals比较
在String的方法中有这样一个方法,API文档描述如下:
大概的意思就是说:仅当参数是一个字符串且内容完全相同才返回true,否则就返回false
- 接着我们运行如下测试代码:
@Test
public void stringTest(){
String str1 = "abc";
String str2 = "abc";
char[] charArray = {'a','b','c'};
String str3 = new String(charArray);
System.out.println(str1.equals(str2));
System.out.println(str1.equals(str3));
System.out.println(str3.equals(str2));
System.out.println("abc".equals(str1)); //推荐写法
System.out.println(str3.equals("abc")); //不推荐写法,若对象为null就会报空指针异常
}
//测试结果
true
true
true
true
true
这个时候从测试结果中我们可以看到只要内容相同就返回了true。
- 另外在上面的方法截图最下方,我们还看到了一个方法
equalsIgnoreCase(String)
,这个方法也是很常用的一个比较方法,可以忽略英文字母的大小写
实例演示:@Test public void stringTest(){ String a = "tester"; String b = "TestER"; System.out.println(a.equalsIgnoreCase(b)); } //测试结果 true
3.2 字符串其他常用方法
3.2.1 字符串获取
方法 | 作用 |
---|---|
public int length() | 获取字符串中含有的字符个数,得到字符串长度 |
public String concat(String str) | 将当前字符串和参数字符串拼接成新的字符串返回 |
public char charAt(int index) | 获取指定索引位置的字符串 |
public int indexOf(String str) | 查找参数字符串在本字符串当中首次出现的索引位置,若没有就返回-1 |
3.2.2 字符串截取
方法 | 作用 |
---|---|
public String substring (int beginIndex) | 返回一个子字符串,从beginIndex开始截取字符串到字符串结尾 |
public String substring (int beginIndex, int endIndex) | 返回一个子字符串,从beginIndex到endIndex截取字符串。含beginIndex,不含endIndex。 |
3.2.3 字符串替换
方法 | 作用 |
---|---|
public char[] toCharArray() | 将当前字符串拆分成为字符串数组作为返回值 |
public byte[] getBytes() | 获得当前字符串底层的字节数组 |
public String replace(CharSequence oldString, CharSequence newString) | 将所有出现的old字符串替换成new字符串,返回替换后的新字符串 |
3.2.4 字符串切片
方法 | 作用 |
---|---|
public String[] split(String regex) | 按照参数规则,将字符串切分成若干部分 |