下面我们来详细介绍一下字符串类型,即String类,首先我们要明确,这个类不能被继承,区别于c语言,java当中字符串中没有以"\0"结束的说法。我们通常见到的String类的使用是这样的:
String s="hello!";
这是String类的构造方法,但是有所精简,那么我们就先从String类的构造方法开始介绍。
构造方法
通过我们以往对类的认识,以及对对象构造的认识,我们可以得出字符串类的构造正常应该是这样的:
String s=new String("hello!");
我们正常的构造方法确实是这样的,前面的提到的是一种简化的版本,可以让我们更加方便的使用。下面我们介绍第三种构造方法:
char[] arr={'a','b','c'};//字符数组
String s=new String(arr);//从字符数组变成字符串"abc"
s1=s;表示s1和s指向同一个对象。
String s1=null;表示这个引用不指向任何对象。它并不是指String s2="";而后面这个代码表示s2是个空字符串。我们可以使用s.isempty()这个方法判断一个字符串是否为空字符串,而当s1使用这个方法时,会出现空指针异常。正常情况下,当字符串是空字符串时,方法会返回true。同时,我们可以使用s.length()这个方法来获取字符串长度。
public static void main(String[] args) {
String s1="hello!";
String s2="";
System.out.println(s1.isEmpty());
System.out.println(s2.isEmpty());
System.out.println(s1.length());
System.out.println(s2.length());
}
String对象的比较
我们可以观察如下代码,对字符串的比较。
public static void main(String[] args) {
String str1=new String("abc");
String str2=new String("abc");
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
String str3="abc";
String str4="abc";
System.out.println(str3==str4);
}
我们可以看到这样三个执行结果,那么为什么会出现这些结果呢,我们一个一个来解释。
首先我们出现的第一个false不难理解,类比c语言我们可以想到,这个双等号判断的应该是地址,那我们str1和str2存储变量的地址一定是不一样的,所以会得出false。
第二个true其实也不难理解。我们string类已经重写了equals这个方法。它的方法内容就是判断两个字符串的内容是否一样。很明显是一样的,所以我们得出true这个答案。
而第三个我们就要思考一下了。为什么得出的答案是true呢,明明他跟第一个没有什么区别。这里,我们就要介绍一个东西,字符串常量池了。
字符串属于引用类型,但是在Java中字符串的使用频率与基本数据类型差不多,甚至更高。如果与其他的引用类型一样,每个字符串都分配大量的额外空间,会导致时间和空间的双重浪费,同时也会极大地影响程序的性能。因此,Java提供了一块字符串常量池,相当于一块缓冲区,创建出来的字符串不会直接进入内存。我们要明确,只有不通过new关键字创建的字符串,而像str3一样直接用双引号引起来的字符串会直接进入常量池而不进入内存,而我们str1通过new关键字创建出来的。在常量池和内存中都会有这个对象。最后返回的是堆内存中的对象的引用。因此比较的是地址。
当我们通过str3创建出abc这个字符串。他会进入常量池。存的是字符串儿的常量值。当我们在创建str4的时候是这样一个步骤。首先我们查看常量池中是否存在当前字符串儿.没有,存进去。有,则获取这个字符串在常量池中的地址。这样能减少浪费。因此我们比较出来tr3和r4的地址是一样的。
==,所以我们要仔细关注这个双等号。任何情况下只要等号两边是引用类型,一定要注意看比较什么,当我们想要知道内容是否一致进行比较时,一定要重写equals方法。不然就会调用object.equals(),这个方法会直接比较地址。当我们自定义类型的时候一定要重写equals方法。String这个类已经重写了这个方法,我们可以直接使用。
下面我们再来介绍comparTo方法,这个方法也可以对字符串进行比较。
String str3="abc";
String str4="abcdef";
System.out.println(str3.compareTo(str4));
这个时候我们比较的是两个字符串谁更加长,当str3更长时返回一个整数,反之返回负数,当完全一样时返回0;
String str3="abc"; String str4="abd"; System.out.println(str3.compareTo(str4));
而当长度一样但内容不同时,我们家比较不一样的位置两个字符串不一样的位置是第三个。一个是c,一个是d。而d的ascII码值比c大1因此会返回-1。
而另一个方法compareToIgnoreCase()比较方法相同,但是会忽略大小写进行比较。
这些就是常用的字符串比较的方法。
后面我们会介绍一些比较常用的方法。