前言
学习任何一个类的时候,先要阅读这个类的帮助文档的说明:理解当前这个类或接口到底是干什么的。然后查看它的构造函数,看能不能创建对象。然后去查看API,看下这个类下面有哪些方法,每个方法都有什么作用,当自己在开发中遇到某种需求后,看看这个类中的有没有提供解决问题的方法,如果有直接创建对象,使用这个方法来解决问题即可。
String类
- 字符串常量,它在Java中不属于基本数据类型, 而是引用类型,也称为类类型。Java中使用String这个类描述字符串这种常量数据。
- 字符串常量,它属于对象,但是它不是存储在堆空间中,而是存储在方法区中的字符串常量池中。字符串常量池中保存的就是所有的字符串数据。只要我们书写了双引号,不管双引号中间是什么数据,这些数据都会立刻在字符串常量池中保存。并且一直存在,不会被改变。
String类的构造方法
使用双引号本身就可以得到一个字符串对象,String类提供了大量的构造函数,目的是可以帮助我们将其他的数据变成字符串对象,只要使用String类的构造函数创建的对象,那么这个对象就会在堆中出现,而在创建出的字符串对象中的字符数据保存在常量池中。
- 字节数组中的数据变成字符串
public class demo1 {
public static void main(String[] args) {
byte[] bytes = {65,66,97,98};
String s = new String(bytes);
// 参数1:字节数组,参数2:索引起始位置,参数3:取几个
String s1 = new String(bytes, 1, 2);
System.out.println(s); // ABab
System.out.println(s1); // Ba
}
}
总结:把一个字节数组转成字符串数据,而字节数组中的每个整数,都会根据编码表查阅到对应的字符,然后把这些字符拼成字符串。
- 把字符数组或int类型的数组转成字符串
public class demo1 {
public static void main(String[] args) {
int[] ints = {65,77,97,98};
String s = new String(ints, 1, 2);
System.out.println(s); // Ma
char[] chs = {'h','e','l','l','o'};
String s2 = new String(chs);
System.out.println(s2); // hello
}
}
- 把一个字符串或者字符串缓冲区中的数据变成字符串
public class demo1 {
public static void main(String[] args) {
// 存在1个对象
String s1 = "abc";
// 存在2个对象
String s2 = new String("abc");
System.out.println(s1 + "---" + s2); // abc---abc
System.out.println(s1 == s2); // false
}
}
String类的判断方法
说明:Object:是类层次结构中的根类,所有的类都直接或者间接的继承自该类。如果一个方法的形式参数是Object,那么这里我们就可以传递它的任意的子类对象。
boolean equals(Object obj); // 比较字符串的内容是否相同
boolean equalsIgnoreCase(String str); // 比较字符串的内容是否相同,忽略大小写
boolean startsWith(String str); // 判断字符串对象是否以指定的str开头
boolean endsWith(String str); // 判断字符串对象是否以指定的str结尾
注意:如果想比较两个字符串相等,我们不应该使用==,==是用来比较具体常量数值的。而由于字符串是对象,所以我们应该使用String类中的equals函数对两个字符串进行比较,因为equals函数是用来比较两个对象是否相等。
String类的获取方法
int length():获取字符串的长度,其实也就是字符个数
char charAt(int index):获取指定索引处的字符
int indexOf(String str):获取str在字符串对象中第一次出现的索引
String substring(int start):从start索引开始截取字符串,截取到字符串最后
String substring(int start,int end):从start开始,到end结束截取字符串。包括start,不包括end。(包头不包尾)
public class demo1 {
public static void main(String[] args) {
// 定义一个字符串
String s = "helloworld";
// int length():获取字符串的长度,其实也就是字符个数
System.out.println(s.length()); // 10
// char charAt(int index):获取指定索引处的字符
System.out.println(s.charAt(0)); // h
// int indexOf(String str):获取str在字符串对象中第一次出现的索引
System.out.println(s.indexOf("or")); // 6
// String substring(int start):从start索引开始截取字符串,截取到字符串最后,包括start
System.out.println(s.substring(5)); // world
// String substring(int start,int end):从start开始,到end结束截取字符串。包括start,不包括end。(包头不包尾)
System.out.println(s.substring(1,5)); // ello
}
}
String类的转换功能
char[] toCharArray():把字符串转换为字符数组
String toLowerCase():把字符串中的所有大写字母转换为小写字母
String toUpperCase():把字符串中的小写字母转换为大写字母
public class demo1 {
public static void main(String[] args) {
// 创建字符串对象
String s = "abcde";
// char[] toCharArray():把字符串转换为字符数组
char[] chs = s.toCharArray();
for (int x = 0; x < chs.length; x++) {
System.out.println(chs[x]);
}
// String toLowerCase():把字符串转换为小写字符串
System.out.println("HelloWorld".toLowerCase()); // helloworld
// String toUpperCase():把字符串转换为大写字符串
System.out.println("HelloWorld".toUpperCase()); // HELLOWORLD
}
}
String类的其它方法
A:去除字符串两端空格 :String trim()
注意:trim()函数是去除字符串两端的空格,而不是字符串中所有的空格。
B:按照指定的字符串分割字符串:String[] split(String str)
注意:切割的时候指定的字符串最好一定是长串中存在的内容;如果指定的字符串不在长串中,那么程序就会把整个字符串作为返回值,那么接收切割后的字符串数组中只存储一个数据,即原来的长串。
public class demo1 {
public static void main(String[] args) {
String s2 = " itheima ";
String s3 = " it heima ";
System.out.println("---" + s2 + "---"); // --- itheima ---
System.out.println("---" + s2.trim() + "---"); // ---itheima---
System.out.println("---" + s3 + "---"); // --- it heima ---
System.out.println("---" + s3.trim() + "---"); // ---it heima---
// String[] split(String str)
String s4 = "aa,bb,cc";
String[] strArray = s4.split(",");
for (int x = 0; x < strArray.length; x++) {
System.out.println(strArray[x]);
}
}
}
字符串缓冲区
- 在String类的api中告诉我们说String类是不能更改的,需要更改应该找字符串缓冲区。
- Java中提供2个字符串缓冲区StringBuffer和StringBuilder。
- 缓冲区:就是一个临时空间,它里面可以临时存储数据。缓冲区本身就是一个容器。
- 字符串缓冲区:它本身就是一个容器,只不过这个缓冲区最后会把里面的所有数据全部给变成字符串而已。
- 当我们需要对字符串进行数据的修改,这时不能直接使用String类,而把需要修改的字符串先存储到字符串缓冲区容器中,在容器中进行各种修改,等最后确定不再修改的时候,把里面的数据变成一个字符串,然后存储在字符串常量池中。
StringBuilder类
① 是一个字符串缓冲区,其实就是一个容器;
② 长度是可变的,任意类型都可以。注意:是将任意数据都转成字符串进行存储;
③ 容器对象提供很多对容器中的数据操作的功能,比如添加,删除,修改,查询;
④ 所有的数据最终都会变成一个字符串;
⑤ 和数组最大的不同就是数组存储完可以单独操作每一个元素,每一个元素都是独立的。
字符串缓存区,所有存储的元素都会被转成字符串,而且变成了一个更长的字符串。
- StringBuilder类的常用方法
构造方法:
1、StringBuilder():对于StringBuilder()构造函数,其初始容量为16个字符表示,如果存在StringBuilder的数据超过了16个字符,这个容器可以自动扩容(容器空间自动变大);StringBuilder底层体现就是一个字符数组,StringBuilder类的对象将数组封装起来,然后对外提供很多便捷方法,而数组本身是没有什么太多方法的。如果外界将数据存放到底层的数组中,如果底层数组空间存放不下外界传递过来的值,那么jvm会基于原来存在的数组在创建一个新的数组,长度是原来数组的一倍,然后jvm将原来数组的数据全部复制(遍历数组,将数据添加到新的数组中)到新的数组中,然后在数组后面的空间中给数组添加新的值,如果还是存不下在创建一个新的数组。
2、StringBuilder(int capacity):capacity表示容器的容量,如果在开发中想自己设置缓冲区大小,可以通过此构造函数来实现;
3、public int capacity():返回当前容量 (理论值)
4、public int length():返回长度(已经存储的字符个数)
5、public StringBuilder append(任意类型):添加数据,并返回自身对象
6、public StringBuilder reverse():反转功能
StringBuilder sb = new StringBuilder();
System.out.println("sb.capacity():"+sb.capacity()); // 16
System.out.println("sb.length():"+sb.length()); // 0
sb.append("hello").append("world").append(true).append(100);
System.out.println("sb:"+sb); // helloworldtrue100
sb.reverse();
System.out.println("sb:"+sb); // 001eurtdlrowolleh
StringBuilder和String通过方法完成相互转换。
1) StringBuilder – >String
public String toString():通过StringBuilder类中的toString()方法就可以实现把StringBuilder转成String。
StringBuilder sb = new StringBuilder();
sb.append("hello").append("world");
String s = sb.toString();
2) String --> StringBuilder
StringBuilder(String str):通过StringBuilder类的构造方法就可以实现把String转成StringBuilder
String s = "helloworld";
StringBuilder sb = new StringBuilder(s);