目录
1.String(字符串)的特点
- 字符串是常量、一旦被创建(声明)、那么它将无法再被改变。【重要】
例如:
String str1="abc";
System.out.println(str1);
//将字符串“abc”的地址值赋给了下面的str1,而字符串本事是不发生改变的,因为它们已经被创建出来就无法再更改。
str1="bcd";
System.out.println(str1);
//改变的不是字符串,只是地址值发生了改变
- 字符串的底层是一个被final修饰byte【】、因此说它一旦被创建就不会再被改变。
- 字符串进行相加时,会造成内存中有多个字符串占用空间,效率不高。
例如:
//会创建有五个字符串对象,占用内存
//即 “a”、“b”、“c”、“ab”、“abc”
String str="a"+"b"+"c";
System.out.println(str);
- 程序中以双引号“”包括的,哪怕没有指定类型或者说没有使用new来创建,也会认为是创建了一个String类的对象。使用这种直接方式创建的字符串对象会被放在堆内存中的字符串常量池中,此时再次使用直接声明的方式声明一个相同字符串时,就会把上一个字符串的地址值也赋值给它。
但是使用new的方式创建的字符串就不在常量池中,会直接创建并拿到新的地址。即每次创建一样的字符串地址值也是不一样的。如下:
String str1="abc";
String str2="abc";
String str3=new String("abc");
System.out.println(str1==str2); //true
System.out.println(str1==str3); //false
System.out.println(str3==str2); //false
- 因为字符串创建后是不可变的,所以它可以共享使用。且字符串在效果上是相当于char【】数组的、其实底层是byte的数组。
2.字符串的常见创建方式
- 直接创建:
就是上面说的,不是用new关键字直接声明;
String str1="abc";
- 无参构造方法:得到一个长度为0的空字符串
String str = new String();
System.out.println("str="+str); //str=
- 有参构造方法(char[] array):根据char数组的内容创建对应的字符串
char[] array1={'a','b','c'};
String str1=new String(array1);
System.out.println(str1); //abc
- 有参构造方法(byte[] array):根据char数组的内容创建对应的字符串
byte[] array2={97,98,99};
String str2 = new String(array2);
System.out.println(str2); //abc
3.字符串的比较方法
注:中文在java里无区分大小写一说,例如 一和壹,这就是两个不同的字符串
- equals():比较两个字符串是否相等,且严格区分大小写
这里我们会产生一个疑惑,不是说equals是object的方法吗,它不是用来比较地址值得吗?
可以看到,在Object类的equals方法源码中,专门添加了对String类型的使用;所以针对String就是比较值。
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
String str1="abc";
String str2="abc";
String str3="Abc";
System.out.println(str1.equals(str2));//true
System.out.println(str1.equals(str3));//false
System.out.println(str1.equalsIgnoreCase(str3));//true
- equalsIgnoreCase()、这个方法不区分大小写,在上面代码中有体现了。
4.字符串获取的相关方法
- int length():返回当前字符串对象的长度。
- char charAt(int index):返回字符串中当前参数(index)索引位置的单个字符。索引是从0开始
- int indexOf(String str):查找参数字符在当前字符串中第一次出现的位置(索引值)。
- String concat(String str2):将参数字符串添加在当前字符串的末尾,并返回一个新的字符串。
这个简单就不演示了。
5.字符串的截取
- char[ ] toCharArray():将当前字符串 [转换] 成一个字符数组的形式并返回。
- byte[ ] getBytes()😗*[得到]**当前一个字符串底层的byte数组。
- String replace(CharSequence oldString,CharSequence newString):将当前字符串中出现的所有参数1(oldString)全部使用新的参数2(newString)替换,返回替换后的新字符串。
注:CharSequence 这是个接口,我们可以将它认为就是接受String类型的参数就行。
6.字符串的分割
- String[ ] split(String regex);将当前字符串按照指定的格式分割,得到一个字符串数组。
注:参数regex:是正则表达式。像 逗号【,】就可以直接指定
好了、String类到此结束!