以前就写过一篇关于String的文章,今天再来写一篇,更加深入了解一下String类
1.之前在C语言中我们已经学到了字符类型,但是C语言没有String类,但是在Java中有String类,今天我们就来说一说String类
如何定义一个字符串
可以直接
String ret="wyb";
也可以
直接new一个,因为String类算一个类,是引用类型,直接通过构造一个对象,产生字符串,就像这样
String str=new String("wyb ");
还可以,这个方法比前两个复杂一点
通过数组进行构造
比如
char []ret ={w,y,b};
String str=new String(ret);
这句话可以理解为是把数组强制类型转换为字符串类型
String是一个引用类型,所以自己不会存字符串,那么存在哪里呢,打开它的源码有惊喜
可以看到String类是被final修饰的,那么说明不能被继承,它里面有两个成员变量
一个是由private修饰的value[]数组,另一个是private修饰的hash,new出来的字符串就放在value数组里面
就像上图中的例子一样,而hash存的是一个地址,具体在数据结构中我们再说
在Java中,只要被双引号引起来的变量就是字符串
下面来说一说字符串的比较
1 用==
在基本类型的比较中,==比较的就是内容是否相等,在引用类型中==比较的是所指对象的地址是否相等
- public class TestDemo {
- public static void main(String[] args) {
- String s1="hello";
- String s2="hello";
- System.out.println(s1==s2);//true
- System.out.println("======");
- String s3=new String("hello");
- String s4=new String("hello");
- System.out.println(s3==s4);//false
- }
- }
s1和s2就是普通的那样的比较,不是引用类型,所以直接比较内容即可,s3和s4是两个引用,所以需要比较地址
2.用equals方法
- public class TestDemo {
- public static void main(String[] args) {
- String s1="hello";
- String s2="hello";
- System.out.println(s1==s2);//true
- System.out.println("======");
- String s3=new String("hello");
- String s4=new String("hello");
- System.out.println(s3==s4);//false
- System.out.println("====");
- System.out.println(s1.equals(s2));//true
- System.out.println(s3.equals(s4));//true
- System.out.println(s1.equals(s3));//true
- System.out.println(s1 == s3);//false
- }
- }
equals比较的是其中的内容是否相等,最后一个s1和s3采用==比较一定是错误的,因为s1看内容,s2看指向,二者比较的东西都不一样,所以是错误的
我们再来看看equals方法
这是具体使用equals时具体实现的源码 ,可以看出笔记比较的是内容是否相同
3.用compareTo方法进行比较
- public class TestDemo {
-
- public static void main(String[] args) {
- String s1=new String("abandon");
- String s2=new String("abandondefg");
- System.out.println(s1.compareTo(s2));
- System.out.println("======");
- String s3=new String("abcdrfg");
- String s4=new String("abcdefg");
- System.out.println(s3.compareTo(s4));
- System.out.println("=====");
- String s5=new String("abcd");
- String s6=new String("abcd");
- System.out.println(s5.compareTo(s6));
- }
先来看看compareTo的源码
返回值是int ,具体实现是这样的,根据字典序来实现的,当出现不一样的字母时返回差值,如果两个字母不一样长,但是前面的字母都一样,就是多出来的不一样,那么就返回多出来的几个字母个数,如果字符串相等,返回0;
4.使用compareToIgnorceCase方法进行比较
这里就代表忽略大小写,和compareTo方法比较方式一样
先看看源码
- public class TestDemo {
- public static void main(String[] args) {
- String s1=new String("WYB");
- String s2=new String("wyb");
- System.out.println(s1.compareToIgnoreCase(s2));
- String s3=new String("ABCDE");
- String s4=new String("abcdeuuu");
- System.out.println(s3.compareToIgnoreCase(s4));
- String s5=new String("ABcde");
- String s6=new String("Abyde");
- System.out.println(s5.compareToIgnoreCase(s6));
- }
来总结一下,比较字符串大小的方法
今天的分享就到这里,我们下期再见啦,886