1、概述
字符串是由多个字符组成的一串数据(字符序列); 字符串可以看成是字符数组
2、特点
字符串不变; 它们的值在创建后不能被更改。 字符串是常量,一旦被赋值,字符串本身不能被修改,赋值后会新开辟一空间,原字符串地址和值不变。
3、构造方法
(1)public String():无参构造方法,String s = new String();创建String对象,s.length为字符串长度。
(2)public String(byte[] bytes):根据一个字节数组创建出一个字符串对象。
byte[] b = {97, 98, 99, 100, 101};//String是字符数组,会根据ASCII码表转成对应的字符。
String s2 = new String(b);//输出s2会得到abcde
public String(byte[] bytes,int offset,int length):将字节数组offset位置开始(包括offset位置)length个元素转成一个字符串,如果length个超出数组长度,则会报错
String s3 = new String(b, 1, 3);//将b数组1位置包括1位置的三个元素转换成字符数组。
System.out.println("s3: " + s3);//输出为bcd
(3)public String(char[] value):将字符数组转成一个字符串
public String(char[] value,int offset,int count):将字符数组offset位置开始(包括offset位置)count个元素转成一个字符串,count同上。
(4)public String(String original):将一个字符串在堆中开辟了空间
String s7 = "你好";
String s8 = new String(s7);
System.out.println("s8: " + s8);
4、String s1 = new String(“hello”)和String s2 = “hello”;的区别?
System.out.println(s1==s2);输出结果为false;地址值不同
System.out.println(s1.equals(s2)); 输出结果为true;但字符串值相同
1、==比较引用数据类型的时候,比较的时候地址值
2、String类中使用equals方法比较的是字符串的值,因为String类中重写了equals方法
注意:
1、字符串如果是变量相加,是先在常量池中开辟空间,然后再做拼接。
2、字符串如果是常量相加,是先相加,然后再去常量池中去找,如果找到了就不会开辟新的地址,如果没有找到就开辟新的空间,存储拼接后的值。
String s1 = "hello";
String s2 = "world";
String s3 = "helloworld";
String s4 = "hello"+"world";
System.out.println(s3==s4); // true,找到了相同的字符串,没有开辟新空间
String s5 = s1+s2;
System.out.println(s3==s5); // false
System.out.println(s3==(s1+s2)); // false
System.out.println(s3.equals(s1+s2)); // true
5、String类的判断功能(返回的都是boolean类型的)
(1)boolean equals(Object obj):比较字符串中的内容是否相同,区分大小写比较的
System.out.println(s1.equals(s2));比较字符串s1和s2中的内容是否相同
boolean equalsIgnoreCase(String str):比较字符串中的内容是否相同,忽略大小写
System.out.println(s1.equalsIgnoreCase(s2));比较是s1和s2的内容是否相同
(2)boolean contains(String str):判断大的字符串中是否包含小的字符串
System.out.println(s1.contains("Hello"));//判断s1中是否含有“Hello”字符串
(3)boolean startsWith(String str):判断此字符串是否以指定字符串开头
boolean endsWith(String str):判断此字符串是否以指定字符串结尾
System.out.println(s1.startsWith("hel")); //s1是不是以“hel”开头
System.out.println(s1.endsWith("rld")); //s1是不是以“rld”结尾
(4)boolean isEmpty():判断字符串是否是空字符串
注意:
变量1.equals(变量2)的时候,如果变量1位null,运行时程序会报错,所以在做比较前可以做个判断,判断变量1是不是null,然后在进行比较,变量2位null时不会报错。
6、String类的获取功能
(1)char charAt(int index):返回指定索引处的字符,index超过字符串长度会报错。
(2)int indexOf(int ch):返回指定字符第一次出现的字符串内的索引,获取指定字符在字符串中的位置,没找到则返回-1
public int indexOf(String str):返回指定子字符串第一次出现的字符串内的索引,获取指定子字符串第一个字符在父字符串的位置,没找到返回-1.
public int indexOf(int ch,int fromIndex):以指定的索引开始搜索返回指定字符第一次出现的字符串内的索引,没找到返回-1。
int indexOf(String str,int fromIndex):以指定的索引开始搜索返回指定字符串第一个字符出现的字符串内的索引,没找到返回-1。
String s = "helloworld";
System.out.println(s.indexOf('o'));//结果为4
System.out.println(s.indexOf("owo"));//结果为4
System.out.println(s.indexOf("l",4));//从位置4开始往后找,结果为8
(3)String substring(int start): 从指定位置处截取字符串,包括开始截取的位置,截取到末尾 如果给的索引值不存在,报错
String substring(int start,int end):截取字符串的一部分出来,截取的串从start位置开始截取,截取到end-1的位置结束 左闭右开 [,) 含头不含尾,如果给的索引值不存在,报错
String s = "helloworld";
System.out.println(s.substring(3));//loworld
System.out.println(s.substring(5,8));//wor
7、String类的转换功能
(1)byte[] getBytes():将字符串根据ASCII码表转成字节数组
String s = "HelloWorLD";
byte[] b = s.getBytes();
//输出数组b为s的ASCII码值:72 101 108 108 111 87 111 114 76 68
(2)char[] toCharArray(): 将字符串转成字符数组
String s = "HelloWorLD";
char[] c = s.toCharArray();//将字符串转成字符数组赋值给了c数组。
(3)static String valueOf(char[] chs):将字符数组转成字符串
static String valueOf(int i):将int类型的数据转成字符串
String s1 = String.valueOf(c);//c为字符数组
String s2 = String.valueOf(100);// 100 --> "100"
(4)String toLowerCase():将字符串中的内容全部转小写
String toUpperCase():将字符串中的内容全部转大写
String s = "HelloWorLD";
String s3 = s.toLowerCase();
System.out.println(s3); //helloworld
String s4 = s.toUpperCase();
System.out.println(s4); //HELLOWORLD
(5)String concat(String str):将小括号中str的字符串拼接到大字符串的后面
String s = "HelloWorLD";
String s5 = s.concat("hadoop");
System.out.println(s5);//HelloWorLDhadoop
(6)public String[] split(String s):求出字符串中的每一个单词
String s6 = "hello world hello java world";
String[] strings = s6.split(" ");//如果单词是以逗号隔开的,这里空格改成逗号
for(int i=0;i<strings.length;i++){
System.out.print(strings[i]+"\t");
}
//结果为hello world hello java world
8、String类的其他功能:
(1)替换功能
String replace(char old,char new):将新的字符串替换字符串中指定的所有字符,并返回一个替换后的字符串
String replace(String old,String new):将字符串中就的小字符串用新的小字符串串替换,返回一个替换后的字符串
如果被替换的字符串或字符不存在,返回的是原本的字符串。
String s = "llohelloowo";
String s1 = s.replace('l', 'q');//s1为qqoheqqoowo
String s2 = s.replace("owo", "===");//s2为llohello===
(2)String trim() :去除字符串两边的若干个空格
String s5 = " hello world ";
System.out.println(s5.trim());//结果为hello world两边空格都没了
(3)int compareTo(String str):比较字符串是否相同,如果相同返回0,区分大小写
如果不同,在第几个字符不同就返回在字符串中这个位置的两个字符的ASCLL值的差(1减去2:字符串1.compareTo(字符串2))
如果1为hello,2为hel,则返回两个字符串长度的差为2(1.length减去2.length)
String s6 = "hello"; // l的ASCII码值是 108
String s7 = "hello";
String s8 = "heqlo"; // q的ASCII码值是 113
String s9 = "hel";
System.out.println(s6.compareTo(s7)); // 0 相同
System.out.println(s6.compareTo(s8)); // -5 ASCII之差
System.out.println(s6.compareTo(s9)); // 2 长度之差
int compareToIgnoreCase(String str):和上面的规则差不多,就是不区分大小写,ASCII值都是按小写的来