parseInt和valueOf
我们平时应该都用过或者见过parseInt和valueOf这两个方法。一般我们是想把String类型的字符数字转成int类型。从这个功能层面来说,这两个方法都一样,都可以胜任这个功能。
但是,我们进入源码,看下Integer类下这两个方法
parseInt
public static int parseInt(String var0) throws NumberFormatException {
return parseInt(var0, 10);
}
valueOf
public static Integer valueOf(String var0) throws NumberFormatException {
return valueOf(parseInt(var0, 10));
}
从代码,我们起码看到了两点
返回结果类型不一样,parseInt方法返回的是int基本类型,valueOf方法返回的是Integer的包装类型
valueOf方法实际上是调用了parseInt方法,也就是说,如果我们仅仅只需要得到字符串类型字符数值对应的整数数值,那我们大可不必调用valueOf,因为这样得到整形数值之后还要做一个装箱的操作,将int封装为Integer。
装箱拆箱
Java的八种基本数据类型:int, short, long, double, byte, char, float, boolean
分别有各自对应的包装类型:Integer, Short, Long, Double, Byte, Character, Float, Boolean
拆箱与装箱是相反的操作。装箱是将一个原始数据类型比如int赋值给相应封装类的变量比如Integer。而拆箱则是将一个封装类的变量赋值给相应原始数据类型的变量。
看一段代码
int i = 0;
Integer j = new Integer();
…
i = j;
看完这段代码不知道你是否已经意识到问题所在了。没错,问题出在了i=j,有人说这没有问题,因为j是Integer类型,在赋值给i的时候会自动拆箱变成int类型。但是如果这时候j在经过一番处理后得到的是一个null值呢,存放在Integer下是没有问题的,因为Integer就是一个类,允许为null,但是在拆箱为null并赋值给基本类型i的时候,这时候就是抛出异常。
所以,拆箱装箱带来便捷的时候,也会有一些坑,需要我们去避免,能有效的避免的前提就是我们要基础扎实。
字符串+和StringBuilder
我们是不是太习惯于在拼接一个字符串时使用类似这样的写法
String result = a + “:” + b + “:” + c;
其实我们看源码就知道,其实每一次+的操作都是将要拼接的字符串创建一个String类型的对象,然后塞到字符串结果中,最后调用toString方法得到最终的字符串。
这样的场景,我们更加推荐使用StringBuilder,通过调用append方法拼接字符串,不需要创建那么多对象浪费系统资源。
我们可以写一段测试代码来看下两种方式的差异
public class StringAndStringBuilder {
public static void main(String[] args) {
testString();
testStringBuilder();
}
public static void testString(){
long start = System.currentTimeMillis();
String resultStr = "";
int i = 0;
for (int a = 0; a < 10000; a++) {
resultStr += "abc" + "def" + "g" + i++;
}
System.out.println("using String:" + (System.currentTimeMillis() - start));
}
public static void testStringBuilder() {
StringBuilder stringBuilder = new StringBuilder();
long start = System.currentTimeMillis();
int i = 0;
for (int a = 0; a < 10000; a++) {
stringBuilder.append("abc").append("def").append("g").append(i++);
}
System.out.println("using StringBuilder:" + (System.currentTimeMillis() - start));
}
}
最终的运行结果如下
using String:2266
using StringBuilder:3
这种效果显然意见,使用String是秒级的2秒多,而使用StringBuilder是毫秒级的3毫秒。