Java:String类(1)构造方法和字符串比较

下面我们来详细介绍一下字符串类型,即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()比较方法相同,但是会忽略大小写进行比较。

这些就是常用的字符串比较的方法。

后面我们会介绍一些比较常用的方法。

  • 15
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值