美文网首页
Java核心技术 卷I - 字符串(第11版)

Java核心技术 卷I - 字符串(第11版)

作者: 程序员小白成长记 | 来源:发表于2020-06-20 23:33 被阅读0次

    字符串专题

    一、不可变字符串

    String greeting = "Hello";

    1.1 问题:

    String类没有提供修改字符串中某个字符的方法。如果希望将greeting的内容修改为”Help!",不能直接将greeting的最后两个位置的字符修改为'p'和'!'。对于C程序员来说,这会让他们茫然无措(深有感触)。

    Java中的做法:
    先提取想要保留的字符串在进行拼接:
    greeting = greeting.substring(0,3) + "p!";
    由于不能修改Java字符串中的单个字符,所以在Java文档中将String类对象称为是不可变的(immutable).

    1.2 思考一:这么做是否会降低运行效率

    看起来好像修改一个代码单元要比从头创建一个新字符串更加简洁。(也对也不对)

    但是,不可变字符串有一个优点:编译器可以让字符串共享。
    原因:可以想象各种字符串存放在公共的存储池中。字符串变量指向存储池中的相应位置。如果复制一个字符串变量,原始字符串与复制字符串共享相同的字符。Java设计者认为共享带来的效率远远胜过于提取子串、拼接字符串所带来的低效率。
    Java字符串大致类似于char*指针:char* greeting = "Hello";

    1.3 思考二:内存泄漏问题

    String greeting = "Hello";改为String greeting = "Howdy";会不会造成内存泄漏
    因为greeting的值向变了,”Hello"未被释放,没有显示的调用free()函数。
    Java将自动的进行垃圾回收。如果一个内存块不再使用了,系统最终会将其回收。

    1.4 总结:

    相较于C/C++语法来说:
    C/C++字符串是可以修改的,也就是说,可以修改字符串中的单个字符;
    Java中的字符串值是不可变类型,不能修改,只能重新创建新串。

    参考:卷I (11版)P46

    二、检查字符串是否相等

    ⚠️【注意】一定不要使用'==' 运算符检测两个字符串是否相等!(使用equals)这个运算符只能够确定两个字符串是否存放在同一个位置上。当然,如果字符串在同一位置上,他们必然相等。但是,完全有可能将内容相同的多个字符串副本放置在不同的位置上。
    如果虚拟机始终将相同的字符串共享,就可以使用==运算符检测是否相等。但实际上只有字符串字面量是共享的,而+或substring等操作得到的字符串并不共享。

    Don't BB,show me your code:

    System.out.println("Hello".substring(0,3)=="Hel"); // false
    System.out.println("Hello".substring(0,3).equals("Hel")); // true
    

    参考:卷I (11版)P47

    三、空串与Null串

    先说结论:空串与Null串是不同的
    空串""是长度为0的字符串。
    判断空串操作

    if(str.length() ==0) 或
    if(str.equals(""))
    

    空串是一个Java对象,有自己的串长度(0)和内容(空)
    Null串标识没有任何对象与该变量相关联
    检查一个字符串既不是null也不是空串,首先要检查str不为null,否则在一个null值上调用length方法会出现空指针异常。

    if(str != null && str.length() !=0)
    

    四、StringBuilder、StringBuffer

    四、一些API

    1. indexOf、lastIndexOf
    System.out.println("Hello".indexOf('l')); // 2
    System.out.println("Hello".lastIndexOf('l')); // 3
    

    相关文章

      网友评论

          本文标题:Java核心技术 卷I - 字符串(第11版)

          本文链接:https://www.haomeiwen.com/subject/jtswxktx.html