字符串的获取与初始化
首先需要注意的是字符串初始化后是无法修改的
例如:
String a="abc";
a="asc";
这里看似是修改了字符串a的内容,实际上是通过创建另一个字符串对象(初始化为“asc"),然后将改新建的字符串对象赋值给字符串a,所以在这个过程中一共有两个字符串对象。
1.使用直接赋值的方式来获取一个字符串对象(最简单也是最常用的方式)
String s1="abc";
使用这种方式时,系统会检查字符串在串池中是否存在,如果不存在则创建新的,若存在则复用,将串池中的该字符串地址赋给字符串对象
2.使用new的方式获取一个字符串对象
String s1=new String();
这里是调用String类的构造方法,此时的s1的内容为空。
String s1=new String("abc");
这里是调用构造方法的重载进行获取与赋值字符串对象,但是很明显,此方法与方法一相比就是多此一举,完全没有必要,了解即可。
3.传递一个字符数组,然后根据改数组的内容再创建一个新的字符串对象(常用在需进行经常修改操作的字符串)
char [] s1={'a','b','s'};
String s2=new String(s1);
4.传递一个字节数组,根据字节数组的内容创建一个字符串对象
应用实例:网络传输一般都是以字节的方式进行传输,我们一般需要将字节转化为字符串进行阅读。
byte [] s1={97,98,99,100};
String s2=new String(s1);
运行结果:
字符串的比较
首先需要注意的是:字符串的比较不能简单的使用”=="
因为“==”用于两个基本数据类型时,比较的是两个量的值的大小。而用于引用数据类型时,比较的是两个量存储的地址值。
例如:
由于s1与s2都是通过new创建的,虽然存储地址中的值相同,但在堆中的地址不同,所以返回false
还有一种情况:
使用直接赋值的方法创建的字符串,由于在串池中采取复用的方式,所以存储的地址相同,返回true.(尤其注意,需要比较的两个字符串都是该方式创建的情况下才可以使用“==”比较,)
虽然“=="在此时可以有效使用,但是不建议使用”==“进行字符串的比较。
常规的字符串比较方法(使用String类的成员方法):
equals() AND equalsIgnoreCase()
两个方法的区别在于:
equals() 严格区分大小写,只有两个字符串完全相同的情况下才会返回true
equalsIgnoreCase() 不区分大小写
案例: