记得在Hello_Word那章的时候,我们用到了这样一句
-
System.out.println("Hello_Word");
这个”Hello_Word”便是我们要讲的字符串。 字符串,顾名思义,就是就是把字符串起来,也就是多个字符的集合。要讲字符串,我们先来讲讲上章提到的字符。 Java用char类型来表示字母、数字、标点符号以及其他特殊字符,我们在java中表示字符串最简单的方法是用单引号嵌入字符,如:
-
char c = 'a';
当然,单引号中也可以放入单个的汉字。 字符的本质其实是数字,因为每一个字符在Unicode标准中都有对应的数字值,称为Unicode值,比如小写的a是97
-
char c = 97;
-
System.out.println(c);
这段代码的运行结果就是小写的a
当然char还可以操作Unicode字符,因为不是很常用,所以在此也只是提供概念供查询,不做深入研究。
接下来是开始讲字符串了
-
字符串的声明: 我们的字符串用String来进行声明,用单引号包裹,有两种方法,如:
-
String str1 = "你好!";
-
String str2 = new String("你好!");
我们在双引号中可以输入任何我们想要显示的东西,不限制长度,没有类型,可以是字母,数字,下划线,特殊符号,空格等等。 以上两种方式的区别以后会讲到。
-
字符串的拼接: 当我们想把多个字符串拼接起来,组成一个新的字符串时,就需要用到字符串的拼接了,拼接的方法是用加号连接多个字符串:
-
String a = "Hello "+"word";
-
System.out.println(a);
我们还可以连接两个变量
-
String a = new String("Hello ");
-
String b = new String("word");
-
String c = a + b;
-
System.out.println(c);
当一个字符串和别的类型的变量拼接起来时,别的类型的变量会自动被强转成字符串,我们来看以下两段程序:
-
int a = 1;
-
int b = 2;
-
System.out.println(a+b);
该程序的运行结果是毫无疑问是3,但是,如果这样:
-
int a = 1;
-
int b = 2;
-
System.out.println(""+a+b);
程序的运行结果却是12,原来就是1和2被强转成了普通字符串然后被拼接到了一起。
-
字符串的比较: 在上一章我们学了比较运算符,那么在java中我们如何比较两个字符串是否相等呢?用equals!,equals是String对象里面的一个方法。 我们来对比下equals和==的区别:
-
String str1 = new String("你好");
-
String str2 = new String("你好");
-
System.out.println(str1==str2);
-
System.out.println(str1.equals(str2));
这段代码运行的结果是false true,造成这个结果的原因是: 我们new了两个String对象,也就是开辟了两个不同的内存空间,==比较的是内存空间的位置是否相等,而euqals比较的则是内存空间里面放的东西是否相等,当然,上章所述的八大类型的比较都是比较内存空间的位置是否相等。
-
String str1 = "你好";
-
String str2 = "你好";
-
System.out.println(str1==str2);
-
System.out.println(str1.equals(str2));
而这段代码运行的结果是true true,造成这种结果的原因是:
这两个变量都是被当做基本类型来使用的,没有通过new关键字来创建的,因此虚拟机不会为这两个String对象分配新的内存堆,而是到String缓冲池中来寻找。首先为str1寻找String缓冲池内是否有与”你好”相同值的String对象存在,此时String缓冲池内是空的,没有相同值的String对象存在,所以虚拟机会在String缓冲池内创建此String对象,其动作就是new String(“你好”);。然后把此String对象的引用赋值给str1。然后为str2寻找String缓冲池内是否有与”你好”相同值的String对象存在,此时虚拟机找到了一个与其相同值的String对象,这个String对象其实就是为str1所创建的String对象。既然找到了一个相同值的对象,那么虚拟机就不在为此创建一个新的String对象,而是直接把存在的String对象的引用赋值给str2。因为str1和str2都引用了同一个内存对象,就是它自己等于自己,因此str1==str2的结果为true。 上述原理目前只需要了解即可,关于对象和指针,我们会在以后的章节陆续讲到。
-
然后我们需要注意一点,如果两个String类型的值做比较的时候,尽量用已知的字符串去.equals变量,我们来看以下代码:
-
String str1 = null;
-
System.out.println(str1.equals("你好"));
这段话运行结果会抛出一个空指针异常,:
-
Exception in thread "main" java.lang.NullPointerException
原因是str1已经是null了,也就是没有指向任何对象,既然没有对象,我们还要去找这个对象里面的方法,自然找不到,所以会抛出异常。 如果我们改成:
-
String str1 = null;
-
System.out.println("你好".equals(str1));
则会返回false
|