1、String(jdk8.0)
1.1、对String的理解:
①、不可被继承
②、实现了Serializable接口,凡是实现了此接口的类对象就可以通过网络或本地流进行数据的传输。
③、实现了Comparable,凡是实现了此接口的实现类都可以比较大小。
④、如下的代码相当于String新造了一个对象
String name = "aaa"; //可以不使用new的原因是:字符串常量池将字符串常量放在里面,并且不允许有两个相同的字符串常量
name = "bbb";
1.2、String实例化的两种方式
方式一:使用字符串常量
方式二:使用new关键字
String s1 = new String("Hello");
其中使用new关键字会创建两个对象,原因如下:首先使用new关键字会在堆区创建一个String类的对象,然后会在字符串常量池里面创建一个对象存放字符串,然后堆区里面的String对象里的value指向字符串常量池里面的字符串。但是这两个对象的地址并不相同,只是它们的value指向的时同一个字符串。
1.3、字符串的拼接
①、有变量的字符串拼接是调用了StringBuilder类进行拼接,然后调用StringBuilder的toString方法。
②、调用intern()方法,返回字符串常量池中的字符串地址。
③、字符串常量 + 字符串常量(也可以是final修饰的字符串变量) —> 字符串常量
④、concat():不管是常量还是变量调用此方法,还是参数是常量或者变量,返回的都是一个对象,所以在进行比较的时候都是false
1.4、String类中的常用方法
public class Test {
public static void main(String[] args) {
String str = "Helloworld!";
//1、String类型转字符数组,然后可以对字符数组进行遍历,反过来的话就直接调用String的构造器
char[] a = str.toCharArray();
Print(a);
//2、String转基本数据类型,基本数据类型转String,这个见之前的包装类笔记
System.out.println("------------------------------");
//3、String转byte类型数组,这里会有字符集的问题
/**
* 在utf-8中,一个汉字占用三个字节,一个字符占用一个字节,并且向下兼容ASCII
* 在gbk中,一个汉字占用两个字节,一个字符占用两个字节,并且向下兼容ASCII
* */
byte[] b = str.getBytes();
Print(b);
/**
* 编码:String —> 字符数组
* 解码:字符数组 —> String
* 这个过程要求解码使用的字符集必须与编码时的字符集一致, 不然就会有乱码
*
* */
}
public static void Print(char[] a){
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
}
public static void Print(byte[] a){
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
}
}
其它方法如下所示:
查找算法:
字符串截取:
和字符相关的方法:
开头与结尾:
2、Stringbuffer和StringBuilder(这俩都是可变字符序列)
2.1、两者的对比
Stringbuffer:线程安全,效率较低
StringBuilder:线程不安全,效率较高
两者的底层都是用char[],在jdk9之后改为byte[]。
2.2、在实际开发过程中,如果需要频繁的对字符串进行增删改等操作,我们就可以考虑使用StringBuilder或者StringBuffer,因为这俩执行上面的这些操作时效率更高。如果开发过程中字符串的长度比较大,需要用**StringBuilder**(int capacity)这个构造方法先指定字符串的大小,避免后期底层频繁的对长度进行扩容。
==Stringbuffer和StringBuilder提供了增删改查插获取长度的方法!==具体使用查询API帮助文档。