java学习笔记(二)parseInt和valueOf 以及字符串+和StringBuilder的区别

本文深入探讨了Java中parseInt与valueOf方法的区别,解析了装箱拆箱的过程及潜在陷阱,同时对比了字符串拼接使用+操作符与StringBuilder的效率差异。

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毫秒。

### 区别分析 在Java中,`Integer.parseInt()``Integer.valueOf()`都是用于将字符串转换为整数的静态方法,但它们在功能使用场景上存在显著差异。 #### 返回值类型不同 `Integer.parseInt()`返回的是基本数据类型`int`,而`Integer.valueOf()`返回的是`Integer`对象。这意味着,当需要一个对象时,比如在集合类中使用,应该选择`Integer.valueOf()`。[^2] #### 内部实现机制 从内部实现的角度来看,`Integer.valueOf(String s)`实际上是调用了`Integer.parseInt(s, 10)`方法来完成字符串到整数的转换,然后将得到的`int`值封装成一个`Integer`对象。[^4]具体实现如下: ```java public static Integer valueOf(String s) throws NumberFormatException { return Integer.valueOf(parseInt(s, 10)); } ``` #### 性能考量 对于`Integer.valueOf(int i)`方法,Java采用了缓存机制来提高性能。对于-128到127之间的整数,`Integer.valueOf()`会返回缓存中的实例,而不是创建新的`Integer`对象。这有助于减少内存消耗并提升程序性能。[^4]具体实现如下: ```java public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } ``` ### 使用建议 - 如果只需要一个基本类型的整数值,或者需要将字符串转换为`int`类型以便进行数学运算,应使用`Integer.parseInt()`。 - 如果需要一个`Integer`对象,例如用于集合操作或需要利用对象特性时,应使用`Integer.valueOf()`。 ### 示例代码 以下是一些使用这两个方法的例子: ```java String strNumber = "123"; // 使用 parseInt() 转换为 int int primitiveInt = Integer.parseInt(strNumber); System.out.println(primitiveInt); // 输出: 123 // 使用 valueOf() 转换为 Integer 对象 Integer objectInt = Integer.valueOf(strNumber); System.out.println(objectInt); // 输出: 123 ``` 通过上述分析,可以根据实际需求选择合适的方法来处理字符串到整数的转换。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值