Java常用类库——String类的常用方法
String类概述
- String类代表字符串。Java中的所有字符串字面值都作为此类的实例实现。
- 字符串在JVM中是以常量方式存储;它们的值在创建之后不能更改,只能被覆盖。
- String类是Java中非常主要的引用数据类型,几乎所有数据都可以使用String进行表示。
- 常用的类型
- public String() //构建了一个空串,公共无参的构造器
- public String(byte[] bytes) //用一个byte数组来构建一个字符串,格式化时用到
- public String(char[] chars) //用一个char数组来构建一个字符串
- public String(char[] chars,int offset,int count) //第一个参数是构建字符串的目标数组,第二个参数是从数组中哪一个char开始构建的一个索引,最后一个是表示选择多长。
- public String(String str) //给上一个字符串,构建一个字符串对象存储字符串
- public String(StringBuffer buffer) //可以更改String里面的变量值
String类常用方法
- public char charAt(int index) //按照给定的索引查找index这个位置的字符并返回一个char
- * @return
- public int compareTo(String target) //和给定的参数target进行ASCII码比较大小,返回值是1,-1,0
- public boolean equals(String target) //比较两个字符串是否相同,比如字符串ABC和目标字符串ABC相比相同,返回true
- public boolean equalsIgnoreCase(String target) //忽略大小写,比较两个字符串是否相同,比如字符串ABC和目标字符串abc相比相同,返回true
- public boolean endsWith(String suffix) //字符串是否是以给定的字符串suffix为后缀的
- public boolean startsWith(String prefix) //字符串是否是以给定的字符串prefix为前缀的
String类常用方法2
- public String trim() //源字符串不变,返回一个去掉了空格的新字符串
- public int indexOf(int ch) //查找有没有字符ch,有则返回索引位置,没有返回负数
- public int indexOf(int ch,int fromIndex) //是上一个indexOf方法的重载,上一个方法是从0开始查找,这个方法是从给定的fromIndex这个位置开始查找字符
- public int indexOf(String target) //查找字符串,如查找字符串ABC,会返回字符串中第一个ABC的A的索引位置
- public int indexOf(String target,int fromIndex) //是上一个indexOf方法的重载,从fromIndex这个位置开始查找字符串target,找到以后返回target字符串第一个字符的索引位置
- public int length() //字符串长度的获取
String类常用方法3
- public String[] split(String regex) //按照给定的符号对字符串进行分割,将分割后的字符串封装成数组返回。实际使用中regex通常是正则表达式
- public String substring(int beginIndex) //从字符串中提取子串,beginIndex是起始位置,一直提取到结束为止
- public String substring(int beginIndex,int endIndex) //从字符串中提取子串,beginIndex是起始位置,endIndex是结束位置。注意,结束位置的字符会被舍弃,不会被提取
- public char[] toCharArray() //遍历字符串,把字符串每一个元素放进char数组中,返回一个char数组
- public String toLowerCase() //把给定的字符串内容全部变成小写返回,注意,返回的是一个副本,源字符串不变
- public String toUpperCase() //把给定的字符串内容全部变成大写返回,注意,返回的是一个副本,源字符串不变
String类常用方法4
- public String replace(char oldChar,char newChar) //如果找到了oldChar,就把他替换成newChar。注意,源字符串仍然不变,返回的是一个副本
- public String replace(String target,String newStr) //如果找到了target,就把他替换成newStr。这个替换不是替换单个字符,是替换一堆字符。注意,源字符串仍然不变,返回的是一个副本
- public static String valueOf(Object obj) //把任何一个Java类型都可以转换成字符串输出
StringBuilder概述
- StringBuilder是一个可变的非线程安全的字符序列,它与StringBuffer基本类似,但StringBuffer是线程同步的。在不涉及到多线程的应用中通常使用StringBuilder,因为它的执行效率要比StringBuffer更高。在允许对某字符串进行源字符序列更改是应该首选StringBuilder,如果涉及到多线程中建议使用StringBuffer
StringBuilder对象的创建
- public StringBuilder() //构建一个空的,可修改的字符串序列
- public StringBuilder(int capacity) //int型参数给builder设置一个缓冲区容量,一般用默认的容量即可,因此该方法使用较少
- public StringBuilder(String str) //builder存储的是str里的字符,对builder的任何修改都会影响str
- public StringBuilder(CharSequence seq) //和上一个方法类似
StringBuilder常用方法
- public StringBuilder append(Object obj) //将任何类型的参数连接到字符串末尾
- public StringBuilder delete(int start,int end) //删除自身序列中的值,从索引start位置开始删,删到end位置。注意,end位置值是保留的。例如end为3,删除的是索引位置0,1,2的参数。
- public StringBuilder deleteCharAt(int index) //在给定的索引位置删除一个字符,比如index值是0,那么就会删掉第一个字符
- public StringBuilder intsert(int offset,Object obj) //在给定的索引位置插入一个任何类型的参数,例如offset值是0,就会在0位置之后插入。
- public StringBuilder replace(int start,int end,String str) //第一个参数是替换的起始位置,第二个参数是替换的结束位置,第三个是用于替换的字符串。会真正的改变源值。
StringBuilder常用方法2
- public StringBuild reverse() //倒序返回当前对象本身,比如原本是ABC,返回的就是CBA
- public void setLength(int newLength) //改变长度,类似剪切功能,例如原本字符串长度是50,newLength设置是45,那么长度会变为45,多出的5个值会被丢弃。
- public void setCharAt(int index,char ch) //在index位置放一个char字符,这个索引位置原来的字符会被替换掉
/** * 使用Eclipse 工具建立一个java控制台程序, 为公司软件业务提供对字符串的验证及计算操作, * 应定义一个接口并定义满足需求的若干抽象方法提供对字符串计算的不同操作, 对字符串的计算和验证有如下需求: * 1)对用户输入注册名称字符规则验证; * 2) 对字符串中使用了某种特定分隔符分割的所有字符串重新获取并以字符串数组返回; * 3) 对给定的字符串及从此字符串中查找是否包含特定的字符串; * 4) 对用户输入的个人电子邮箱格式进行验证,验证规则为必需而且只能有一个@符号,必需以.163为后缀,@符号前 * 必需至少2个字符,邮箱中字符不能有除英文大小写字符,@ 符号,点符号,下划线和数字以外的任何其他字符. * 编写一个实现此接口的普通类实现接口中的抽象字符串验证计算方法, 可以使用适配器方式,编写主类和main方法 * 进行测试接口方法的实现是否正确. 以上所述可使用String 及结合StringBuffer 作为主要实现手段. */ package main; import java.util.Scanner; import imp.IdentifyUserEmail; import imp.IdentifyUserName; import imp.IdentifyUserTag; import imp.User; import interfaces.IdentifyMethod; public class Test { public static void main(String[] args) { //来一个Scanner接收用户输入 Scanner input = new Scanner(System.in); //new一下已经封装好的User类 User user = new User(); /** * * 3) 对给定的字符串及从此字符串中查找是否包含特定的字符串; * 调用identifyUserName方法检查用户是否在用户名中输入了敏感字符 */ //请用户输入用户名 System.out.println("请输入用户名:(提示:输入敏感字符如'本拉登'将无法注册)"); user.setUserName(input.next()); //new一下IdentifyUserName类 IdentifyMethod ide1 = new IdentifyUserName(); //直接输出验证的结果 System.out.println(ide1.identifyUserName(user)); /** * 2 ) 对字符串中使用了某种特定分隔符分割的所有字符串重新获取并以字符串数组返回; * 调用identifyUserTag方法,分割以逗号隔开的标签并以字符串数组返回 */ //请用户输入用户标签 System.out.println("请输入您的标签,以英文小写逗号隔开"); user.setUserTag(input.next()); //new一下IdentifyUserTag类 IdentifyUserTag ide2 = new IdentifyUserTag(); //调用identifyUserTag方法,定义一个字符串数组接收返回结果 String str1[] = ide2.identifyUserTag(user); System.out.println("您的标签是:"); for (String e : str1){ System.out.println(e); //遍历输出接收到的字符串数组 } /** * 4) 对用户输入的个人电子邮箱格式进行验证,验证规则为必需而且只能有一个@符号, * 必需以.163为后缀,@符号前必需至少2个字符,邮箱中字符不能有除英文大小写字符, * @ 符号,点符号,下划线和数字以外的任何其他字符. */ //请用户输入邮箱 System.out.println("请输入您要注册的邮箱:"); user.setUserEmail(input.next()); //new一下IdentifyUserEmail类 IdentifyUserEmail ide3 = new IdentifyUserEmail(); String str3 = ide3.identifyUserEmail(user); System.out.println(str3); } }
/** * 使用Eclipse 工具建立一个java控制台程序, 为公司软件业务提供对字符串的验证及计算操作, * 应定义一个接口并定义满足需求的若干抽象方法提供对字符串计算的不同操作, 对字符串的计算和验证有如下需求: * 1)对用户输入注册名称字符规则验证; * 2) 对字符串中使用了某种特定分隔符分割的所有字符串重新获取并以字符串数组返回; * 3) 对给定的字符串及从此字符串中查找是否包含特定的字符串; * 4) 对用户输入的个人电子邮箱格式进行验证,验证规则为必需而且只能有一个@符号,必需以.163为后缀,@符号前 * 必需至少2个字符,邮箱中字符不能有除英文大小写字符,@ 符号,点符号,下划线和数字以外的任何其他字符. * 编写一个实现此接口的普通类实现接口中的抽象字符串验证计算方法, 可以使用适配器方式,编写主类和main方法 * 进行测试接口方法的实现是否正确. 以上所述可使用String 及结合StringBuffer 作为主要实现手段. */ package interfaces; import imp.User; public interface IdentifyMethod { //2)对字符串中使用了某种特定分隔符分割的所有字符串重新获取并以字符串数组返回; String[] identifyUserTag(User user); //3) 对给定的字符串及从此字符串中查找是否包含特定的字符串; String identifyUserName(User user); //4) 对用户输入的个人电子邮箱格式进行验证,验证规则为必需而且只能有一个@符号,必需以.163为后缀,@符号前必需至少2个字符,邮箱中字符不能有除英文大小写字符,@ 符号,点符号,下划线和数字以外的任何其他字符. String identifyUserEmail(User user); }
/** * 使用Eclipse 工具建立一个java控制台程序, 为公司软件业务提供对字符串的验证及计算操作, * 应定义一个接口并定义满足需求的若干抽象方法提供对字符串计算的不同操作, 对字符串的计算和验证有如下需求: * 1)对用户输入注册名称字符规则验证; * 2) 对字符串中使用了某种特定分隔符分割的所有字符串重新获取并以字符串数组返回; * 3) 对给定的字符串及从此字符串中查找是否包含特定的字符串; * 4) 对用户输入的个人电子邮箱格式进行验证,验证规则为必需而且只能有一个@符号,必需以.163为后缀,@符号前 * 必需至少2个字符,邮箱中字符不能有除英文大小写字符,@ 符号,点符号,下划线和数字以外的任何其他字符. * 编写一个实现此接口的普通类实现接口中的抽象字符串验证计算方法, 可以使用适配器方式,编写主类和main方法 * 进行测试接口方法的实现是否正确. 以上所述可使用String 及结合StringBuffer 作为主要实现手段. */ package Adaptor; import imp.User; import interfaces.IdentifyMethod; /*定义一个适配器对接口所有方法提供空实现*/ public class IdentifyMethodAdaptor implements IdentifyMethod { @Override public String[] identifyUserTag(User user) { return null; } @Override public String identifyUserName(User user) { return null; } @Override public String identifyUserEmail(User user) { return null; } }
package imp; import Adaptor.IdentifyMethodAdaptor; public class IdentifyUserName extends IdentifyMethodAdaptor { @Override public String identifyUserName(User user) { boolean status = user.getUserName().contains("本拉登");//检查用户输入的用户名中是否包含敏感字符本拉登 if (status) return "注册失败,您试图注册的用户名:"+user.getUserName()+" 包含敏感词汇,是非法的!"; else return "注册成功,您的用户名是:"+user.getUserName(); } }
package imp; import Adaptor.IdentifyMethodAdaptor; public class IdentifyUserTag extends IdentifyMethodAdaptor { @Override public String[] identifyUserTag(User user) { String str1[] = user.getUserTag().split(","); //以逗号分割字符串并将结果存入字符串数组 return str1; //返回字符串数组 } }
package imp; import Adaptor.IdentifyMethodAdaptor; public class IdentifyUserEmail extends IdentifyMethodAdaptor { @Override public String identifyUserEmail(User user) { char email[] = user.getUserEmail().toCharArray(); int countAt = 0; if (user.getUserEmail().endsWith(".163")?true:false){ for (int i = 0;i<email.length;i++){ //因为@符之前必须要有2个字符,所以判断,如果i<2时出现了@符,就返回报错信息 if (email[i]=='@'&&i<2){ return "您的@输入不正确,必需而且只能有一个@符号且符号前必需至少2个字符"; }else if (email[i]=='@'&&i>=2){ countAt++; //累加i>2以后@符出现的次数 } } //如果@符出现次数大于1次,则返回失败报错信息 if (countAt > 1){ return "您的@输入不正确,必需而且只能有一个@符号且符号前必需至少2个字符"; }else if(countAt == 1 && check(user.getUserEmail())) //调用一个check静态方法,返回值是bool值 return "您的邮箱:"+user.getUserEmail()+"注册成功"; else return "邮箱名中有不支持的字符"; }else return "邮箱必须必须以.163结尾"; } //这个方法用来验证是否包含除英文大小写字符,@ 符号,点符号,下划线和数字以外的任何其他字符 public static boolean check(String email){ //定义一个包含@符号,点和下划线的字符串x String x = "@._"; //根据字符串的长度遍历 for (int i = 0;i<email.length();i++){ //每一次循环都把字符串的i位置的值存进char类型的c变量里,用来做比较 char c = email.charAt(i); //如果c不是数字并且c不是英文字母并且c不包含在x特殊字符字符串中,那么一定是非法字符,返回false if(!Character.isDigit(c)&&!Character.isLetter(c)&&!x.contains(c+"")) return false; } //否则就返回true return true; } }
/** * 使用Eclipse 工具建立一个java控制台程序, 为公司软件业务提供对字符串的验证及计算操作, * 应定义一个接口并定义满足需求的若干抽象方法提供对字符串计算的不同操作, 对字符串的计算和验证有如下需求: * 1)对用户输入注册名称字符规则验证; * 2) 对字符串中使用了某种特定分隔符分割的所有字符串重新获取并以字符串数组返回; * 3) 对给定的字符串及从此字符串中查找是否包含特定的字符串; * 4) 对用户输入的个人电子邮箱格式进行验证,验证规则为必需而且只能有一个@符号,必需以.163为后缀,@符号前 * 必需至少2个字符,邮箱中字符不能有除英文大小写字符,@ 符号,点符号,下划线和数字以外的任何其他字符. * 编写一个实现此接口的普通类实现接口中的抽象字符串验证计算方法, 可以使用适配器方式,编写主类和main方法 * 进行测试接口方法的实现是否正确. 以上所述可使用String 及结合StringBuffer 作为主要实现手段. */ package imp; /** * 封装一个用户信息类并提供getter和setter方法 */ public class User { private String userName; private String userTag; private String userEmail; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserTag() { return userTag; } public void setUserTag(String userTag) { this.userTag = userTag; } public String getUserEmail() { return userEmail; } public void setUserEmail(String userEmail) { this.userEmail = userEmail; } }
------------------------------------------分割线--------------------------------------------------------
关于第四条验证邮箱的需求,其实最后一个要求我是没做出来的,请教了老师,老师写了一个方法供参考,任务要求:“4) 对用户输入的个人电子邮箱格式进行验证,验证规则为必需而且只能有一个@符号,必需以.163为后缀,@符号前必需至少2个字符,邮箱中字符不能有除英文大小写字符,@ 符号,点符号,下划线和数字以外的任何其他字符.”
当时觉得自己完全没有思路,可能要把字符串拆分成char类型数组一个一个去比较,感觉很麻烦,想请教老师有没有更好的办法,其实老师也是使用了chatAt方法,先遍历字符串,把每一个元素分别存进char类型中,再校验这个char类型是否合法,挨个比较过去。
package com.email; import java.util.Scanner; /* 对用户输入的个人电子邮箱格式进行验证, 验证规则为必需而且只能有一个@符号, 必需以.163为后缀,@符号前必需至少2个字符, 邮箱中字符不能有除英文大小写字符,@ 符号,点符号,下划线和数字以外的任何其他字符. */ public class Test { public static void main(String[] args) { Scanner scanner=new Scanner(System.in); System.out.println("请输入email地址:"); String email=scanner.next(); while (true){ if (checkEmail(email)){ System.out.println("有效的地址"); break; }else{ System.out.println("地址无效"); email=scanner.next(); } } } public static boolean checkEmail(String email){ int at1=email.indexOf("@"); int at2=email.lastIndexOf("@"); return (at1==at2 && email.endsWith(".163") && at1>=2 && checkChar(email)); } public static boolean checkChar(String str){ String x="@._"; for (int i=0;i<str.length();i++){ char c=str.charAt(i); if (!Character.isDigit(c) && !Character.isLetter(c) && !x.contains(c+"")) return false; } return true; } }