<java编程思想>学习笔记13,第十三章 字符串

1,字符串操作是计算机程序设计中最常见的行为。

 

2,String是不可变的

 

当把String 对象当作方法的参数时,都会复制一份引用,而该引用所指的对象其实一直待在单一的物理位置上,从未动过。

 

3,重载“+”和StringBuilder

 

public class WhitherStringBuilder {
  public String implicit(String[] fields) {
    String result = "";
    for(int i = 0; i < fields.length; i++)
      result += fields[i];   //new了 fields.lengthStringBuilder
    return result;
  }
  public String explicit(String[] fields) {
    StringBuilder result = new StringBuilder(); //只new了一个StringBuilder
    for(int i = 0; i < fields.length; i++)
      result.append(fields[i]);
    return result.toString();
  }
} ///:~

 

javap -c WhitherStringBuilder   //查看jvm字节码

 

4,无意识的递归

 

public class InfiniteRecursion {
  public String toString() {
    return " InfiniteRecursion address: " + this + "\n";
  }
  public static void main(String[] args) {
    List<InfiniteRecursion> v =
      new ArrayList<InfiniteRecursion>();
    for(int i = 0; i < 10; i++)
      v.add(new InfiniteRecursion());
    System.out.println(v);
  }
} ///:~

 

this 应该改成:super.toString();

 

5,格式化输出

 

jdk5推出了c语言中printf()风格的格式化输出这一功能。这不仅使得控制输出的代码更加简单,同时也给java开发者对

 

于输出格式与排版更强大的控制能力。

 

public class SimpleFormat {
  public static void main(String[] args) {
    int x = 5;
    double y = 5.332542;
    // The old way:
  
  System.out.println("Row 1: [" + x + " " + y + "]");
    // The new way:
 
   System.out.format("Row 1: [%d %f]\n", x, y);
    // or
   
System.out.printf("Row 1: [%d %f]\n", x, y);
  }
} /* Output:

 

6,Formatter类

 

 在java中,所有的新格式化的功能都由java.util.Formatter 类来处理,可以把Formatter看作一个翻译器,它把你的格

 

式化字符串与数据翻译成需要的结果。

 

public class Turtle {
  private String name;
  private Formatter f;
  public Turtle(String name, Formatter f) {
    this.name = name;
    this.f = f;
  }
  public void move(int x, int y) {
  
  f.format("%s The Turtle is at (%d,%d)\n", name, x, y);
  }
  public static void main(String[] args) {
    PrintStream outAlias = System.out;
    Turtle tommy = new Turtle("Tommy",
      new Formatter(System.out));
    Turtle terry = new Turtle("Terry",
      new Formatter(outAlias));
    tommy.move(0,0);
    terry.move(4,8);
    tommy.move(3,4);
    terry.move(2,5);
    tommy.move(3,3);
    terry.move(3,3);
  }
} /* Output:

 

 

7,正则表达式

 

正则表达式已经整合到标准的Unix工具集之中,例如sed和awk,以及程序设计语言之中,例如Python和Perl。而在

 

java中,字符串操作主要集中在String,StringBuffer和StringTokenizer类。与正则表达式比较,它们只能提供相当

 

简单的功能。

 

8,用正则表达式扫描

 

public class ThreatAnalyzer {
  static String threatData =
    "
58.27.82.161@02/10/2005\n" +
    "
204.45.234.40@02/11/2005\n" +
    "
58.27.82.161@02/11/2005\n" +
    "
58.27.82.161@02/12/2005\n" +
    "
58.27.82.161@02/12/2005\n" +
    "[Next log section with different data format]";
  public static void main(String[] args) {
    Scanner scanner = new Scanner(threatData);
    String pattern = "(
\\d+[.]\\d+[.]\\d+[.]\\d+)@" +
      "(
\\d{2}/\\d{2}/\\d{4})";
    while(scanner.hasNext(pattern)) {
      scanner.next(pattern);
      MatchResult match = scanner.match();
      String ip = match.group(1);
      String date = match.group(2);
      System.out.format("Threat on %s from %s\n", date,ip);
    }
  }
} /* Output:
Threat on 02/10/2005 from 58.27.82.161
Threat on 02/11/2005 from 204.45.234.40
Threat on 02/11/2005 from 58.27.82.161
Threat on 02/12/2005 from 58.27.82.161
Threat on 02/12/2005 from 58.27.82.161

 

9,在java引入正则表达式(jdk1.4)和Scanner类(jdk5)之前,分割字符串的唯一方法就是使用StringtoKennizer

 

来分词。

 

public class ReplacingStringTokenizer {
  public static void main(String[] args) {
    String input = "But I'm not dead yet! I feel happy!";
   
StringTokenizer stoke = new StringTokenizer(input);
    while(stoke.hasMoreElements())
      System.out.print(stoke.nextToken() + " ");
    System.out.println();
    System.out.println(Arrays.toString(input.split(" ")));
   
Scanner scanner = new Scanner(input);
    while(scanner.hasNext())
      System.out.print(scanner.next() + " ");
  }
} /* Output:
But I'm not dead yet! I feel happy!
[But, I'm, not, dead, yet!, I, feel, happy!]
But I'm not dead yet! I feel happy!

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值