• 1. 本章内容1 字符串(String)的表示 两种主要的初始化方式 == 和 equals() 2 String的常用方法 修改字符串 获取其中的某些字符 获取子串 对字符串进行分割 3 StringBuffer的常用方法 append() insert() delete() reverse() 4 String与StringBuffer的效率比较 5 正则表达式的简单应用 Pattern Matcher
  • 2. 字符串的表示Java中的字符串是类(复合数据类型)。 遇到双引号自动创建String类的对象 提供字符串运算符,字符串的连接:+ 定长字符串:String类 不能更改,做字符串连接时效率低 可变字符串:StringBuffer类(使用灵活) 可追加、插入、删除、翻转等操作。
  • 3. String类String()以空字符串初始化一个新的字符串对象String(String s)初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列 String(byte bytes[])通过使用平台的默认字符集编码指定的 byte 数组,构造一个新的 String。 String(char chars[])创建一个新的 String,使其表示字符数组参数中当前包含的字符序列 String str=字符串常量以字符串常量的方式直接实例化字符串对象
  • 4. new String()初始化方式String s1 = new String(“abc”) ; 0x01234567s1“abc”“abc”请问产生了几个String类的对象采用此初始化方式会浪费堆内存。
  • 5. String str=字符串常量 方式遇到“ ”自动创建字符串对象并赋值。该字符串常量会放入到对象池中,相同值的字符串常量只创建一次,以后不再创建。 String s1=“abc”; String s2=“abc”; 此种初始化方式比new String()方式节约内存空间。
  • 6. 两种比较方式 = = 用来比较字符串是否是同一对象(是否同一段内存空间)。 equals() 用来比较字符串对象的值是否相同。 (String的equals()方法已经重写,改变了Object中equals()方法的本意)。
  • 7. public class EqualsApp{ public static void main(String args[]) { String s1="abcd"; String s2=s1; String s3=new String("china"); String s4=new String("china"); if(s1==s2) System.out.println(“s1和s2指向同一个对象"); else System.out.println(“s1和s2指向不同的对象"); if(s3==s4) System.out.println("s3和s4是同一个对象"); else System.out.println("s3和s4不是同一个对象"); if(s3.equals(s4)) System.out.println("s3和s4的值相等"); else System.out.println("s3和s4的值不相等"); } } 见源文件: equalsApp.java
  • 8. equals()方法的注意点如果是与字符串常量比较值,建议将字符串常量放在前面,可以避免NullPointerException异常。 if (str.equals(“hello”)) if(“hello”.equals(str)) 见源文件:equals方法/equalsTest.java
  • 9. String的常用方法-访问字符串方法: int length() 返回字符串的长度 char charAt(int index) 返回指定位置的字符 int compareTo(String s1) 按字母顺序进行字符串比较 ,从第一个字符开始比较,直到遇到第一个不相同的字符,若该位置目标字符大于参数字符,则返回一个正整数,否则返回一个负整数。若两字符串相等返回0(不忽略大小写)。 int compareToIgnoreCase(String s1) 按字母顺序进行字符串比较,忽略大小写。 boolean equals(Object obj) 判断字符串相等(区分大小写) boolean equalsIgnoreCase(String s2) 判断字符串相等(不区分大小写)
  • 10. String的常用方法-访问字符串String substring(int beginIndex) 取子串,从下标索引开始到字符串结束 String substring(int beginIndex, int endIndex) 指定从开始位置到结束位置之间的字符串 int indexOf(String str) 返回str在当前串中第一次出现的位置 int indexOf(String str,int fromIndex) 返回str在当前串中第一次出现的位置,从指定索引位置开始查找
  • 11. boolean startsWith(String prefix) 判断该字符串是否以prefix为前缀 boolean endsWith(String suffix) 判断该字符串是否以suffix为后缀 例1:如西安地区的邮政编码以71开头。 if(s.startsWith(“71”)) System.out.println(“西安地区”); 例2:老居民身份证号码最后一位代表性别。 if(s.endsWith("0")||s.endsWith("2")||s.endsWith("4") ||s.endsWith("6")||s.endsWith("8")) System.out.println("此人是女性!");
  • 12. String的常用方法-访问字符串char[ ] toCharArray() 将字符串转为字符数组 String concat(String s) 将字符串s连接到指定字符串的结尾 Boolean isEmpty() 当切仅当length()为0时,返回true
  • 13. String的常用方法-修改字符串 public String toLowerCase() 该方法将字符串中所有字符转换成小写,并返回转换后的新串。 public String toUpperCase() 该方法将字符串中所有字符转换成大写,并返回转换后的新串。 public String trim() 该方法去掉开头和结尾的空格,并返回得到的新字符串。值得注意的是,在原来字符串中间的空格并不去掉。
  • 14. String的常用方法-修改字符串 String replace(char oldChar,char newChar) 用字符newChar替换当前字符串中所有的字符oldChar,并返回一个新的字符串。 String replaceFirst(String regex, String replacement) 用字符串replacement的内容替换当前字符串中遇到的第一个和字符串regex相一致的子串,并将产生的新字符串返回。 String replaceAll(String regex, String replacement) 用字符串replacement的内容替换当前字符串中遇到的所有和字符串regex相一致的子串,并将产生的新字符串返回。 String[] split(String prefix) 按照给定的模式对字符串进行拆分
  • 15. public class StringApp{ public static void main(String args[]) { char str[]={'a','b','c','d'}; String str1=new String(str); String s1="ABCD"; String s=new String(str1.concat(s1)); System.out.println("the length of s is:"+s.length()); System.out.println("a substring in s is:"+s.substring(2,5)); System.out.println("change into uppercase:"+s.toUpperCase()); String s2=s.replaceAll("abcd","ABCD"); System.out.println("use ABCD to replace:"+s2); } } 见源文件:StringApp.java
  • 16. 字符串应用举例在实际当中经常要判断输入的用户名、邮箱等注册信息是否正确。 见源代码:Validate.java 有如下格式的字符串: 张三:23#李四:34#王五:30 请按照如下形式输出: 姓名:张三 年龄:23 见源文件: StringSplit.java
  • 17. StringBuffer类的基本方法 1.初始化方法 StringBuffer类只能用构造方法对其初始化。 StringBuffer s= Welcome to Java! ”; (错误的初始化方法) 2. 访问方法 StringBuffer类的访问方法主要是进行添加、删除、翻转等操作。StringBuffer类
  • 18. 构造函数 功能描述 StringBuffer() 建立空的字符串对象 StringBuffer(int length) 建立长度为length的字符串对象 StringBuffer(String s) 建立一个初始值为s的字符串对象 StringBuffer StringBuffer类的构造函数
  • 19. 方 法 功能描述 length() 返回字符串长度 setLength(int newlength) 重新设置字符串的长度,新串为旧串的截余 charAt(int index) 返回指定位置的字符 delete(int start,int off) 删除某下标区间的字符串 append(Object obj) 将指定对象转换为字符串添加到原串尾 insert(int offset,Object obj) 将指定对象转换为字符串,然后插入到从offset开始的位置 toString() 将字符串转换成String对象 StringBuffer的主要方法
  • 20. public class StringBufferApp { public static void main(String args[]) { StringBuffer s=new StringBuffer("this is a test for StringBuffer"); s.setLength(14); System.out.println(s); s.setCharAt(0,'T'); s.append(" new"); s.insert(9," value"); System.out.println(s); } } 见源文件:StringBufferApp.java StringBuffer类
  • 21. StringBuffer类 Java中并不支持运算符的重载,但“+”是个例外,例如,对语句: String s="Welcome "+"to"+"Java! "; 编译器首先生成类StringBuffer的一个实例,然后连续调用方法append(),最后,再调用方法toString()把StringBuffer对象转换为String对象。这相当于执行语句: String s=new StringBuffer("Welcome").append("to").append("Java! ").toString();
  • 22. String和StringBuffer的效率比较String类表示的是定长的字符串,做字符串连接时效率低。 StringBuffer表示长度可变的字符串,擅长做字符串的连接、修改等操作,效率高。 见源文件: 效率比较/StringAndStringBuffer.java
  • 23. StringTokenizer类分析字符串分析字符串并将字符串分解成为可被独立使用的单词。 构造方法: (1) StringTokenizer(String s)为字符串s构造一个分析器。使用默认的分隔符集合,即空格符、换行符、回车符、Tab符。 (2) StringTokenzier(String s,String dem) 为字符串s构造一个分析器,参数dem的字符被作为分隔符。
  • 24. import java.util.*; public class StringTokenizer1 { public static void main(String args[]) { String s1="I am Geng.x.y,she is my good friend"; String s2="Lowood?what is that?"; StringTokenizer fenxi1=new StringTokenizer(s1," ,"); StringTokenizer fenxi2=new StringTokenizer(s2," ?"); int n1=fenxi1.countTokens(); int n2=fenxi2.countTokens(); while(fenxi1.hasMoreTokens()) { String s=fenxi1.nextToken(); System.out.println(s); } System.out.println("s1有单词:"+n1+"个"); while(fenxi2.hasMoreTokens()) { String s=fenxi2.nextToken(); System.out.println(s); } System.out.println("s2有单词:"+n2+"个"); }}
  • 25. 正则表达式JDK1.4后引入了正则表达式,主要目的是为了简化复杂的字符串验证操作。 最常用的正则表达式包括以下几个分类: (1) 字符匹配 (2) 表达式匹配 (3) 次数匹配 (4) 关系匹配
  • 26. 正则表达式-字符匹配表达式含义[abc]表示取a、b、c三个字符中的一个[ʌabc]不是a、b、c三个字符中的一个[a-zA-Z]表示全部字母(包括大、小写)[a-d[m-p]]a 到 d 或 m 到 p:[a-dm-p](并集) [a-z&&[def]] d、e 或 f(交集)
  • 27. 正则表达式-表达式匹配表达式含义 \d全部由数字组成的表达式 \D全部由非数字组成的表达式 \s表示由空格组成的表达式, 包括 ”\n,\t”等 \S表示由非空格组成的表达式 \w表示由字母、数字、下划线组成的表达式 \W表示由非字母、数字、下划线组成的表达式.表示任意字符
  • 28. 正则表达式-表示出现的次数表达式含义 X?X出现的次数为0次或1次 X*X出现的次数为0次或多次 X+X出现的次数为1次或多次 X{n}X出现的次数为n次 X{n,}X出现的次数大于n次 X{n,m}X出现的次数在n-m次之间
  • 29. 正则表达式-表示关系表达式含义 X|Y正则表达式为X或Y XYX后面出现Y (X)X表示一组规范
  • 30. Pattern类Pattern类主要是生成正则规范的,是正则表达式操作的一个重要类。 static Pattern compile(String regex) 将给定的正则表达式编译到模式中。 Matcher matcher(CharSequence input) 为输入的字符序列创建匹配器。 String pattern() 返回此模式中编译过的正则表达式。 String[] split(CharSequence input) 围绕此模式的匹配拆分给定输入序列。 见源文件: 正则表达式/RegexTest.java
  • 31. Matcher类Matcher类主要用于对Pattern类中编译后的模式进行匹配,匹配成功后可以进行验证和替换操作。 boolean matches() 与正则表达式进行匹配。 String replaceAll(String replacement) 替换输入序列与正则表达式匹配的每一个部分。 String replaceFirst(String replacement) 替换输入序列与正则表达式匹配的每一个部分。 见源文件:正则表达式/MatcherTest.java
  • 32. 正则表达式例: 从控制台输入一字符串,判断其是否为合法的IP地址,如果是合法的IP地址,则输出其中的每部分表示的十进制数。 见原文件:正则表达式/RegexIPTest.java