String
Agenda
概述
• 字符串可以说是任何编程语言中最长见到的数
  据类型了, 在前面的很多章节中也涉及到了一
  些字符串的操作;
• Java的字符串由java.lang.String类来实现, 该类
  提供了很多实用的方法对字符串进行操作;
• 关于字符串最重要的一点是java字符串对象的
  内容是不可变的, 在进行字符串操作的过程中
  总是有新的字符串对象被创建, 而不是原有的
  对象被修改.
不可变的字符串
               immutable string
• 对字符串对象的任何操作: 合并, 大小写转
  换, 截取等都不会改变原有的对象, 每次都会
  创建一个新的字符串对象并且返回; 示例:
  String s1 = “good”, s2 = “bye”;
  String s = s1 + s2; // 返回goodbye, s1/s2不变;
  s1.upperCase(); // 返回GOOD, s1不变;
  s1.substring(0, 2); // 返回go, s1不变;
• 示例: demo/Demo1.java
字符串操作
• 构造器
  String()    创建一个空字符串
  String(StringBuilder) 拷贝StringBuilder的内容
  String(StringBuffer)  拷贝StringBuffer的内容
• length()         长度
• chatAt(int)返回指定位置的字符, 从0开始
• getChars(), getBytes()
  返回字符/字节数组
• equals/equalsIgnoreCase
 字符串的内容是否相等, 后者不区分大小写
• compareTo
比较字符串大小, 返回负数/0/整数
• contains
是否包含某个子字符串
字符串操作
• startsWith/endsWith
是否以某个字符串开头或者结尾
• indexOf/lastIndexOf
返回某个子字符串的起始位置或者最后出现的位置
• substring
返回指定位置的一个子字符串
• concat
字符串合并, 通常使用加号
• replace
替换字符串的某些部分
• toLowerCase/toUpperCase
转换字符串大小写
• trim
去掉字符串开始和结尾的空格字符
• valueOf
static方法, 将其他的对象转换为字符串, 比如String s = String.valueOf(new
Integer(4))
格式化输出
• JDK5引入了System.out.format或者printf用于格
  式化输出, 示例:
  int i = 5;
  double d = 5.3;
  System.out.format(“Row 1: *%d %f+n”, x, y); // 或者
  System.out.printf(“Row 1: *%d %f+n”, x, y);
• 示例: demo/Demo2.java
• java.util.Formatter用于格式化字符串, 输出到标
  准输出或者附加到某个对象, 比如:
  Formatter fmt = new Formatter(System.out);
  fmt.format(“Now is %d o’clock”, 5); // 输出到标准输出
  StringBuffer buf = new StringBuffer();
  Formatter fmt = new Formatter(buf);
  fmt.format(“Now is %d o’clock”, 5); // 添加到StringBuffer
  System.out.println(buf.toString());
• 示例: demo/Demo3.java
格式化输出
                 常用的占位符
• 以上一节的” Now is %d o’clock” 为例, 这里的
  %d就是一个占位符, 表示相应位置的参数格
  式化为一个整数; 常用的占位符有:
  d   Integral (as decimal)
  x   Hex
  c   Unicode character
  b   Boolean value
  s   String
• 示例: demo/Demo4.java
格式化输出
               String.format
• JDK5同样为String类引入了静态方法实现字
  符串的格式化, 其功能与前述的两种方式相
  同, 示例:
  String s= fmt.format(“Now is %d o’clock”, 5);
• 示例: demo/Demo5.java
CharSequence
• 字符串本身就是一串字符的集合, java中所
  有的字符串类型包含String, StringBuffer和
  StringBuilder都实现了这个接口, 接口的规范
  如下:
 interface CharSequence {
     charAt(int i);
     length();
     subSequence(int start,| int end);
     toString();
 }
读取标准输入
                          Scanner
• 应用程序往往需要扫描相关的输入来并进行相应的
  处理, JDK5提供了工具类java.util.Scanner用于实现该
  功能; 通过以下构造器创建Scanner对象:
  Scanner(File)             指定某个文件作为输入
  Scanner(InputStream)      指定某个输入流作为输入
  Scanner(String)           使用字符串最为扫描的对象
Scanner提供了如下工具方法:
  nextLine()             读取下一行;
  nextInt()              读取下一个token(默认使用空格分隔), 并
                         返回一个整数; 如果该token不能被解析
                         为一个整数或者超出范围则抛出异常.
  hasNext()              是否还有下一个token
  next()                 返回下一个token, String类型
• 示例: demo/Demo6.java
Scanner vs. StringTokenizer
• 在JDK5之前可以使用StringTokenizer实现类
  似Scanner的功能, 但是易用性不如后者; 示
  例:
  String input = "But I’m not dead yet! I feel happy!";
  StringTokenizer stoke = new StringTokenizer(input);
  while(stoke.hasMoreElements())
     System.out.print(stoke.nextToken() + " ");

• 示例: demo/Demo7.java
StringBuffer
• 与String相同, StringBuffer也表示一个字符串对
  象, 示例:
  StringBuffer buf = new StringBuffer(“Hello”);
  System.out.println(buf.toString()); // Hello
• 不同之处在于StringBuffer的内容是可以更改的,
  它提供了如下接口用于修改字符串的内容:
  append        追加字符串
  delete        删除指定位置的字符串
  insert        在指定的位置插入字符串
  replace       替换指定位置的字符串
• 示例: demo/Demo8.java
StringBuffer
      vs. String vs.StringBuilder
• 当需要频繁的进行字符串修改时, 使用string
  是不太合适的, 因为这样会导致大量的对象
  被创建和回收, 造成一定的性能因素; 在这
  种情况下可以使用StringBuffer;
• StringBuilder与StringBuffer的类似, 也表示可
  以修改的字符串; 两者的区别在于前者是线
  程安全的(thread-safe), 而后者是线程不安全
  的; 这意味这前者在具体的使用中性能会稍
  弱于后者.
END

12, string

  • 1.
  • 2.
  • 3.
    概述 • 字符串可以说是任何编程语言中最长见到的数 据类型了, 在前面的很多章节中也涉及到了一 些字符串的操作; • Java的字符串由java.lang.String类来实现, 该类 提供了很多实用的方法对字符串进行操作; • 关于字符串最重要的一点是java字符串对象的 内容是不可变的, 在进行字符串操作的过程中 总是有新的字符串对象被创建, 而不是原有的 对象被修改.
  • 4.
    不可变的字符串 immutable string • 对字符串对象的任何操作: 合并, 大小写转 换, 截取等都不会改变原有的对象, 每次都会 创建一个新的字符串对象并且返回; 示例: String s1 = “good”, s2 = “bye”; String s = s1 + s2; // 返回goodbye, s1/s2不变; s1.upperCase(); // 返回GOOD, s1不变; s1.substring(0, 2); // 返回go, s1不变; • 示例: demo/Demo1.java
  • 5.
    字符串操作 • 构造器 String() 创建一个空字符串 String(StringBuilder) 拷贝StringBuilder的内容 String(StringBuffer) 拷贝StringBuffer的内容 • length() 长度 • chatAt(int)返回指定位置的字符, 从0开始 • getChars(), getBytes() 返回字符/字节数组 • equals/equalsIgnoreCase 字符串的内容是否相等, 后者不区分大小写 • compareTo 比较字符串大小, 返回负数/0/整数 • contains 是否包含某个子字符串
  • 6.
    字符串操作 • startsWith/endsWith 是否以某个字符串开头或者结尾 • indexOf/lastIndexOf 返回某个子字符串的起始位置或者最后出现的位置 •substring 返回指定位置的一个子字符串 • concat 字符串合并, 通常使用加号 • replace 替换字符串的某些部分 • toLowerCase/toUpperCase 转换字符串大小写 • trim 去掉字符串开始和结尾的空格字符 • valueOf static方法, 将其他的对象转换为字符串, 比如String s = String.valueOf(new Integer(4))
  • 7.
    格式化输出 • JDK5引入了System.out.format或者printf用于格 式化输出, 示例: int i = 5; double d = 5.3; System.out.format(“Row 1: *%d %f+n”, x, y); // 或者 System.out.printf(“Row 1: *%d %f+n”, x, y); • 示例: demo/Demo2.java • java.util.Formatter用于格式化字符串, 输出到标 准输出或者附加到某个对象, 比如: Formatter fmt = new Formatter(System.out); fmt.format(“Now is %d o’clock”, 5); // 输出到标准输出 StringBuffer buf = new StringBuffer(); Formatter fmt = new Formatter(buf); fmt.format(“Now is %d o’clock”, 5); // 添加到StringBuffer System.out.println(buf.toString()); • 示例: demo/Demo3.java
  • 8.
    格式化输出 常用的占位符 • 以上一节的” Now is %d o’clock” 为例, 这里的 %d就是一个占位符, 表示相应位置的参数格 式化为一个整数; 常用的占位符有: d Integral (as decimal) x Hex c Unicode character b Boolean value s String • 示例: demo/Demo4.java
  • 9.
    格式化输出 String.format • JDK5同样为String类引入了静态方法实现字 符串的格式化, 其功能与前述的两种方式相 同, 示例: String s= fmt.format(“Now is %d o’clock”, 5); • 示例: demo/Demo5.java
  • 10.
    CharSequence • 字符串本身就是一串字符的集合, java中所 有的字符串类型包含String, StringBuffer和 StringBuilder都实现了这个接口, 接口的规范 如下: interface CharSequence { charAt(int i); length(); subSequence(int start,| int end); toString(); }
  • 11.
    读取标准输入 Scanner • 应用程序往往需要扫描相关的输入来并进行相应的 处理, JDK5提供了工具类java.util.Scanner用于实现该 功能; 通过以下构造器创建Scanner对象: Scanner(File) 指定某个文件作为输入 Scanner(InputStream) 指定某个输入流作为输入 Scanner(String) 使用字符串最为扫描的对象 Scanner提供了如下工具方法: nextLine() 读取下一行; nextInt() 读取下一个token(默认使用空格分隔), 并 返回一个整数; 如果该token不能被解析 为一个整数或者超出范围则抛出异常. hasNext() 是否还有下一个token next() 返回下一个token, String类型 • 示例: demo/Demo6.java
  • 12.
    Scanner vs. StringTokenizer •在JDK5之前可以使用StringTokenizer实现类 似Scanner的功能, 但是易用性不如后者; 示 例: String input = "But I’m not dead yet! I feel happy!"; StringTokenizer stoke = new StringTokenizer(input); while(stoke.hasMoreElements()) System.out.print(stoke.nextToken() + " "); • 示例: demo/Demo7.java
  • 13.
    StringBuffer • 与String相同, StringBuffer也表示一个字符串对 象, 示例: StringBuffer buf = new StringBuffer(“Hello”); System.out.println(buf.toString()); // Hello • 不同之处在于StringBuffer的内容是可以更改的, 它提供了如下接口用于修改字符串的内容: append 追加字符串 delete 删除指定位置的字符串 insert 在指定的位置插入字符串 replace 替换指定位置的字符串 • 示例: demo/Demo8.java
  • 14.
    StringBuffer vs. String vs.StringBuilder • 当需要频繁的进行字符串修改时, 使用string 是不太合适的, 因为这样会导致大量的对象 被创建和回收, 造成一定的性能因素; 在这 种情况下可以使用StringBuffer; • StringBuilder与StringBuffer的类似, 也表示可 以修改的字符串; 两者的区别在于前者是线 程安全的(thread-safe), 而后者是线程不安全 的; 这意味这前者在具体的使用中性能会稍 弱于后者.
  • 15.