记得在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);
- int a = 1;
- int b = 2;
- System.out.println(""+a+b);
-
字符串的比较: 在上一章我们学了比较运算符,那么在java中我们如何比较两个字符串是否相等呢?用equals!,equals是String对象里面的一个方法。 我们来对比下equals和==的区别:
- String str1 = new String("你好");
- String str2 = new String("你好");
- System.out.println(str1==str2);
- System.out.println(str1.equals(str2));
- String str1 = "你好";
- String str2 = "你好";
- System.out.println(str1==str2);
- System.out.println(str1.equals(str2));
这两个变量都是被当做基本类型来使用的,没有通过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
- String str1 = null;
- System.out.println("你好".equals(str1));