String类的特点:
1, java语言中用于描述最常见的字符串数据的对象。
2, 字符串数据都是一个对象
3, 字符串数据一旦初始化就不可以被改变了。双引号表示的都是字符串常量。
4, 字符串对象都存储在常量池中。字符串常量池。
String s1=”abcd”;//这时在常量池中创建了一个字符串对象。
String s2=new String(“abcd”);//这是在堆内存创建一个String类的对象。并在常量池创建了
//“abcd对象”
对于字符串对象的比较,应该用equals方法完成。
基本数据用==进行比较相同。对象比较相同都用equals方法。
S1.equals(s2);//true String类覆盖了Object中的equals方法,比较的是字符串内容是否相同。
String s3=”ab”+”cd”;
S1==s3//true
字符串缓冲区StringBuffer
特点:
1, 缓冲区就是用来缓存数据,意味着它是一个容器。
2, 该容器的长度是可变的
3, 提供了对容器中内容的操作方法(最多无外乎四种:增删该查)
4, 缓冲区中可以添加多种类型的元素,基本类型和引用类型
5, 无论怎么样的改变容器中的数据,最终要使用结果,还是必须要将其转成字符串,使用toString方法
append():追加:在结尾处添加
StringBuilder含义:
Jdk1.5版本出现了一个新的字符串缓冲区
功能和StringBuffer一模一样
StringBuffer是线程安全的
StringBuilder是线程不安全的。为了提高效率。因为不用判断同步锁
对于容器,被多线程操作,容器出现安全问题。因为一个线程负责添加,一个线程负责删除,因为线程的随机性就会出现安全问题
加锁。一个线程在执行容器中的内容时,其他线程不可以执行,所以凡是可以操作容器数据的方法,都需要明确这个锁。每调用一次操作容器的方法(添加,删除)都需要判断这个锁。
对于多线程而言,安全了,但是效率低
对已单线程而言,不涉及安全,但是效率低。所以,对于线程提供了StringBuilder。不需要同步的缓冲区。
实际开发时,建议使用StringBuilder,只有在多线程时,才用StringBuffer
升级:
1, 简化书写
2, 提高效率
3, 提高安全性
StringBuffer和数组容器的区别
1,
数组容器固定长度
StringBuffer是可变长度
2,
数组容器一旦初始化就明确了元素的类型
StringBuffer可以存储任意类型。包括基本和引用
3,
数组存储完元素可以对元素进行操作(通过角标)
StringBuffer存储完元素后,都会变成字符,只能用字符串的方法来操作。
什么时候用StringBuffer或者StringBuilder?
数据个数可以是固定的,可是是不固定的,数据类型也可以是固定的,或者不固定的。
只要最终这些数据都需要变成字符串来操作时,就可以使用字符串缓冲区
基本数据类型比较用的是比较运算符
对象的比较用的是compareTo方法