首先我们来说一下java.lang.String类
- 这个类代表字符串
- API文档中说明,Java程序中所有的字符串字面值(如“abc”)都作为此类的实例实现。
换句话说就是程序当中所有的双引号字符串,都是String类的对象。(就算没有new,也照样是。)
字符串的特点:
- 字符串的内容永不可变。【重点】
- 字符串可以共享使用。(字符串常量池)
- 字符串效果上相对于是char[]字符串数组。(但是底层原理都是byte[]字节数组。)
创建字符串的常见3+1种方式:
3种构造方法:
- public String()
创建一个空白的字符串,不含有任何内容。
String str1 = new String();
- public String(char[] array)
根据字符数组的内容,来创建对应的字符串。
char[] charArray = {'a', 'b', 'c'};
String str2 = new String(charArray);
- public String(byte[] array)
根据字节数组的内容,来创建对应的字符串。
byte[] byteArray = {97, 98, 99};
String str3 = new String(byteArray);
1种直接创建:
- String str = “abc”
(这种是直接在字符串常量池中创建)
String str = "abc";
【注意:直接写上双引号,就是字符串对象】
字符串常量池:
!!重点:通过赋值直接创建的String对象在字符串常量池中
public static void main(String[] args) {
String str1 = "abc";
String str2 = "abc";
char[] charArray = {'a','b','c'};
String str3 = new String(charArray);
System.out.println(str1 == str2); //true 在基本类型中,==是比较值是否相等。
System.out.println(str1 == str3); //false 在引用类型中,==是比较地址是否相等。
}
- str1先在字符串常量池中寻找,没有则被创建,实际是通过byte[]实现,字符串常量池中的str指向byte[]的地址,最终str1指向byte[]的地址。
- str2也先在字符串常量池中寻找,因为字符串对象在常量池中是共享的,所以str2也指向byte[]的地址。
- charArray是通过char[]创建,然后str3通过new一个字符串对象。【注意!!这里new的不会在字符串常量池中】
- char[]会被转换成byte[]【此处的byte[]地址和str1中的不一样了,仍是char[]的地址】,然后str3指向这个地址。
String类常用方法:
String当中内容比较的常用的方法有:
- public boolean equals(Object obj)
参数可以是任何对象,只有参数是一个字符串并且内容相同的才会给true;否则返回false。
String string1 = "hello";
String string2 = "hello";
System.out.println(string1.equals(string2)); //true
- public boolean equalsIgnoreCase(String str)
忽略大小写,进行内容比较。
String string1 = "hello";
String string2 = "Hello";
System.out.println(string1.equals(string2)); //false
String当中内容操作常用的方法有:
- public int length()
获取字符串当中含有的字符串个数,拿到字符串长度
String string1 = "hello";
System.out.println(string1.length()); //5
- public String concat(String str)
将当前字符串和参数字符串拼接成一个新的字符串,并返回这个字符串
String string1 = "hello";
String string2 = "Hello";
String string3 = string2.concat(string1);
System.out.println(string3); //helloHello
- public char charAt(int index)
获取索引位置的单个字符串
String string1 = "hello";
char char1 = string1.charAt(2);
System.out.println(char1); //l
- public int indexOf(String str)
查找参数字符串在本字符串当中首次出现的索引位置
String string1 = "hello";
int num = string1.indexOf("e");
System.out.println(num); //1
- public String substring(int index)
截取从参数位置一直到字符串末尾,返回新的字符串
String string1 = "helloword";
String string2 = strings.substring(5);
System.out.println(string2); //word
- public String substring(int begin, int end)
截取从begin开始,一直到end结束,返回新的字符串,包含begin的字符,不包含end字符。
String string1 = "helloword";
String string2 = strings.substring(0,5);
System.out.println(string2); //hello
String当中与转换相关的常用的方法有:
- public char[] toCharArray()
将当前字符串拆分成为字符数组作为返回值。
String string1 = "helloword";
char[] chars = string1.toCharArray();
for (char a: chars) {
System.out.print(a + ",");
}
//h,e,l,l,o,w,o,r,d,
- public byte[] getBytes()
获得当前字符串底层的字节数组。
String string1 = "helloword";
byte[] bytes = string1.getBytes();
for (byte a: bytes) {
System.out.print(a + ",");
}
//104,101,108,108,111,119,111,114,100,
- public String replace(CharSequence oldString, CharSequence newString)
将所有出现的老字符串替换成新字符串,返回替换之后的新字符串。
String string2 = "套你猴子!!!套你猴子!!";
String replace = string2.replace("套你猴子", "xxxx");
System.out.println(string2);
System.out.println(replace);
//套你猴子!!!套你猴子!!
//xxxx!!!xxxx!!
String当中与切割字符串的方法:
- public String[] split(String regex)
按照参数的规则,将字符串切分成为若干部分。
String string3 = "aa,bb,cc";
String[] str1 = string3.split(",");
for (String a: str1) {
System.out.println(a);
}
//aa
//bb
//cc
注意!!!!!
split方法的参数其实是一个“正则表达式”。
需要特别注意:如果按照英文句点“.”进行切分,将无法切分,获得的字符串数组为空,必须写“\\.”
例如:
String string1 = "aa.bb.cc";
String[] string2 = string1.split(".");
System.out.println(string2.length); //长度为0,下面foreach不执行
for (String a:str2) {
System.out.println(a);
}