`
koberichard
  • 浏览: 6323 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

[Java]Integer和String的构造函数问题

阅读更多
http://blog.hesey.net/2010/07/java-construction-of-integer-and-string.html
view sourceprint?01 public class test { 

02     public static void main(String[] agrs) { 

03         int a = 1000, b = 1000; 

04         System.out.println(a == b); // true 

05   

06         Integer c = 1000, d = 1000; 

07         System.out.println(c == d); // false 

08   

09         Integer e = 100, f = 100; 

10         System.out.println(e == f); // true 

11     } 

12 }


答案:

来看JAVA源代码中Integer的构造函数:

JDK1.5开始,Integer对象的赋值会自动调用Integer类的valueOf(int i)方法

view sourceprint?1 public static Integer valueOf(int i) { 

2         final int offset = 128; 

3         if (i >= -128 && i <= 127) { 

4             return IntegerCache.cache[i + offset]; 

5         } 

6         return new Integer(i); 

7     }

而IntegerCache方法在这里:

view sourceprint?1     private IntegerCache() { 

2     } 

3     static final Integer cache[] = new Integer[-(-128) + 127 + 1]; 

4     static { 

5         for (int i = 0; i < cache.length; i++) 

6             cache[i] = new Integer(i - 128); 

7     } 

8 }

所以, 从JDK1.5开始,为了增强一系列基础类型对应对象的性能,JVM预缓存一部分常量,例如Integer预缓存-128~127这些数(实际上是一个 byte所能表示的范围),如果赋值数在此范围内,对象直接指向预缓存地址,如果不在,重新赋值(所以造成地址不同)。

验证代码:

view sourceprint?1 for (int i = -200; i < 200; i++) { 

2     Integer a = i, b = i; 

3     System.out.print(i + " "); 

4     System.out.println(a == b); 

5 }

结果:i为-128到127时,结果为true。

类似的问题还有几个月前让我很疑惑的字符串构造问题:

view sourceprint?01 class test { 

02     public static void main(String[] agrs) { 

03         String a = "Hello"; 

04         String b = "Hello"; 

05         System.out.println(a == b); //true 

06   

07         String c = new String("Hello"); 

08         String d = new String("Hello"); 

09         System.out.println(c == d); //false 

10     } 

11 }

这个则是和静态常量池有关了。

要学的还有很多。

分享到:
评论

相关推荐

    Java中颜色的String和Color对象之间的互相转换

    Java 中颜色的 String 和 Color 对象之间...Java 中颜色的 String 和 Color 对象之间的互相转换可以通过使用 `Integer.parseInt` 方法和 `Integer.toHexString` 方法实现,或者使用反射机制来实现更多的颜色表示形式。

    Java 重载、重写、构造函数的实例详解

    Java中的重载(Overloading)、重写(Overriding)和构造函数是面向对象编程中的核心概念,它们在实现代码的灵活性和可扩展性方面起着至关重要的作用。 首先,让我们了解一下重载。重载指的是在同一个类中,可以有多个...

    java用静态工厂代替构造函数使用方法和优缺点

    在Java编程中,静态工厂方法和构造函数都是用来创建对象的常见方式,但它们在特定场景下有着各自的特点和适用性。本篇文章将深入探讨静态工厂方法代替构造函数的使用方法以及它们的优缺点。 首先,我们来看一下静态...

    JAVAOOP重点笔记总结.docx

    Integer 包装类提供了多种构造函数,包括 Integer(int value) 和 Integer(String s)。这些构造函数可以用于创建 Integer 对象。 6.2.3.3 Integer 的方法 Integer 包装类提供了多种方法,包括 intValue()、parseInt...

    java常用函数.doc

    在Java编程中,掌握常用函数是提升开发效率的关键。本篇将深入讲解Java中涉及...以上就是Java中的一些常用函数和GUI组件的简要介绍。这些基础知识对于Java初学者来说非常重要,理解并熟练运用它们能有效提升编程能力。

    Integer类的使用方法

    `Integer`类提供了两种主要的构造函数来创建`Integer`对象: - `Integer(int value)`: 使用一个`int`值创建`Integer`对象。 - `Integer(String s)`: 使用一个表示整数值的`String`创建`Integer`对象。 示例代码: ...

    深入理解Java函数式编程和Streams API

    ### 深入理解Java函数式编程和Streams API #### 一、引言 随着Java 8的发布,函数式编程范式正式被引入到Java语言中,这标志着Java编程方式的重大转变。Java 8引入了Lambda表达式、方法引用等新特性,使得Java能够...

    java8学习教程之函数引用的使用方法

    本文将详细介绍 Java8 中函数引用的使用方法,包括函数引用的类型、静态函数引用、对象级别函数引用、构造函数引用等。 函数引用的类型 ------------- 函数引用分为四种:静态函数引用、对象级别函数引用、构造...

    java常用类的使用方法.pdf

    Integer类提供了两个构造函数:Integer(int value)和Integer(String s)。其中,Integer(int value)通过一个整数类型构造对象,Integer(String s)通过一个字符串类型构造对象。 例如,使用以下代码可以构造一个...

    JAVA计算机语言函数应用

    首先,`lang`包(java.lang)是Java程序的基础,包含了诸如String、Integer、Math等基本类型和对象的类。函数应用中,`Math`类提供了各种数学运算,如sqrt()用于求平方根,random()用于生成随机数。此外,`String`类...

    java-API-String类

    - **构造函数**: - `String(byte[] bytes)`:通过指定字节数组构建字符串,默认使用平台默认的字符集。 - `String(byte[] bytes, String charsetName)`:通过指定字节数组和字符集构建字符串。 - **常用方法**: ...

    Java面试常见问题

    ### Java面试常见问题详解 #### super与this的理解与应用 在Java编程中,`super` 和 `this` 是两个非常重要的关键字,它们被用于处理继承和构造方法中的上下文引用。 1. **`this` 关键字:** - `this` 主要用...

    java常用函数

    - 构造函数`StringTokenizer(String s, String delim)`使用自定义分隔符。 - 方法`nextToken()`获取下一个标记。 - 方法`hasMoreTokens()`检查是否还有更多的标记。 - 方法`countTokens()`返回总标记数。 #### ...

    Java常用函数.txt

    - **方法**: `Integer.parseInt(String s)`, `Long.parseLong(String s)`, `Float.valueOf(String s).floatValue()`, `Double.valueOf(String s).doubleValue()` - **描述**: 将字符串转换为相应的数值类型。 - **...

    JAVA常用类和方法

    ### JAVA常用类和方法知识点详解 #### 一、字符串处理 **1. 获取字符串长度** - **方法**: `length()` - **用途**: 返回字符串的长度。 - **示例**: ```java String str = "Hello"; int len = str.length...

    Java对象和JSON互转换利器-Gson

    // 构造函数、getter和setter省略 } ``` 可以这样转换为JSON: ```java Person person = new Person("张三", 30); Gson gson = new Gson(); String json = gson.toJson(person); System.out.println(json); // ...

    java 内敛函数,学生与考试的程序

    // 构造函数,初始化学生信息 public Student(String name, int id, int age) { this.name = name; this.id = id; this.age = age; this.scores = new ArrayList(); } // 添加考试成绩的方法 public void ...

    sonar-JAVA检查规则指南.docx

    在 Java 中,使用“BigDecimal(double)”构造函数可能会导致精度问题。因此,应该使用其他构造函数,例如“BigDecimal(String)”或“BigDecimal(int)”。 这些规则是 SonarQube 中的一些基本内置规则,旨在帮助...

    史上最全Java面试题目大集合

    JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变...

Global site tag (gtag.js) - Google Analytics