1. StringUtils 中一共有130多个方法,并且是 static 的,调用 方式为StringUtils.xxx()
常用的方法如下:
- public static boolean isEmpty(String str),为空的标准 str==null 或 str.length()==0。例子如下:
StringUtils.isEmpty(null) = true
StringUtils.isEmpty("") = true
StringUtils.isEmpty(" ") = false **//注意在 StringUtils 中空格作非空处理**
StringUtils.isEmpty(" ") = false
StringUtils.isEmpty("bob") = false
StringUtils.isEmpty(" bob ") = false
- public static boolean isNotEmpty(String str),是否非空,等于 !isEmpty(String str),示例如下:
StringUtils.isNotEmpty(null) = false
StringUtils.isNotEmpty("") = false
StringUtils.isNotEmpty(" ") = true
StringUtils.isNotEmpty(" ") = true
StringUtils.isNotEmpty("bob") = true
StringUtils.isNotEmpty(" bob ") = true
- public static boolean isBlank(String str),是否为空或长度为0或由空白符 构成,下面是示例:
StringUtils.isBlank(null) = true
StringUtils.isBlank("") = true
StringUtils.isBlank(" ") = true
StringUtils.isBlank(" ") = true
StringUtils.isBlank("\t \n \f \r") = true //对于制表符、换行符、换页符和回车符
StringUtils.isBlank() //均识为空白符
StringUtils.isBlank("\b") = false //"\b"为单词边界符
StringUtils.isBlank("bob") = false
StringUtils.isBlank(" bob ") = false
- public static boolean isNotBlank(String str)是否不为空且长度不为0且不由空白符(构成,等于 !isBlank(String str)
下面是示例:
StringUtils.isNotBlank(null) = false
StringUtils.isNotBlank("") = false
StringUtils.isNotBlank(" “) = false
StringUtils.isNotBlank(” “) = false
StringUtils.isNotBlank(”\t \n \f \r") = false
StringUtils.isNotBlank("\b") = true
StringUtils.isNotBlank(“bob”) = true
StringUtils.isNotBlank(" bob ") = true
1.2 String的常用方法
java字符串不能分开在两行中写。如果一个字符串太长,需要将这个字符串在两行上书写,可以使用“+”将两个字符串连起来,并在加好前换行。
只用“+” 运算符的一个操作类型是字符串,编译器就会将两外的操作类型转换成字符串形式。
package com.xingyun.tiaojianyuju;
public class Link {
public static void main(String[] args) {
int booktime = 4;
float practice = 2.5f;
System.out.println("我每天花费" + booktime + "小时看书"
+ practice + "小时上机练习");
}
}
我每天花费4小时看书2.5小时上机练习
别人让你看到了什么,你的能力又能让你自己看到了什么。又判断力的头脑比盲目的眼睛更为重要。
str.length | 获取字符串的长度 |
---|---|
str.indexOf(str,int) | 查找字符串第一次出现的位置。【-1表示没有检索到字符串s】,返回-1 |
str.subString(start,end) | 截取字符串。【从start位置开始,到end位置结束,不包括end位置的字符】 |
str.charAt(int index) | 获取指定索引位置的字符【空格也占一个字符】 |
str.trim() | 去掉字符串的前导/尾部空格【中间的一个空格并没有去除】 |
StringTokeniizer(String str, String delim) | 去除字符串中的所有空格【使用的是分割的原理】 |
str.replaceAll(str的字符串,str要代替的字符串) | 替换所有字符串 |
replace(str的字符串,str要代替的字符串) | 替换所有与指定字符串相匹配的字符串 |
replaceFirst(str的字符串,str要代替的字符串) | 替换第一个出现的指定字符串,而后面出现的字符串不做替换【str的字符串的大小写有严格要求,错了不能做替换处理】 |
== | 比较的是内存位置,不适宜用来比较字符串 |
equals() | 比较两个字符串内容必须完全一样 |
str.startsWith(String prefix) | 判断当前字符串对象是否以参数指定的字符串开始 |
str.split(String sign) | sign是分割符或者正则表达式 |
str.split(String sign,int limit分割的份数) | 如果定义多个分割符,可使用符号“ |
Character.isDigit() | 判断是否是数字 |
package com.xingyun.tiaojianyuju;
import java.util.StringTokenizer;
public class Link {
public static void main(String[] args) {
String s = " xiaobaibai hello";
StringTokenizer tokenizer = new StringTokenizer(s," ");
StringBuffer buffer = new StringBuffer();
int i = 1;
//判断一下字符串是否还有空格
while(tokenizer.hasMoreTokens()){
i++;
buffer.append(tokenizer.nextToken());
}
System.out.println(buffer.toString());
}
}
//spilt的分割使用
public static void main(String[] args) {
String s = "xiaobaibai,hello,小白白";
String[] split = s.split(",");
for (int i = 0; i < split.length; i++) {
System.out.println(split[i]);
}
}
public static void main(String[] args) {
String s = "无言独上西楼,月如钩,寂寞梧桐深渊锁清秋。剪不断、里不乱、是离愁,";
String[] split = s.split(",|。");
for (int i = 0; i < split.length; i++) {
System.out.println(split[i]);
}
}
2 格式化字符串
格式化字符串主要包括日期格式化、时间格式化、日期/时间组合的格式化和常规类型格式化。
2.1 日期格式化
format(String format,Object —args) | 通过给定的特殊转换符作为参数 来实现日期和时间的格式化 |
---|---|
format(Local I,String format,Object —args) | I为null的时候不进行本地格式化 |
public static void main(String[] args) {
Date today = new Date();
String a = String.format(Locale.US, "%tb",today);
System.out.println("月份的缩写:" + a);
String b = String.format(Locale.US, "%tB",today);
System.out.println("月份的全写:" +b);
String c = String.format( "%ta",today);
System.out.println("星期的缩写:" +c);
String d = String.format( "%tA",today);
System.out.println("星期的全写:" +d);
String e = String.format( "%tY",today);
System.out.println("年份的全写:" +e);
String f = String.format( "%ty",today);
System.out.println("年份的缩写:" +f);
String h = String.format( "%tm",today);
System.out.println("月份:" +h);
String g = String.format( "%tj",today);
System.out.println("一年的第几天:" +g);
String k = String.format( "%td",today);
System.out.println("一个月的第几天:" +k);
String l = String.format( "%te",today);
System.out.println("一个月的第几天:" +l);
}
2.2.时间格式化
public static void main(String[] args) {
Date date = new Date();
System.out.println("24小时两位数至:"+String.format("%tH", date));
System.out.println("12小时两位数至:" + String.format("%tI", date));
System.out.println("24小时一位数至:" + String.format("%tk", date));
System.out.println("12小时一位数至:" + String.format("%tl", date));
System.out.println("分钟:" + String.format("%tM", date));
System.out.println("秒:" + String.format("%tS", date));
System.out.println("上午或者下午:" + String.format("%tp", date));
}
2.3 时间/日期格式
public static void main(String[] args) {
Date date = new Date();
System.out.println("默认年份:"+date);
System.out.println("年-月-日(4位年份):" + String.format("%tF", date));
System.out.println("月/日/年(2位年份):" + String.format("%tD", date));
System.out.println("全部日期和时间信息:" + String.format("%tc", date));
System.out.println("时:分:秒 PM(AM)12小时制:" + String.format("%tr", date));
System.out.println("时:分:秒 24小时制:" + String.format("%tT", date));
System.out.println("时:分 24小时制:" + String.format("%tR", date));
}
2.4 常规类型格式化
public static void main(String[] args) {
System.out.println("十六进制:"+String.format("%d", 400/2));
System.out.println("3>5:"+String.format("%b", 3>5));
System.out.println("十六进制"+String.format("%x", 200));
}
转换货币的例子
package com.xingyun.tiaojianyuju;
import java.text.NumberFormat;
import java.util.Locale;
import java.util.Scanner;
/*
* 将数字转换为不同国家或地区的货币格式
* @author Administrator
*
*/
public class FormatNumber {
@SuppressWarnings("resource")
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入一个数字:");
double d = input.nextDouble();
System.out.println("local 类的常量作为构造参数获得不同的货币格式:");
NumberFormat instance = NumberFormat.getCurrencyInstance(Locale.CHINA);
System.out.println(instance.format(d));
NumberFormat instance1 = NumberFormat.getCurrencyInstance(Locale.US);
System.out.println(instance1.format(d));
}
}
结果如下:
请输入一个数字:
156
local 类的常量作为构造参数获得不同的货币格式:
¥156.00
$156.00
3 正则表达式
3.1正则表达式的元字符
package com.xingyun.digui;
/**
* 字符串由7个字符组成,并且第一位必须是大写字母,2-4位必须是小写字母,后3位必须是数字字符
* @author Administrator
*
*/
public class Decision {
public static void main(String[] args) {
String s1 = "Mrkj007";
boolean matches = s1.matches("\\p{Upper}\\p{Lower}\\p{Lower}\\p{Lower}\\d\\d\\d");
System.out.println(matches);
}
}
true
3.2 正则表达式的限定符
public static void main(String[] args) {
String s1 = "Mrkj007";
boolean matches = s1.matches("\\p{Upper}\\p{Lower}{3}\\d{3}");
System.out.println(matches);
}
//判断是否是邮箱的形式
public static void main(String[] args) {
String s1 = "sdf23@qq.com";
boolean matches = s1.matches("\\w{0,}\\@{1}\\w{0,}\\.{1}\\w{0,}");
System.out.println(matches);
}
3.3 方括号中元字符的含义
//判断是否是手机号
public static void main(String[] args) {
String s1 = "18700492836";
boolean matches = s1.matches("1[3,5,7,8,9]\\d{9}$");
System.out.println(matches);
}
//判断是否是IP地址
public class Decision {
public static void main(String[] args) {
String ip = "192.168.91.1";
System.out.println(matches(ip));
}
public static String matches(String text) {
if (text != null && !text.isEmpty()) {
String regex = "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d[1-9])\\."
+"(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
+"(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
+"(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$";
if (text.matches(regex)) {
return "是一个合法的IP地址";
}else {
return "不是一个合法的IP 地址";
}
}
return "请输入要验证的IP地址!";
}
}
输出结果:是一个合法的IP地址
//计算文章中的汉字个数
public static void main(String[] args) {
String text = "喜欢小白白 gg 更改";
int amount = 0;
for (int i = 0; i < text.length(); i++) {
//使用正则表达式判断字符是否属于汉字编码
boolean matches = Pattern.matches("^[\u4E00-\u9FA5]{0,}$", ""+text.charAt(i));
if (matches) {
amount++;
}
}
System.out.println("共有" + amount + "个汉字");
}
输出结果是:共有7个汉字
4 字符串生成器-StringBuilder
特点:是一个可变字符序列,在字符串缓存被单个线程使用时要比StringBuffer类快,用于多个线程是不安全的。
String 与StringBuilder做更新操作时所用时间的差别。
public static void main(String[] args) {
String str = "";
long strTime = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
str+=i;
}
long endTime = System.currentTimeMillis();
System.out.println("String消耗时间:"+(endTime-strTime));
StringBuilder builder = new StringBuilder("");
long startTime = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
builder.append(i);
}
long endT = System.currentTimeMillis();
System.out.println("StringBuilder消耗时间为:"+(endT-startTime));
}
测试结果:
String消耗时间:48243
StringBuilder消耗时间为:15
4.2 常用的方法
build.append(String str) | 将str追加到StringBuilder【可以实现任何类型数据追加,如int/boolean/char等】 |
---|---|
append(StringBufffer sb) | j将sb字符串缓存的值追加到字符串生成器中 |
insert(int offset,String str) | j将str添加到指定的offset索引位置 |
delete(int start,String end | 移除字符串中的子字符串 |
toString() | 将字符串生成器转换位字符串 |
//insert方法
public class Subo {
public static void main(String[] args) {
String s = "cat";
StringBuilder builder = new StringBuilder("fish");
builder.insert(2, s);
System.out.println(builder);
}
}
结果:
ficatsh
//delete
public static void main(String[] args) {
String s = "cat";
StringBuilder builder = new StringBuilder("fishloveyou");
builder.delete(3, 5);
System.out.println(builder);
}
结果:
fisoveyou
package com.xingyun.digui;
/**
* 将汉字和字母转换位Unicade编码
* @author Administrator
*
*/
public class Subo {
public static void main(String[] args) {
String s = "fish dont't love cat ";
char[] c = s.toCharArray();
StringBuilder builder = new StringBuilder();
for (char d : c) {
builder.append((int)d+" ");
}
System.out.println(builder.toString());
}
}
输出结果:102 105 115 104 32 100 111 110 116 39 116 32 108 111 118 101 32 99 97 116 32
典型案例
/**
* 去掉字符串中重复的字符
*/
public class SBDelete {
public static void main(String[] args) {
String s = "命运如同海风一吹着青春的舟,飘摇的,曲折的,度过了时间的海!";
StringBuilder builder = new StringBuilder(s);
for (int i = 0; i < builder.length(); i++) {
for (int j = i+1; j < builder.length(); j++) {
if (builder.charAt(i) ==builder.charAt(j) ) {
builder.deleteCharAt(j);
}
}
}
System.out.println(builder);
}
}
输出结果:
命运如同海风一吹着青春的舟,飘摇曲折度过了时间!
/**
* 实现字符串加密
* 将字符串转换成字节数组,再将每个字节和密文字符异或操作进行加密
* 做相反运算就可以进行解密
*
*/
public class EncryptUncrypt {
public static void main(String[] args) {
String value = "大鱼你好吗";
char secret ='嗯';
String u = EncryptUncrypt.EAndU(value, secret);
System.out.println("加密后的值为:" + u+" ");
System.out.println("解密码后的值为:a"+EncryptUncrypt.EAndU(u, secret));
}
public static String EAndU(String value,char secret) {
byte[] bs = value.getBytes();
for (int i = 0; i < bs.length; i++) {
//进行异或运算进行加密
bs[i]= (byte)(bs[i]^(int)secret);
}
return new String(bs,0,bs.length);
}
}
输出结果:
加密后的值为:
KH^SRO
JR
x
解密码后的值为:a大鱼你好吗
/**
* 验证字符串是否回文。只要 测试反转后的文字的下标是否跟之前的相等就可以了
*
*/
public class StringB {
public static void main(String[] args) {
String str = "你爱你呀";
StringBuilder b = new StringBuilder(str);
b.reverse();
int count=0;
for (int i = 0; i < b.length(); i++) {
if (str.charAt(i)!=b.charAt(i)) {
System.out.println("字符串不回文");
break;
}
if (str.charAt(i)==b.charAt(i)) {
count++;
}
}
if (count==str.length()) {
System.out.println("字符串回文");
}
}
}
输出结果:字符串不回文
练习题:指定字符在已知的字符串里面的个数
package com.mybatis.bean;
public class Star {
public static void main(String[] args) {
String str="You are the best for me , thank you .You are as warm as the sunset glow."
+ "Live a good life meet slowly."
+ "want to be well known joy."
+ "If you can dream it,yo can do it.Fortunately,I love to laugh,life is not so bad."
+ "Be thankful and be gentle.Always gentle,always tearful.aaaaa";
char[]string=str.toCharArray();
char a='a';
int count=0;
for (int i = 0; i <string.length; i++) {
if (a==string[i]) {
count++;
}
}
System.out.println(count);
}
}