5.字符与字符串

  • • 发表于 8年前
  • • 作者 大妖怪
  • • 3041 人浏览
  • • 7 条评论
  • • 最后编辑时间 6年前
  • • 来自 [技 术]

原创声明:本文为作者原创,未经允许不得转载,经授权转载需注明作者和出处

记得在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
分享到:
7条评论
Ctrl+Enter
作者

大妖怪

大妖怪

APP:1 帖子:76 回复:200 积分:7517

已加入社区[2944]天

梦里巷口,可有你倚门回首

作者详情》
Top