原创声明:本文为作者原创,未经允许不得转载,经授权转载需注明作者和出处
记得在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 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被强转成了普通字符串然后被拼接到了一起。String str1 = new String("你好");
String str2 = new String("你好");
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
这段代码运行的结果是false true,造成这个结果的原因是: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 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