Java学习day006 字符串

使用的教材是java核心技术卷1,我将跟着这本书的章节同时配合视频资源来进行学习基础java知识。

day006  字符串


字符串

从概念上讲,Java字符串就是Unicode字符序列。Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类,很自然地叫做String。每个用双引号括起来的字符串都是String类的一个实例:

  • String e = "";//an empty string
    String greeting = "Hello";
  • 在C程序员第一次接触Java字符串的时候,常常会感到迷惑,因为他们总将字符串认为是字符型数组,这种认识是错误的,Java字符串大致类似于char*指针。
  • 下面就详细学习一下字符串的相关内容。

  • 子串

    • String类的substring方法可以从一个较大的字符串提取出一个子串。例如:
    • String greeting = "Hello";
      String S = greeting.substring(0,3);

      创建了一个由字符“Hel”组成的字符串。

    • substring方法的第二个参数是不想复制的第一个位置。这里要复制位置为0、1和2(从0到2,包括0和2)的字符。在substring中从0开始计数,直到3为止,但不包含3。
    • substring的工作方式有一个优点:容易计算子串的长度。字符串s.substring(a,b)的长度为b-a。例如,子串“Hel”的长度为3-0=3。

  • 拼接

    • 与绝大多数的程序设计语言一样,Java语言允许使用+号连接(拼接)两个字符串。
      String expletive = "Expletive";
      String PG13 = "deleted";
      String message = expletive + PG13;
      //print message is "Expletivedeleted"

       

    • 上述代码将“Expletivedeleted”赋给变量message(注意,单词之间没有空格,+号按照给定的次序将两个字符串拼接起来)。
    • 当将一个字符串与一个非字符串的值进行拼接时,后者被转换成字符串(在第5章中可以看到,任何一个Java对象都可以转换成字符串)。例如:
      int age = 13;
      String rating = "PG" + age;

      rating设置为“PG13”。

    • 这种特性通常用在输出语句中。例如:
      System.out.println("The answer is "+answer);

      这是一条合法的语句,并且将会打印出所希望的结果(因为单词is后面加了一个空格,输出时也会加上这个空格)。

    • 如果需要把多个字符串放在一起,用一个定界符分隔,可以使用静态join方法:
      String all = String.join("/","S","M","L","XL");
        //all is the string "S/M/L/XL"

       


  • 不可变字符串

    • String类没有提供用于修改字符串的方法。如果希望将greeting的内容修改为“Help!”,不能直接地将greeting的最后两个位置的字符修改为‘p’和'!'。
    • 在Java中实现这项操作非常容易。首先提取需要的字符,然后再拼接上替换的字符串:
      greeting = greeting.substring(0,3) + "p!";

      上面这条语句将greeting当前值修改为“Help!”。

    • 由于不能修改Java字符串中的字符,所以在Java文档中将String类对象称为不可变字符串,如同数字3永远是数字3一样,字符串“Hello”永远包含字符H、e、l、l和o的代码单元序列,而不能修改其中的任何一个字符。当然,可以修改字符串变量greeting,让它引用另外一个字符串,这就如同可以将存放3的数值变量改成存放4一样。
    • 不可变字符串有一个优点:编译器可以让字符串共享。为了弄清具体的工作方式,可以想象将各种字符串存放在公共的存储池中。字符串变量指向存储池中相应的位置。如果复制一个字符串变量,原始字符串与复制的字符串共享相同的字符。

  • 检测字符串是否相等

    • 可以使用equals方法检测两个字符串是否相等。对于表达式:s.equals(t)。
    • 如果字符串s与字符串t相等,则返回true;否则,返回false。需要注意,s与t可以是字符串变量,也可以是字符串字面量。
    • 例如,这个表达式是合法的:"Hello".equals(greeting)。
    • 要想检测两个字符串是否相等,而不区分大小写,可以使用equalsIgnoreCase方法。
    • "Hello".equalsIgnoreCase("hello")
    • 一定不要使用==运算符检测两个字符串是否相等!这个运算符只能够确定两个字串是否放置在同一个位置上。当然,如果字符串放置在同一个位置上,它们必然相等。但是,完全有可能将内容相同的多个字符串的拷贝放置在不同的位置上。

  • 空串与Null串

    • 空串""是长度为0的字符串。可以调用以下代码检查一个字符串是否为空:
      if (str.length() == 0)

      if (str.equals(""))

      空串是一个Java对象,有自己的串长度(0)和内容(空)。不过,String变量还可以存放一个特殊的值,名为null,这表示目前没有任何对象与该变量关联.

    • 要检查一个字符串是否为null,要使用以下条件:
      if (str == null)

      有时要检查一个字符串既不是null也不为空串,这种情况下就需要使用以下条件:

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

      首先要检查 str 不为 null。


  • 码点与代码单元

    • Java字符串由char值序列组成。char数据类型是一个采用UTF-16编码表示Unicode码点的代码单元。大多数的常用Unicode字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元表示。
    • length方法将返回采用UTF-16编码表示的给定字符串所需要的代码单元数量。例如:
      String greeting = "Hello";
      int n = greeting.length();  //is 5

      要想得到实际的长度,即码点数量,可以调用:

      int cpCount = greeting.codePointCount(0, greeting.length());

      调用s.charAt(n)将返回位置n的代码单元,n介于0~s.length()-l之间。例如:

      char first = greeting.charAt(0);// first is 'H'
      char last = greeting.charAt(4);//last is 'o'

      要想得到第i个码点,应该使用下列语句:

      int index = greeting.offsetByCodePoints(0,i); 
      int cp = greeting.codePointAt(index);

      Java 对字符串中的代码单元和码点从 0 开始计数。

    • 如果想要遍历一个字符串,并且依次査看每一个码点,可以使用下列语句:
      int cp = sentence.codePointAt(i);
      if (Character.isSupplementaryCodePoint(cp))
          i += 2;
      else
          i++;

      可以使用下列语句实现回退操作:

      i--;
      if(Character.isSurrogate(sentence.charAt(i)))
          i--;
      int cp = sentence.codePointAt(i);

      显然,这很麻烦。更容易的办法是使用codePoints方法,它会生成一个int值的“流”,每个int值对应一个码点。可以将它转换为一个数组,再完成遍历。

      int[] codePoints = str.codePoints().toArry();

      反之,要把一个码点数组转换为一个字符串,可以使用构造函数(学过C#的同学对这里的理解更深一些)

      String str = new String(codePoints,0,codePoints.length);

      这样就把一个码点数组转换为一个字符串了。

    • 使用UTF-16编码表示字符⑪(U+1D546)需要两个代码单元。这里需要清晰理解码点与代码单元。

  • String API

    • Java中的String类包含了50多个方法。令人惊讶的是绝大多数都很有用,可以设想使用的频繁非常高。下面的API注释汇总了一部分最常用的方法。
    • 在API注释中,有一些CharSequence类型的参数这是一种接口类型,所有字符串都属于这个接口。

  • 阅读联机API文档

    • 正如前面所看到的,String类包含许多方法。而且,在标准库中有几千个类,方法数量更加惊人。要想记住所有的类和方法是一件不太不可能的事情。因此,学会使用在线API文档十分重要,从中可以查阅到标准类库中的所有类和方法。API文档是JDK的一部分,它是HTML格式的。
    • 可以看到,屏幕被分成3个窗框。在左上方的小窗框中显示了可使用的所有包。在它下面稍大的窗框中列出了所有的类。点击任何一个类名之后,这个类的API文档就会显示在右侧的大窗框中.例如,要获得有关String类方法的更多信息,可以滚动第二个窗框,直到看见String链接为止,然后点击这个链接。
    • 接下来,滚动右面的窗框,直到看见按字母顺序排列的所有方法为止。点击任何一个方法名便可以查看这个方法的详细描述。
    • 例如,如果点击compareTolgnoreCase链接,就会看到compareTolgnoreCase方法的描述。

  • 构建字符串

    • 有些时候,需要由较短的字符串构建字符串,例如,按键或来自文件中的单词。采用字符串连接的方式达到此目的效率比较低。每次连接字符串,都会构建一个新的String对象,既耗时,又浪费空间。使用StringBuilder类就可以避免这个问题的发生。
    • 如果需要用许多小段的字符串构建一个字符串,那么应该按照下列步骤进行。首先,构建一个空的字符串构建器:
      StringBuilder builder = new StringBuilder();

      当每次需要添加一部分内容时,就调用append方法。

      builder.append(ch);  //append a single character
      builder.append(str);  //append a string

      在需要构建字符串时就凋用toString方法,将可以得到一个String对象,其中包含了构建器中的字符序列。

      String completedString = builder.toString();

      下面的API注释包含了StringBuilder类中的重要方法。


这是Java SE 8的在线API文档网址:https://docs.oracle.com/javase/8/docs/api/

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值