不知道你有没有拼接过字符串,特别是那种有多个参数,字符串比较长的情况。
比如现在有个需求:要用get请求调用第三方接口,url后需要拼接多个参数。
以前我们的请求地址是这样拼接的:
String url = "http://susan.sc.cn?userName="+userName+"&age="+age+"&address="+address+"&sex="+sex+"&roledId="+roleId;
字符串使用+号拼接,非常容易出错。
后面优化了一下,改为使用StringBuilder拼接字符串:
StringBuilder urlBuilder = new StringBuilder("http://susan.sc.cn?");
urlBuilder.append("userName=")
.append(userName)
.append("&age=")
.append(age)
.append("&address=")
.append(address)
.append("&sex=")
.append(sex)
.append("&roledId=")
.append(roledId);
代码优化之后,稍微直观点。但是看起来比较臃肿,这时可以使用String.format方法优化:
String requestUrl = "http://susan.sc.cn?userName=%s&age=%s&address=%s&sex=%s&roledId=%s";
String url = String.format(requestUrl,userName,age,address,sex,roledId);
代码的可读性,一下子提升了很多。
建议:我们平常可以使用String.format方法拼接url请求参数,日志打印等字符串。但不建议在for循环中用它拼接字符串,因为它的执行效率,比使用+号拼接字符串,或者使用StringBuilder拼接字符串都要慢一些。
String.format()函数相当于将括号内的量,按照自己的想要的格式拼接成一个字符串,然后输出。作用效果有点像C语言中的printf()函数。
常用的转换符:
1、通用浮点数:
比%f,%a长度更短的一种格式输出,显示6位有效数字,而且会进行四舍五入。
2、散列码:
不必用冗长的线性搜索技术来查找一个键,而是用一个特殊的值,名为“散列码”。散列码可以获取对象中的信息,然后将其转换成那个对象“相对唯一”的整数(int)。所有对象都有一个散列码。
代码测试:
public class StringFormatDemo {
public static void main(String[] args)
{
//%s %c
String str;
str = String.format("Hello %s%c","world",'!');
System.out.println(str);
//%b
str = String.format("%b", 10>3);
System.out.println(str);
str = String.format("%b", 2>=3);
System.out.println(str);
//%d %x %o
str = String.format("十进制:%d", 10);
System.out.println(str);
str = String.format("十六进制:%x", 10);
System.out.println(str);
str = String.format("八进制:%o", 10);
System.out.println(str);
//%f %a %g %e
str = String.format("浮点数:%f", 3.14159);
System.out.println(str);
str = String.format("十六进制浮点数:%a", 3.14159);
System.out.println(str);
str = String.format("通用浮点类型:%g", 3.1415926);
System.out.println(str);
str = String.format("指数形式:%e", 3.14159);
System.out.println(str);
//%h %% %n
str = String.format("散列码:%h", "123456");
System.out.println(str);
str = String.format("百分之九十:%d%%", 90);
System.out.println(str);
str = String.format("测试到此结束!%n");
System.out.println(str);
}
}
返回结果:
Hello world!
true
false
十进制:10
十六进制:a
八进制:12
浮点数:3.141590
十六进制浮点数:0x1.921f9f01b866ep1
通用浮点类型:3.14159
指数形式:3.141590e+00
散列码:56760663
百分之九十:90%
测试到此结束!
常用标识:
标识 | 说明 |
---|---|
+ | 使用正数表示正号,负数加不加无所谓,都可以表示出负号 |
- | 左对齐,不够位数的地方补空格 |
0 | 在数字不够的地方补0 |
空格 | 在位数不够的地方补上空格 |
, | 对数字分组,三位一隔,只可以用于十进制 |
( | 使用括号将去掉负号包含进来 |
# | 让十六进制的数字加上ox,八进制的数字加上o,辅助%x和%o使用,相当于一种数字进制的补充说明提示 |
< | 格式前一个转换符的参数 |
代码测试:
public class StringFormatDemo02 {
public static void main(String[] args)
{
//+号的用法
String str;
str = String.format("数字的正负表示:%+d %d %+d %d",8,8,-8,-8);
System.out.println(str);
//-的用法
str = String.format("左对齐:%-6d",8);
System.out.println(str);
//0的用法
str = String.format("缺位补零:%06d",8);
System.out.println(str);
//' '空格的用法
str = String.format("缺位补空格:% 6d",8);
System.out.println(str);
str = String.format("缺位补空格:% 6d",-8);
System.out.println(str);
//,的用法
str = String.format("数字分组:%,d",123456789);
System.out.println(str);
//(的用法
str = String.format("括号用法:%(d",-8888);
System.out.println(str);
str = String.format("括号用法:%(d",8888);
System.out.println(str);
//#的用法
str = String.format("#括号用法(十六进制):%#x",12);
System.out.println(str);
str = String.format("#括号用法(八进制):%#o",12);
System.out.println(str);
//<的用法
str = String.format("<括号用法:%f %<3.1f",3.14,3.2);
//"%<3.1f"作用的对象是前一个"%f"所作用的对象
System.out.println(str);
}
}
返回结果:
数字的正负表示:+8 8 -8 -8
左对齐:8
缺位补零:000008
缺位补空格: 8
缺位补空格: -8
数字分组:123,456,789
括号用法:(8888)
括号用法:8888
#括号用法(十六进制):0xc
#括号用法(八进制):014
<括号用法:3.140000 3.1