Java字符串就是Unicode字符序列。Java里没有内置的字符串类型,而是在标准的类库中提供了一个预定义类,String。每个用双引号""括起来的都是String类的一个实例。
字符串是日常开发中最常用, Java字符串的一个重要特点就是字符串不可变
String str = "www.xiezhrspace.cn";
//或者
String str;
str = "www.xiezhrspace.cn";
//① String() 初始化新创建的 String对象,使其表示空字符序列
String str = new String();
//② String(String original) 初始化新创建的String对象,使其表示与参数相同的字符序列;换句话说,新创建的字符串是参数字符串的副本。
String str = new String("www.xiezhrspace.cn")
//③ String(char[] value) 分配一个新的字符串,将参数中的字符数组元素全部变为字符串。该字符数组的内容已被复制,后续对字符数组的修改不会影响新创建的字符串
char a[] = {'H','e','l','l','0'};
String sChar = new String(a);
//④ String(char[] value, int offset, int count) 分配一个新的 String,它包含来自该字符数组参数一个子数组的字符。offset 参数是子数组第一个字符的索引,count 参数指定子数组的长度。该子数组的内容已被赋值,后续对字符数组的修改不会影响新创建的字符串
char a[]={'H','e','l','l','o'};
String sChar=new String(a,1,4);
...
String
提供的构造方法很多,文章只列举常用的,其余的可自行查找Java帮助文档。帮助文档的使用参照下一小节
http://www.oracle.com/java/technologies/downloads/
下载完解压后目录如下
① 双击index.html打开
② 搜索框中输入关键字String
找到java.lang包下的String
③ 查看String
类的帮助信息
String
类的基本信息
String
类public/protected 修饰的属性
String
类public/protected 修饰所有构造器
String
类public/protected 修饰所有构造器
如果小伙伴看英文比较吃力,这里也提供了中文帮助文档下载地址(文档包含jdk1.6~jdk10 的帮助文档)。
注: 中文帮助文档采用的是工具翻译的,有些地方可能不准确,请结合着官方英文文档查看
链接:http://pan.baidu.com/s/1Rh-o1i-LCjEPNB4EyO9FrQ
提取码:7kms
String 转换 int 时,String 的值一定是整数,否则会报数字转换异常(java.lang.NumberFormatException)
Integer.parseInt(String s)
Integer.valueOf(String s)
public class StringTest {
public static void main(String[] args) {
System.out.println(Integer.parseInt("123"));
System.out.println(Integer.valueOf("345"));
}
}
//输出结果为
123
345
String 转换 Double、Float 时,String 的值一定是浮点类型,否则会报数字转换异常(java.lang.NumberFormatException)
Double.parseDouble(String s)
Double.valueOf(String s)
Float.parseFloat(String s)
Float.valueOf(String s)
public class StringTest {
public static void main(String[] args) {
System.out.println(Double.parseDouble("12.45"));
System.out.println(Double.valueOf("12.45"));
System.out.println(Float.parseFloat("25.68"));
System.out.println(Float.valueOf("25.68"));
}
}
//输出结果为
12.45
12.45
25.68
25.68
使用第三种方法相对第一第二种耗时比较大。在使用第一种 valueOf() 方法时,注意 valueOf 括号中的值不能为空,否则会报空指针异常(NullPointerException)
String.valueOf( Integer i)
Integer.toString( Integer i)
"" + Integer i
public class StringTest {
public static void main(String[] args) {
System.out.println(String.valueOf(123));
System.out.println(Integer.toString(345));
System.out.println(456 + "");
}
}
//输出结果为
123
345
456
使用第三种方法相对第一第二种耗时比较大。在使用第一种 valueOf() 方法时,注意 valueOf 括号中的值不能为空,否则会报空指针异常(NullPointerException)
String.valueOf(Double d)
Double.toString(Double d)
"" + Double d
String.valueOf(Float d)
Float.toString(Float d)
"" + Float f
public class StringTest {
public static void main(String[] args) {
public class StringTest {
public static void main(String[] args) {
System.out.println(String.valueOf(20.48d));
System.out.println(Double.toString(20.48d));
System.out.println(20.48d + "");
System.out.println(String.valueOf(10.24f));
System.out.println(Float.toString(10.24f));
System.out.println(10.24f + "");
}
}
}
}
//输出结果为
20.48
20.48
20.48
10.24
10.24
10.24
str1+str2
public class StringTest {
public static void main(String[] args) {
System.out.println("微信公众号:" + "XiezhrSpace");
}
}
//输出
微信公众号:XiezhrSpace
str1.concat(str2)
public class StringTest {
public static void main(String[] args) {
System.out.println("个人博客:".concat("www.xiezhrspace.cn"));
}
}
// 输出
个人博客:www.xiezhrspace.cn
str.length()
public class StringTest {
public static void main(String[] args) {
String str1 = "公众号:XiezhrSpace";
String str2 = "个人博客:www.xiezhrspace.cn";
System.out.println("str1长度:"+str1.length());
System.out.println("str2长度:"+str2.length());
}
}
//输出
str1长度:15
str2长度:23
str.toLowerCase()
将字符串中的字母全部转换为小写,非字母不受影响str.toUpperCase()
将字符串中的字母全部转换为大写,非字母不受影响public class StringTest {
public static void main(String[] args) {
String str ="Hello World!";
System.out.println("原始字符串:"+str);
System.out.println("使用toLowerCase() 方法之后为:" + str.toLowerCase());
System.out.println("使用toUpperCase() 方法之后为:" + str.toUpperCase());
}
}
//输出
原始字符串:Hello World!
使用toLowerCase() 方法之后为:hello world!
使用toUpperCase() 方法之后为:HELLO WORLD!
字符串中存在的首尾空格一般情况下都没有任何意义,如字符串“ Hello ”,但是这些空格会影响到字符串的操作,如连接字符串或比较字符串等,所以应该去掉字符串中的首尾空格,这需要使用 String 类提供的 trim() 方法
str.trim()
str.replace((char) 12288, ' '); str.trim()
注意:
trim()
只能去掉字符串中前后的半角空格(英文空格),而无法去掉全角空格(中文空格)。replace()
方法//字符串中的每个空格占一个位置,直接影响了计算字符串的长度
public class StringTest {
public static void main(String[] args) {
String str = " hello ";
System.out.println(str.length()); // 输出 7
System.out.println(str.trim().length()); // 输出 5
}
}
//输出
7
5
//去除全角空格实例
public class StringTest {
public static void main(String[] args) {
String str = " hello";
//带有全角的空格没有去掉
System.out.println(str.trim().length());
//去除全角空格
System.out.println(str.replace((char) 12288, ' ').trim().length());
}
}
//输出
6
5
substring(int beginIndex)
//指定位置截取到字符串结尾substring(int beginIndex,int endIndex)
是截取指定范围的内容substring() 方法是按字符截取,而不是按字节截取
①substring(int beginIndex)
//调用时,括号中是需要提取字符串的开始位置,方法的返回值是提取的字符串
public class StringTest {
public static void main(String[] args) {
String str = "关注XiezhrSpace公众号";
System.out.println(str.substring(2));
}
}
//输出
XiezhrSpace公众号
②substring(int beginIndex,int endIndex)
//方法中的 beginIndex 表示截取的起始索引,截取的字符串中包括起始索引对应的字符;
//endIndex 表示结束索引,截取的字符串中不包括结束索引对应的字符
public class StringTest {
public static void main(String[] args) {
String str = "关注XiezhrSpace公众号";
System.out.println(str.substring(2,13));
}
}
//输出
XiezhrSpace
注意:, 对于开始位置 beginIndex, Java 是基于字符串的首字符索引为 0 处理的,但是对于结束位置 endIndex,Java 是基于字符串的首字符索引为 1 来处理的 。具体如下图所示
str.split(String sign)
str.split(String sign,int limit)
str 为需要分割的目标字符串。
sign 为指定的分割符,可以是任意字符串。
limit 表示分割后生成的字符串的限制个数,如果不指定,则表示不限制,直到将整个目标字符串完全分割为止。
public class StringTest {
public static void main(String[] args) {
String str = "苹果,香蕉,猕猴桃,梨";
String arr1[] = str.split(",");
String arr2[] = str.split(",",3);
System.out.println("①分割所有水果");
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr1[i]);
}
System.out.println("②分割取前两个水果,其余不分割");
for (int i = 0; i < arr2.length; i++) {
System.out.println(arr2[i]);
}
}
}
//输出
①分割所有水果
苹果
香蕉
猕猴桃
梨
②分割取前两个水果,其余不分割
苹果
香蕉
猕猴桃,梨
对于 .
,|
,$
,&
,*
, .
,^
等转义字符,程序中使用时,需要加上\\
。 实例如下
public class StringTest {
public static void main(String[] args) {
String str1 = "苹果|香蕉|猕猴桃|梨";
String str2 = "黄色$橙色$红色$白色";
String arr1[] = str1.split("\\|");
String arr2[] = str2.split("\\$");
System.out.println("分割以|分割的水果:");
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr1[i]);
}
System.out.println("分割以$为分隔符的颜色:");
for (int i = 0; i < arr2.length; i++) {
System.out.println(arr2[i]);
}
}
}
//输出结果
分割以|分割的水果:
苹果
香蕉
猕猴桃
梨
分割以$为分隔符的颜色:
黄色
橙色
红色
白色
//多层分隔符解析
public class StringTest {
public static void main(String[] args) {
String str = "xiezhr相关信息^个人公账号|XiezhrSpace$个人博客|www.xiezhrspace.cn";
String arr1[] = str.split("\\^");
String arr2[] = arr1[1].split("\\$");
String arr3[] ={};
System.out.println(arr1[0]);
for (int i = 0; i < arr2.length; i++) {
arr3= arr2[i].split("\\|");
for (int i1 = 0; i1 < arr3.length; i1++) {
System.out.println(arr3[i1]);
}
}
}
}
//输出
xiezhr相关信息
个人公账号
XiezhrSpace
个人博客
www.xiezhrspace.cn
str.replace(char oldChar, char newChar)
将目标字符串中的指定字符(串)替换成新的字符(串)
str.replaceFirst(String regex, String replacement)
将目标字符串中匹配某正则表达式的第一个子字符串替换成新的字符串
str.replaceAll(String regex, String replacement)
将目标字符串中匹配某正则表达式的所有子字符串替换成新的字符串
public class StringTest {
public static void main(String[] args) {
String str1 ="个人公众号:XiezhrSpace";
String str2 ="xiezhr love programming";
System.out.println("原始字符串:" + str1);
System.out.println("替换后:"+str1.replace(":", "|"));
System.out.println("原始字符串:" + str2);
System.out.println("替换后:"+str2.replace("programming", "anime"));
}
}
//输出
原始字符串:个人公众号:XiezhrSpace
替换后:个人公众号|XiezhrSpace
原始字符串:xiezhr love programming
替换后:xiezhr love anime
public class StringTest {
public static void main(String[] args) {
String str ="中国移动:http://www.10086.cn/ 10086:http://www.10086.cn/";
System.out.println("匹配成功:");
System.out.println(str.replaceFirst("10086", "xiezhrspace"));
System.out.println("未匹配成功:");
System.out.println(str.replaceFirst("mobile", "xiezhrspace"));
}
}
//输出
匹配成功:
中国移动:http://www.xiezhrspace.cn/ 10086:http://www.10086.cn/
未匹配成功:
中国移动:http://www.10086.cn/ 10086:http://www.10086.cn/
public class StringTest {
public static void main(String[] args) {
String str ="中国移动:http://www.10086.cn/ 10086:http://www.10086.cn/";
System.out.println("匹配成功:");
System.out.println(str.replaceAll("10086", "xiezhrspace"));
System.out.println("未匹配成功:");
System.out.println(str.replaceAll("mobile", "xiezhrspace"));
}
}
//输出
匹配成功:
中国移动:http://www.xiezhrspace.cn/ xiezhrspace:http://www.xiezhrspace.cn/
未匹配成功:
中国移动:http://www.10086.cn/ 10086:http://www.10086.cn/
str1.equals(str2)
str1.equalsIgnoreCase(str2)
str1.compareTo(str2);
逐个地比较两个字符串的每个字符是否相同。如果两个字符串具有相同的字符和长度,它返回 true,否则返回 false。字符大小写不同,返回false
public class StringTest {
public static void main(String[] args) {
String str1 ="xiezhr";
String str2 = new String("xiezhr");
String str3 = "XIEZHR";
System.out.println("str1与str2比较结果:" + str1.equals(str2));
System.out.println("str1与str3比较结果:" + str1.equals(str3));
}
}
//输出结果
str1与str2比较结果:true
str1与str3比较结果:false
== 比较引用地址是否相同,equals() 比较字符串的内容是否相同
public class StringTest {
public static void main(String[] args) {
String str1 ="xiezhr";
String str2 = new String("xiezhr");
System.out.println("使用equals方法比较的结果:");
System.out.println(str1.equals(str2));
System.out.println("使用==比较的结果:");
System.out.println(str1 == str2);
}
}
//输出
使用equals方法比较的结果:
true
使用==比较的结果:
false
字符串与指定的对象比较,不考虑大小写
public class StringTest {
public static void main(String[] args) {
String str1 ="xiezhr";
String str2 ="XIEZHR";
String str3 = new String("xiezhr");
System.out.println("str1与str2通过equalsIgnoreCase比较结果:" + str1.equalsIgnoreCase(str2));
System.out.println("str1与str3通过equalsIgnoreCase比较结果:" + str1.equalsIgnoreCase(str3));
}
}
//输出
str1与str2通过equalsIgnoreCase比较结果:true
str1与str3通过equalsIgnoreCase比较结果:true
基于字符串各个字符的 Unicode 值,按字典顺序(ASCII码顺序)比较两个字符串的大小
如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的长度差值(ASCII码差值)
如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,以此类推,直至不等为止,返回该字符的ASCII码差值
如果两个字符串不一样长,可对应字符又完全一样,则返回两个字符串的长度差值
compareToIgnoreCase方法可以忽略大小写
public class StringTest {
public static void main(String[] args) {
String str1 ="xiezhr";
String str2 ="XIEZHR";
String str3 = new String("xiezhr");
String str4 = "xiezhr";
String str5 ="xiezhrspace";
System.out.println(str1.compareTo(str2));
System.out.println(str1.compareTo(str3));
System.out.println(str1.compareTo(str4));
System.out.println(str1.compareTo(str5));
System.out.println(str1.compareToIgnoreCase(str2));
}
}
//输出
32
0
0
-5
0
字符串本质上是由一个个字符组成的字符数组,因此它也有索引,索引跟数组一样从零开始。charAt() 方法可以在字符串内根据指定的索引查找字符
public class StringTest {
public static void main(String[] args) {
String str ="www.xiezhrspace.cn";
System.out.println(str.charAt(0));
System.out.println(str.charAt(4));
System.out.println(str.charAt(5));
System.out.println(str.charAt(12));
}
}
//输出
w
x
i
a
①public int indexOf(int ch): 返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1
②public int indexOf(int ch, int fromIndex): 返回从 fromIndex 位置开始查找指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1
③int indexOf(String str): 返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1
④int indexOf(String str, int fromIndex): 返回从 fromIndex 位置开始查找指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1
public class StringTest {
public static void main(String[] args) {
String str ="XiezhrSpace";
System.out.println(str.indexOf("e"));
System.out.println(str.indexOf("pa"));
System.out.println(str.indexOf("e", 4));
}
}
//输出
2
7
10
用于返回字符(串)在指定字符串中最后一次出现的索引位置,如果能找到则返回索引值,否则返回 -1
lastlndexOf 方法的四种形式
public int lastIndexOf(int ch)
: 返回指定字符在目标字符串中最后一次出现处的索引,如果指定字符串中没有指定的字符,返回 -1。
public int lastIndexOf(int ch, int fromIndex)
: 返回指定字符在目标字符串中最后一次出现处的索引,从指定的索引处开始进行反向搜索,如果目标字符串中没有指定字符,返回 -1。
public int lastIndexOf(String str)
: 返回指定子字符串在目标字符串中最后一次出现处的索引,如果目标字符串中没有指定字符,返回 -1。
public int lastIndexOf(String str, int fromIndex)
: 返回指定子字符串在目标符串中最后一次出现处的索引,从指定的索引开始反向搜索,如果目标字符串中没有指定的字符,返回 -1。
public class StringTest {
public static void main(String[] args) {
String str = new String("个人博客:www.xiezhrspace.cn");
String str1 = "xiezhr";
String str2 = "cn";
System.out.print("查找指定字符 w 在目标字符str中最后出现的位置 :" );
System.out.println(str.lastIndexOf( 'w' ));
System.out.print("从第2个位置查找指定字符 w在目标字符串str最后出现的位置 :" );
System.out.println(str.lastIndexOf( 'w', 14 ));
System.out.print("指定子字符串 str1 在目标字符串str最后出现的位置:" );
System.out.println( str.lastIndexOf( str1 ));
System.out.print("从第7个位置开始查找指定字符串 str1在目标字符串中最后出现的位置 :" );
System.out.println( str.lastIndexOf( str1, 7 ));
System.out.print("指定字符串 str2 在目标字符串str最后出现的位置 :" );
System.out.println(str.lastIndexOf( str2 ));
}
}
//输出
查找指定字符 w 在目标字符str中最后出现的位置 :7
从第2个位置查找指定字符 w在目标字符串str最后出现的位置 :7
指定子字符串 str1 在目标字符串str最后出现的位置:9
从第7个位置开始查找指定字符串 str1在目标字符串中最后出现的位置 :-1
指定字符串 str2 在目标字符串str最后出现的位置 :21
查找字符串中是否包含目标字符(串)
public class StringTest {
public static void main(String[] args) {
String str = "xiezhrspace";
System.out.println(str.contains("xiezhr"));
System.out.println(str.contains("cn"));
}
}
//输出
true
false
按指定的字符集将字符串编码为 byte 序列,并将结果存储到一个新的 byte 数组中
默认字符集将字符串编码为 byte 序列,并将结果存储到一个新的 byte 数组中
import java.io.UnsupportedEncodingException;
public class StringTest {
public static void main(String[] args) {
String str = "网名xiezhr";
byte[] bytes1 = null;
byte[] bytes2 = null;
byte[] gbks = null;
byte[] bytes = str.getBytes();
try {
bytes1 = str.getBytes("utf-8");
bytes2 = str.getBytes("ISO-8859-1");
gbks = str.getBytes("GBK");
}catch (UnsupportedEncodingException e){
System.out.println("不支持的字符集"+e.getMessage());
}
System.out.println("按默认字符集将字符串转byte数组:");
for (byte aByte : bytes) {
System.out.print(aByte+" ");
}
System.out.println();
System.out.println("按utf-8编码将字符串转bytes数组:");
for (byte b1 : bytes1) {
System.out.print(b1+" ");
}
System.out.println();
System.out.println("按ISO-8859-1编码将字符串转bytes数组:");
for (byte b2 : bytes2) {
System.out.print(b2+" ");
}
System.out.println();
System.out.println("按GBK编码将字符串转bytes数组:");
for (byte gbk : gbks) {
System.out.print(gbk+" ");
}
}
}
//输出
按默认字符集将字符串转byte数组:
-25 -67 -111 -27 -112 -115 120 105 101 122 104 114
按utf-8编码将字符串转bytes数组:
-25 -67 -111 -27 -112 -115 120 105 101 122 104 114
按ISO-8859-1编码将字符串转bytes数组:
63 63 120 105 101 122 104 114
按GBK编码将字符串转bytes数组:
-51 -8 -61 -5 120 105 101 122 104 114
将字符从字符串复制到目标字符数组
public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
public class StringTest {
public static void main(String[] args) {
String Str1 = new String("www.xiezhrspace.cn");
char[] Str2 = new char[15];
try {
Str1.getChars(4, 15, Str2, 3);
System.out.print("复制的字符串为:" );
System.out.println(Str2 );
} catch( Exception e) {
System.out.println(e.getMessage());
}
}
}
//输出,新字符串Str2 是从第三位复制的
复制的字符串为: xiezhrspace
将字符数组中指定字符复制到目标字符
① public static String copyValueOf(char[] data)
② public static String copyValueOf(char[] data, int offset, int count)
public class StringTest {
public static void main(String[] args) {
char[] str1 ={'w','w','w',':','x','i','e','z','h','r','s','p','a','c', 'e','.','c','n' };
String str2 = null;
String str3 = null;
System.out.println(str2.copyValueOf(str1));
System.out.println(str3.copyValueOf(str1, 4, 11));
}
}
//输出
www:xiezhrspace.cn
xiezhrspace
一个比较容易混淆的知识点。空串是长度为0的字符串,null表示没有引用任何对象
/**
字符串对象与null的值不相等,且内存地址也不相等;
空字符串对象与null的值不相等,且内存地址也不相等;
new String()创建一个字符串对象的默认值为""
**/
public class StringTest {
public static void main(String[] args) {
String str1 = new String();
String str2 = null;
String str3 = "";
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
System.out.println(str2==str3);
System.out.println(str3.equals(str2));
System.out.println(str1==str3);
System.out.println(str1.equals(str3));
}
}
//输出
false //内存地址的比较,返回false
false //值的比较,返回false
false //内存地址的比较,返回false
false //值的比较,返回false
false //内存地址的比较,返回false
true //值的比较,返回true
执行下面代码,会抛出java.lang.NullPointerException 。这也是我们日常开发中经常见到的报错。
所以,字符串非空判断显得尤为重要
public class StringTest {
public static void main(String[] args) {
String str = null;
str.length();
}
}
// 报空指针异常
Exception in thread "main" java.lang.NullPointerException
at StringTest.main(StringTest.java:5)
非空判断一般包含空字符串和null判断,常见的判断方法主要有以下几种
① 最多人使用的一个方法, 直观, 方便, 但效率很低
注: s==null 判断需要写在前面,要不然还是会报NullPointerException
if(!(s == null || s.equals(""))){
System.out.println("业务逻辑代码");
};
//或者
if(str !=null &&!"".equals(str)){
System.out.println("业务逻辑代码");
}
②比较字符串长度, 效率比第一种方法高
if(!(str==null||str.length()==0)){
System.out.println("业务逻辑代码");
}
if(str!=null&&str.length()!=0){
System.out.println("业务逻辑代码");
}
}
③ Java SE 6.0 才开始提供的方法, 效率和方法②差不多, 但出于兼容性考虑, 推荐使用方法二
if(!(str==null||str.isEmpty())){
System.out.println("业务逻辑代码");
}
if(str!=null&& !str.isEmpty()){
System.out.println("业务逻辑代码");
}
与java.lang这个包作用类似,Commons Lang 包是由apache 提供的jar包。这一组API也是提供一些基础的、通用的操作和处理
官方下载地址:http://commons.apache.org/proper/commons-lang/download_lang.cgi
maven 包引用
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
commons-lang3 提供了很多常用的基础操作处理,包括字符串、日期、数组等等。
由于本文主要是说字符串String,所以我们只对其中的StringUtils的isBlank与isEmpty 方法说明。
判断字符串为空,一般会遇到 null 、"" 、字符串中间有空格 " ", 下面是两个方法处理结果
① public static boolean isBlank(String str)
import org.apache.commons.lang3.StringUtils;
public class StringTest {
public static void main(String[] args) {
System.out.println(StringUtils.isBlank(null));
System.out.println(StringUtils.isBlank(""));
System.out.println(StringUtils.isBlank(" "));
System.out.println(StringUtils.isBlank(" "));
System.out.println(StringUtils.isBlank("\t \n \f \r"));
System.out.println(StringUtils.isBlank("\\"));
System.out.println(StringUtils.isBlank("公众号XiezhrSpace"));
System.out.println(StringUtils.isBlank(" 公众号XiezhrSpace "));
}
}
//输出
true
true
true
true
true
false
false
false
② public static boolean isEmpty(String str)
import org.apache.commons.lang3.StringUtils;
public class StringTest {
public static void main(String[] args) {
System.out.println(StringUtils.isEmpty(null));
System.out.println(StringUtils.isEmpty(""));
System.out.println(StringUtils.isEmpty(" ")); //StringUtils 中空格作非空处理
System.out.println(StringUtils.isEmpty(" "));
System.out.println(StringUtils.isEmpty("\t \n \f \r"));
System.out.println(StringUtils.isEmpty("\\"));
System.out.println(StringUtils.isEmpty("公众号XiezhrSpace"));
System.out.println(StringUtils.isEmpty(" 公众号XiezhrSpace "));
}
}
//输出
true
true
false
false
false
false
false
false
当然了,StringUtils工具类还有对应的isNotBlank和isNotEmpty 方法,意思是不为空。
具体区别可以参考http://blog.csdn.net/itchuxuezhe_yang/article/details/89966303 这篇博文,写的还是挺好的。
String
类是不可变类,即一旦一个 String 对象被创建以后,包含在这个对象中的字符序列是不可改变的;StringBuffer
和 StringBuilder
支持可变字符串;StringBuilder
和 StringBuffer
功能基本相似,方法也差不多;StringBuffer
是线程安全的,而 StringBuilder
则没有实现线程安全功能;StringBuilder
由于没有实现线程安全,所以效率要比StringBuffer
高;public class StringTest {
public static void main(String[] args) {
StringBuilder sbd = new StringBuilder();
StringBuffer sbf = new StringBuffer();
String str1 ="xiezhr个人信息:";
String str2 ="博客:www.xiezhrspace.cn";
String str3 ="公众号:XiezhrSpace";
String str =str1+str2+str3;
sbd.append(str1);
sbd.append(str2);
sbd.append(str3);
sbf.append(str1);
sbf.append(str2);
sbf.append(str3);
System.out.println("String拼接字符串:");
System.out.println(str);
System.out.println("StringBuilder拼接字符串:");
System.out.println(sbd.toString());
System.out.println("StringBuffer拼接字符串:");
System.out.println(sbf.toString());
}
}
//输出
String拼接字符串:
xiezhr个人信息:博客:www.xiezhrspace.cn公众号:XiezhrSpace
StringBuilder拼接字符串:
xiezhr个人信息:博客:www.xiezhrspace.cn公众号:XiezhrSpace
StringBuffer拼接字符串:
xiezhr个人信息:博客:www.xiezhrspace.cn公众号:XiezhrSpace
append(String s)
//追加一个字符串
reverse()
//将字符串反转
delete(int start, int end)
//删除指定位置字符串
insert(int offset, String str)
//在指定位置插入字符串
replace(int start, int end, String str)
//将指定位置字符串替换为新字符串
public class StringTest {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("XiezhrSpace!!!");
System.out.println(sb);
sb.append("m");
System.out.println(sb);
sb.insert(0,"公众号:");
System.out.println(sb);
sb.delete(16,19);
System.out.println(sb);
sb.replace(15,16,"**");
System.out.println(sb);
sb.reverse();
System.out.println(sb);
}
}
//输出
XiezhrSpace!!!
XiezhrSpace!!!m
公众号:XiezhrSpace!!!m
公众号:XiezhrSpace!
公众号:XiezhrSpace**
**ecapSrhzeiX:号众公
本期到此结束,我们下期再见~(●'◡'●)
1.电动自行车电动自行车上世纪80年代末发源于日本,最初是为了减轻骑行者的劳累感,采用的是动力辅助系统PAS(PowerAssistSystem)。它的一个比较关键的部件是力矩传感器,通过感知脚踏力量的同时,调节电机输出力矩的大小,从而使骑行者省力。电动助力车的电机,一般采用中置的方式,就是安装在自行车中部脚踏的牙盘,然后通过减速齿轮和链条传动给后轮。这种自行车平衡性和操控性都比较好,但是结构复杂,成本高。助力车进入国内后由于高昂的价格没有普及,国产厂家经过多年研发逐渐走出了自己的道路。国内目前主流都是采用下图中这种轮毂电机,它把电机和车轮做在了一起,结构简单,成本低。当然这种电机需要厂家在抗震动和防水性能上多下功夫。我们看一下这种电动自行车的主要部件,看看它们是怎么工作,还有用到了哪些嵌入式设备吧。2.主要组成部件除了车架外,一辆电动自行车主要的部件有:电机,控制器,转把,闸把,助力传感器,灯具,仪表,电池,充电器等。其中电机及其控制器是最为核心的部分,它的性能直接决定了自行车的骑行体验。电机:最初用的有刷电机,现在已经逐渐被淘汰掉了。后来居上的是无刷电机,以其噪声小,寿命长的优点得
实际场景有一个集合:Listusers=getList();//从数据库查询的用户集合现在想获取User的身份证号码;在后续的逻辑处理中要用;常用的方法我们大家都知道,用for循环,Listidcards=newArrayList();//定义一个集合来装身份证号码for(inti=0;i<users.size();i++){idcards.add(users.get(i).getIdcard());}这种方法要写好几行代码,有没有简单点的,有,java8API能一行搞定:Listidcards=users.stream().map(User::getIdcard).collect(Collectors.toList())解释下一这行代码:users:一个实体类的集合,类型为List User:实体类 getIdcard:实体类中的get方法,为获取User的idcardstream()优点无存储。stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/Ochannel等。 为函数式编程而生。对stream的任何修改都不会修改背后的数据源
目录前言版本约定正文最简使用Demo组合方法自动绑定JsonTokenJsonParser的Feature底层I/O流相关AUTO_CLOSE_SOURCE(true)支持非标准格式ALLOW_COMMENTS(false)ALLOW_YAML_COMMENTS(false)ALLOW_UNQUOTED_FIELD_NAMES(false)ALLOW_SINGLE_QUOTES(false)~~ALLOW_UNQUOTED_CONTROL_CHARS(false)~~控制字符非控制字符~~ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER(false)~~~~ALLOW_NUMERIC_LEADING_ZEROS(false)~~~~ALLOW_LEADING_DECIMAL_POINT_FOR_NUMBERS(false)~~~~ALLOW_NON_NUMERIC_NUMBERS(false)~~~~ALLOW_MISSING_VALUES(false)~~~~ALLOW_TRAILING_COMMA(false)~~校验相关STRICT_DUPLICATE
原文链接:http://tecdat.cn/?p=5334几何布朗运动(GBM)是模拟大多数依赖某种形式的路径依赖的金融工具的标准主力。虽然GBM基于有根据的理论,但人们永远不应忘记它的最初目的-粒子运动的建模遵循严格的正态分布脉冲。基本公式由下式给出:标准维纳过程代表创新。在对气体进行建模时效果很好,在财务建模方面存在一些严重的缺陷。问题是维纳过程有两个非常严格的条件:a)创新通常是分布式的,平均零和方差为tb)创新是独立的现在,至少有一些金融市场数据暴露的人都知道股票回报不满足第一个条件,有时甚至不满足第二个条件。普遍的共识是,股票收益是扭曲的,是有效的,并且尾巴不均匀。虽然股票收益趋于收敛于正常分布且频率递减(即月收益率比日收益率更正常),但大多数学者会同意t分布或Cauchy分布更适合收益。然而,在实践中,大多数人在模拟布朗运动时只是采用正态分布,并接受由此产生的资产价格不是100%准确。另一方面,我不满足于这种半解决方案,我将在下面的例子中展示盲目信任GBM的成本是多少。我提出了一种伪布朗方法,其中随机创新是从经验回报的核密度估计而不是假设的正态分布中采样的。这种方法的好处在
说在文前本文内容是基于Centos7、HDP3.0.0、HBase2.0.0、Python2.7环境下,其他环境的童鞋选择性进行参考。Thrift安装在HBase服务节点上即可。HBase实现了两套ThriftServer服务,有两种ThriftIDL文件,提供了两套数据结构:第一套有TCell,ColumnDescriptor,TRegionInfo等,它的API比较全,它不仅有读写API,同时也有创建删除等API;第二套有TTimeRange,TColumn,TColumnValue等,它更加接近HBaseJavaAPI的调用方式,但是它的API比较少,只有读写表的API),它们最后都是通过HBaseClient的JavaAPI来完成操作。安装Thrift安装依赖包yuminstall-yautomakelibtoolflexbisonpkgconfiggcc-c++libevent-develzlib-develpython-develruby-developenssl-devel复制安装boost(CentOS7必做)wgethttps://dl.bintray.com/boo
Java程序员面试的时候会面临各种五花八门的问题,你的第一反应、思维逻辑、思考方法,专业水平决定了企业对你的评价和你的薪资水准,但是除了专业以外还有一些你需要避免出现错误的注意事项,如果很好的避免了,就能帮你在面试的时候多几分胜算,俗话说的好“机会总是留给有准备的人”动力节点Java学院为大家整理了一些面试Java编程常见错误,希望能帮助大家: 不准备经历方面的问题 一定要多花时间回忆你过去的相关经历,包括你参与的项目,你遇到的各种困难,以及如何解决的这些难题。你的回答会影响面试官对你Java技术能力的印象,所以一定要回顾和整理一下你过去的项目经历。 依赖于事先背诵的答案 试图通过事先背诵一些答案,然后在面试派上用场是一个非常不好的方法。首先,恰好能用上你背的答案的概率微乎其微,其次,这样的准备会花费你大量的时间和精力,而没有真正能力上的提高。记住,你在现场发挥的越好、越真实,你身上的价值就越高。 缺乏对面试的模拟 这是很显然的,做很多事情前你都要准备和模拟一下,防止意外的情况发生。程序员面试也是一样的,如果你正在准备一个程序员面试,你应该找一些可以和你一起准备的程序员,你
Java集合是java提供的工具包,包含了常用的数据结构:集合、链表、队列、栈、数组、映射等。Java集合工具包位置是java.util.*Java集合主要可以划分为4个部分:List列表、Set集合、Map映射、工具类(Iterator迭代器、Enumeration枚举类、Arrays和Collections)。Java集合工具包框架图(如下): 1Collection是一个接口,是高度抽象出来的集合,它包含了集合的基本操作和属性。Collection包含了List和Set两大分支。 (01)List是一个有序的队列,每一个元素都有它的索引。第一个元素的索引值是0。 List的实现类有LinkedList,ArrayList,Vector,Stack。(02)Set是一个不允许有重复元素的集合。 Set的实现类有HastSet和TreeSet。HashSet依赖于HashMap,它实际上是通过HashMap实现的;TreeSet依赖于TreeMap,它实际上是通过TreeMap实现的。2Map是一个映射接口,即<key-value>键值对。Map中的每一个元素包含“一个
今天做键上线,得空总结一下。前两天和同事一块看一个夜维程序执行异常慢的问题,是一个比较典型的问题,同时也是一个比较头疼的问题。背景描述:1.当天上线了一个夜维程序,逻辑很简单,就是执行类似deletefromtablewhererownum<=10000andr_date>='2015-06-01'andr_date<='2015-06-02';,每次删除10000条某天的过期数据,table表数据量大约2000万,每天删除量大约是几十万,r_date字段类型是VARCHAR2,但含义是日期,实际这用的是字符串比较,代替了日期的比较。(11g的库)2.现象是程序开始执行后,大约15分钟,都没有结束,上线人员担心有问题,就人工终止了改程序。3.临时改了下程序,另外一个k_date字段代替r_date,同样的SQL,很快就执行完了。(从逻辑上,可用k_date代替r_date)问题排查:1.从现象看,15分钟,一个带where条件的delete语句没有执行完,换了一个字段后,很快就执行完成,说明很有可能前者没有使用或者用了错误的索引
作者:尹非凡无论是编程开发还是互联网创业,时下最火爆的方向大概就是微信小程序了。据统计,微信上线的小程序数量已经超过58万个,小程序后台开发工具的使用人数也已经超过100万。整个2017年,小程序带动的就业人口达到104万。会做小程序开发,或者了解一些小程序入门知识,将是我们赶上这一波互联网新机遇所必备的「防身技」。春江水暖鸭先知,相比较其它机构,最先感受到变化的是互联网在线培训课堂。知晓程序发现,目前已有腾讯课堂、优达学城、网易云课堂3家提供微信小程序开发课程。到底这3大平台各有何特点?它们分别适合哪类学习者?以下,知晓程序将为你带来最全的试学横评。3大课程初识腾讯课堂:「NEXT学位x微信官方微信小程序开发」课程。2018年5月7日,腾讯课堂联手微信团队联合推出。目前,腾讯课堂是中国最大的职业教育在线平台,此次推出的系列课程,由平台明星级教学栏目「腾讯课堂NEXT学位」研发,作为腾讯自研品牌,集结了腾讯专家亲自编排的课程内容。腾讯课堂的小程序课程具有较为完整的教学规划,强调系统性理论学习与上手实践结合,适合全面深入地进行小程序学习。采取讲师授课与专家互动相结合,建立相对严格的学习过
简介和安装 Node.js与MySQL交互操作有很多库,具体可以在 https://www.npmjs.org/search?q=mysql 查看。 我选择了felixge/node-mysql,用的人比较多,先随大溜看看它的使用,暂时没有太过纠结于各库之间的执行性能问题,对其它库有研究的筒子也可以分享一下性能要求较高时的选择^_^! 地址:https://github.com/felixge/node-mysqlhttps://www.npmjs.org/package/mysqlThisisanode.jsdriverformysql.ItiswritteninJavaScript,doesnotrequirecompiling,andis100%MITlicensed 用纯JavaScript实现。MIT100%!安装npminstallmysql 注意:安装前先把目录cd到node.exe所在目录下,这样执行安装命令时,会找到目录下node_modules,并安装在此目录下,否则使用mysql时,你会出现 Error:Cannotfindmodule'my
转眼新的一年又来了,趁着这段时间总结下2017这一年的工作经验,避免重复踩坑。MOB数据采集平台升级也快经历了半年时间,目前重构后线上运行稳定,在这过程中挖过坑,填过坑,为后续业务的实时计算需求打下了很好的基础。一、升级与重构的原因旧有架构上图为旧有架构,主要服务于Hadoop2.x离线计算(T+1)以及Spark的实时计算(T+0),但在数据采集、数据流动、作业调度以及平台监控等几个环节存在的一些问题和不足。数据采集:数据采集平台与数据统计分析系统分离,不能统一管理数据流向,并且消耗服务资源数据收集接口众多,数据格式杂乱:基本每个业务都有自己的上报接口,存在较大的重复开发成本,不能汇总上报,消耗客户端资源,以及网络流量,每个接口收集数据项和格式不统一,加大后期数据统计分析难度。Flume采集单一channel的使用,可能导致高峰期队列堵塞,数据丢失的问题平台监控:只有系统层面的监控,数据平台方面的监控等于空白针对以上问题,结合在大数据中,数据的时效性越高,数据越有价值的理念,因此,开始大重构数据采集平台架构。二、升级后的架构设计这张图是升级后的数据采集架构图,从图中可以了解到大数据采
一、class类 1)什么是类? 类是puppet中命名的代码模块,常用于定义一组通用目标的资源,可在puppet全局调用; 类可以被继承,也可以包含子类; 具体定义的语法如下: classNAME{ ...puppetcode... } 复制 其中,在我们定义的时候,需要注意的是: 类的名称只能以小写字母开头,可以包含小字字母、数字和下划线。 每个类都会引入一个新的变量scope,这意味着在任何时候访问类中的变量时,都得使用其完全限定名称。 不过,在本地scope可以重新为topscope中的变量赋予一个新值。 下面,我们来看一个简单的例子: vimclass1.pp classredis{ #定义一个类 package{'redis': ensure=>installed, }-> file{'/etc/redis.conf': ensure=>file, source=>'/root/manifests/file/redis.conf', owner=>'redis',
一、GC的必要性 1、应用程序对资源操作,通常简单分为以下几个步骤:为对应的资源分配内存→初始化内存→使用资源 →清理资源 →释放内存。 2、应用程序对资源(内存使用)管理的方式,常见的一般有如下几种: [1]手动管理:C,C++ [2]计数管理:COM [3]自动管理:.NET,Java,PHP,GO… 3、但是,手动管理和计数管理的复杂性很容易产生以下典型问题: [1]程序员忘记去释放内存 [2]应用程序访问已经释放的内存 产生的后果很严重,常见的如内存泄露、数据内容乱码,而且大部分时候,程序的行为会变得怪异而不可预测,还有AccessViolation等。 .NET、Java等给出的解决方案,就是通过自动垃圾回收机制GC进行内存管理。这样,问题1自然得到解决,问题2也没有存在的基础。 总结:无法自动化的内存管理方式极容易产生bug,影响系统稳定性,尤其是线上多服务器的集群环境,程序出现执行时bug必须定位到某台服务器然后dump内存再分析bug所在,极其打击开发人员编程积极性,而且源源不断的类似bug让人厌恶。 &n
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.IO;usingSystem.Threading;usingSystem.Net;namespacereporting.temp{publicclassFTP{publicclassFtpState{privateManualResetEventwait;privateFtpWebRequestrequest;privatestringfullName;privateExceptionoperationException;stringstatusCode;stringstatusDescription;stringuserName;stringpassword;stringftpServerIP;stringfileName;publicExceptionOperationException{get{returnoperationException;}
系统要求:CentOS7.264位操作系统 安装Seafile 安装依赖环境 使用 yum 安装Python及MySQL: yuminstallpythonpython-setuptoolspython-imagingpython-ldappython-memcachedMySQL-pythonmariadbmariadb-server复制 启动MariaDB服务: sudosystemctlstartmariadb.service sudosystemctlenablemariadb.service复制 配置MySQL: /usr/bin/mysql_secure_installation复制 配置过程输入参数如截图所示,其中 Newpassword 和 Re-enternewpassword 字段都设置为 Password,其他字段一路回车使用默认值: 安装Seafile 下载Seafile安装包: wgethttps://mc.qcloudimg.com/static/archive/3d8ad
importdatetime dt='2019010103'#日期2019年1月1日3时 dts=(datetime.datetime.strptime(dt,'%Y%m%d%H')+datetime.timedelta(days=-1)).strftime('%Y%m%d%H') #将dt向前或向后调整(day表示天,hours表示表示小时,负数往前正数往后) print(dts) #2018123103复制 l1=['C1D02160000021700001','C1D02161200021700001','C1D02161200021703001','C1D02161200021706001', 'C1D02161200021709001','C1D02170000021712001','C1D02161200021712001','C1D02170000021715001', 'C1D02170000021718001','C1D02170000021721001'] #a=[[2,3],[4,1],(2,8),(2,1),(3,4)] li=sorted(l
今天刚打完一场,只做出来一道题,开错题了然后没钻出来,机房的小伙伴都切了四道题了...可能又要掉了,要继续努力了。 比较顺利的做出了ABC,然后看人数去推了F题,不过没什么结果。 然后在改代码的时候结识了白学长,:) 话说这几天好燥啊,G题其实代码挺好理解但愣是拖了两天啊。 Problem A.RegularBracketSequence 题目大意:现在给出 4 种括号依次为 "((", "()", ")(", "))",给出每种括号的数量,求所有的括号能不能构成一个合法的括号序列(所有括号都成对出现) 数据范围:1≤括号数量≤109 第二种括号显然对答案没有影响,第三种括号只要插在第一种和第四种中间就行,但第一种和第四种括号数量必须相等。 代码:只贴一行 if(cnt[1]==cnt[4]&&(cnt[1]||cnt[3]==0)){printf("1");return0;}复制 ProblemB. Discounts 题目大
从当前互联网领域的发展基本面来看,大数据和云计算都有比较广阔的发展前景,一方面产业互联网未来将为大数据和云计算提供巨大的发展空间,另一方面云计算和大数据本身也能够带动一系列新技术和新模式的创新。由于大数据是物联网发展的三个基础因素之一,所以大数据的发展对于人工智能技术的发展来说,也具有重要的意义。当前科技领域和行业领域对于人工智能的呼声都比较高,所以在人工智能领域的推动下,大数据也会得到更多的重视。相对于大数据来说,云计算技术云服务器的重要性已经得到了一定程度的体现,随着云计算逐渐进入到PaaS时代和SaaS时代,全栈云和智能云将进一步提升云计算的服务效率。在目前工业互联网快速发展的推动下,云计算对于行业领域的重要性将得到逐渐的体现,所以未来云计算的发展空间会逐渐扩大。考虑到当前云计算越来越受欢迎,当然也是因特网行业的高收入工作,很多朋友都打起了云计算的主意:有些朋友问云计算培训哪家好,有些朋友问云计算视频哪里有,当然,这些咨询都是非常必要的。每个人都提出了一个很有趣的问题,这个朋友问:云计算需要学什么课程?为何只谈这个问题?由于相对于其他问题,这一问题就变成了被动为主动的问题——有一
美丽序列 题目描述 牛牛喜欢整数序列,他认为一个序列美丽的定义是 1:每个数都在0到40之间 2:每个数都小于等于之前的数的平均值 具体地说:foreachi,1<=i<N, A[i]<=(A[0]+A[1]+...+A[i-1])/i. 3:没有三个连续的递减的数 现在给你一个序列,每个元素是-1到40,你可以将序列中的-1修改成任意的数,求你可以得到多少个美丽序列,答案对1e9+7取模 输入描述: 第一行输入一个整数n(1≤n≤40) 第二行输入n个整数复制 输出描述: 输出一个整数复制 示例1 输入 2 3-1复制 输出 4复制 示例2 输入 3 53-1 输出 2复制 示例3 输入