GVKun编程网logo

Java基本类型:int vs. Integer(java基本类型有哪八种)

22

在这里,我们将给大家分享关于Java基本类型:intvs.Integer的知识,让您更了解java基本类型有哪八种的本质,同时也会涉及到如何更有效地13-03Java基本类型包装类概述,Integer

在这里,我们将给大家分享关于Java基本类型:int vs. Integer的知识,让您更了解java基本类型有哪八种的本质,同时也会涉及到如何更有效地13-03 Java 基本类型包装类概述,Integer类,Character、int 类型与 Integer 对象转换,其他基本类型转换方式相同。、Integer.valueOf、 Integer.parseInt 、 new Integer、Integer、Long等基本类型的包装类比较时的注意点的内容。

本文目录一览:

Java基本类型:int vs. Integer(java基本类型有哪八种)

Java基本类型:int vs. Integer(java基本类型有哪八种)

我对何时在Java中使用原始类型与非原始类型(?)类型(即int与Integer)感到困惑。我意识到在某些地方您不能使用基本类型(例如,在使用泛型时)。但是在“普通”代码中呢?使用非原始类型是否会降低性能?使用Android时该如何处理?

***我的问题与这个问题非常相似,该问题是由以下海报之一发现的。链接问题的答案提供了对该问题的更多见解,以下将不进行介绍。

***“非原始”类型正式称为参考类型。

答案1

小编典典

简短答案:An int是一个数字;an
Integer是可以引用包含数字的对象的指针。使用Integer算术涉及更多的CPU周期和占用更多的内存。An
int不是对象,不能传递给任何需要对象的方法(就像您对泛型所说的一样)。

13-03 Java 基本类型包装类概述,Integer类,Character

13-03 Java 基本类型包装类概述,Integer类,Character

基本类型包装类概述

将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据。
常用的操作之一:用于基本数据类型与字符串之间的转换。
基本类型和包装类的对应
Byte,Short,Integer,Long,Float,Double,Character,Boolean

Integer类

为了让基本类型的数据进行更多的操作,Java就为每种基本类型提供了对应的包装类类型

<span>/*<span>

  • 需求1:我要求大家把100这个数据的二进制,八进制,十六进制计算出来

  • 需求2:我要求大家判断一个数据是否是int范围内的。

  • 首先你的知道int的范围是多大?

  • <span>为了对基本数据类型进行更多的操作,更方便的操作,Java就针对每一种基本数据类型提供了对应的类类型。包装类类型。

  • byte Byte

  • short Short

  • int Integer

  • long Long

  • float Float

  • double Double

  • char Character

  • boolean Boolean

  • <span>用于基本数据类型与字符串之间的转换。
    <span>*/
    <span>public <span>class<span> IntegerDemo {
    <span>public <span>static <span>void<span> main(String[] args) {
    <span>//<span> 不麻烦的就来了
    <span>//<span> public static String toBinaryString(int i)
    System.out.println(Integer.toBinaryString(100<span>));
    <span>//<span> public static String toOctalString(int i)
    System.out.println(Integer.toOctalString(100<span>));
    <span>//<span> public static String toHexString(int i)
    System.out.println(Integer.toHexString(100<span>));

     </span><span&gt;//</span><span&gt; public static final int MAX_VALUE</span>

    <span> System.out.println(Integer.MAX_VALUE);
    <span>//<span> public static final int MIN_VALUE
    <span> System.out.println(Integer.MIN_VALUE);
    }
    }

Integer的构造方法

<span>/*<span>

  • Integer的构造方法:

  • public Integer(int value)

  • public Integer(String s)

  • 注意:这个字符串必须是由数字字符组成
    <span>*/
    <span>public <span>class<span> IntegerDemo {
    <span>public <span>static <span>void<span> main(String[] args) {
    <span>//<span> 方式1
    <span>int i = 100<span>;
    Integer ii = <span>new<span> Integer(i);
    System.out.println("ii:" +<span> ii);

     </span><span&gt;//</span><span&gt; 方式2</span>
     String s = "100"<span&gt;;
     </span><span&gt;//</span><span&gt; NumberFormatException
     </span><span&gt;//</span><span&gt; String s = "abc";</span><span&gt;//这个字符串必须是由数字字符组成</span>
     Integer iii = <span&gt;new</span><span&gt; Integer(s);
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(</span>"iii:" +<span&gt; iii);

    }
    }

String和int的相互转换

<span>/*<span>

  • int类型和String类型的相互转换

  • <span>int -- String

  • String.valueOf(number)

  • String -- int

  • Integer.parseInt(s)
    <span>*/
    <span>public <span>class<span> IntegerDemo {
    <span>public <span>static <span>void<span> main(String[] args) {
    <span>//<span> int -- String
    <span>int number = 100<span>;
    <span>//<span> 方式1
    String s1 = "" +<span> number;
    System.out.println("s1:" +<span> s1);
    <span>//<span> 方式2
    String s2 =<span> String.valueOf(number);
    System.out.println("s2:" +<span> s2);
    <span>//<span> 方式3
    <span>//<span> int -- Integer -- String
    Integer i = <span>new<span> Integer(number);
    String s3 =<span> i.toString();
    System.out.println("s3:" +<span> s3);
    <span>//<span> 方式4
    <span>//<span> public static String toString(int i)
    String s4 =<span> Integer.toString(number);
    System.out.println("s4:" +<span> s4);
    System.out.println("-----------------"<span>);

     </span><span&gt;//</span><span&gt; String -- int</span>
     String s = "100"<span&gt;;
     </span><span&gt;//</span><span&gt; 方式1
     </span><span&gt;//</span><span&gt; String -- Integer -- int</span>
     Integer ii = <span&gt;new</span><span&gt; Integer(s);
     </span><span&gt;//</span><span&gt; public int intValue()</span>
     <span&gt;int</span> x =<span&gt; ii.intValue();
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(</span>"x:" +<span&gt; x);
     </span><span&gt;//</span><span&gt;方式2
     </span><span&gt;//</span><span&gt;public static int parseInt(String s)</span>
     <span&gt;int</span> y =<span&gt; Integer.parseInt(s);
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(</span>"y:"+<span&gt;y);

    }
    }

 

Integer的进制转换的操作

<span>/*<span>

  • 常用的基本进制转换

  • public static String toBinaryString(int i)

  • public static String toOctalString(int i)

  • public static String toHexString(int i)

  • 十进制到其他进制

  • public static String toString(int i,int radix)

  • 由这个我们也看到了进制的范围:2-36

  • 为什么呢?0,...9,a...z,加起来36个

  • 其他进制到十进制

  • public static int parseInt(String s,int radix)
    <span>*/
    <span>public <span>class<span> IntegerDemo {
    <span>public <span>static <span>void<span> main(String[] args) {
    <span>//<span> 十进制到二进制,八进制,十六进制
    System.out.println(Integer.toBinaryString(100<span>));
    System.out.println(Integer.toOctalString(100<span>));
    System.out.println(Integer.toHexString(100<span>));
    System.out.println("-------------------------"<span>);

     </span><span&gt;//</span><span&gt; 十进制到其他进制</span>
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(Integer.toString(100,10<span&gt;));
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(Integer.toString(</span>100,2<span&gt;));
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(Integer.toString(</span>100,8<span&gt;));
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(Integer.toString(</span>100,16<span&gt;));
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(Integer.toString(</span>100,5<span&gt;));
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(Integer.toString(</span>100,7<span&gt;));
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(Integer.toString(</span>100,-7<span&gt;));
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(Integer.toString(</span>100,70<span&gt;));
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(Integer.toString(</span>100,1<span&gt;));
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(Integer.toString(</span>100,17<span&gt;));
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(Integer.toString(</span>100,32<span&gt;));
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(Integer.toString(</span>100,37<span&gt;));
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(Integer.toString(</span>100,36<span&gt;));
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(</span>"-------------------------"<span&gt;);
    
     </span><span&gt;//</span><span&gt;其他进制到十进制</span>
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(Integer.parseInt("100",10<span&gt;));
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(Integer.parseInt(</span>"100",2<span&gt;));
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(Integer.parseInt(</span>"100",8<span&gt;));
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(Integer.parseInt(</span>"100",16<span&gt;));
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(Integer.parseInt(</span>"100",23<span&gt;));
     </span><span&gt;//</span><span&gt;NumberFormatException
     </span><span&gt;//</span><span&gt;Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(Integer.parseInt("123",2));</span>

    <span> }
    }

JDK5的新特性--自动装箱和自动拆箱

<span>/*<span>

  • JDK5的新特性

  • 自动装箱:把基本类型转换为包装类类型

  • 自动拆箱:把包装类类型转换为基本类型

  • 注意一个小问题:

  • 在使用时,Integer x = null;代码就会出现NullPointerException。

  • 建议先判断是否为null,然后再使用。
    <span>*/
    <span>public <span>class<span> IntegerDemo {
    <span>public <span>static <span>void<span> main(String[] args) {
    <span>//<span> 定义了一个int类型的包装类类型变量i
    <span>//<span> Integer i = new Integer(100);
    Integer ii = 100<span>;
    ii += 200<span>;
    System.out.println("ii:" +<span> ii);

     </span><span&gt;//</span><span&gt; 通过反编译后的<a href="https://www.jb51.cc/tag/daima/" target="_blank">代码</a>
     </span><span&gt;//</span><span&gt; Integer ii = Integer.valueOf(100); </span><span&gt;//</span><span&gt;<a href="https://www.jb51.cc/tag/zidong/" target="_blank">自动</a>装箱
     </span><span&gt;//</span><span&gt; ii = Integer.valueOf(ii.intValue() + 200); </span><span&gt;//</span><span&gt;<a href="https://www.jb51.cc/tag/zidong/" target="_blank">自动</a>拆箱,再<a href="https://www.jb51.cc/tag/zidong/" target="_blank">自动</a>装箱
     </span><span&gt;//</span><span&gt; Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println((new StringBuilder("ii:")).append(ii).toString());</span>

    <span>
    Integer iii = <span>null<span>;
    <span>//<span> NullPointerException,如果iii为空对象,会报错,需要判断是否为空
    <span>if (iii != <span>null<span>) {
    iii += 1000<span>;
    System.out.println(iii);
    }
    }
    }

-128到127之间的数据缓冲池问题

<span>/*<span>

  • 看程序写结果

  • <span>注意:Integer的数据直接赋值,如果在-128到127之间,会直接从缓冲池里获取数据
    <span>*/
    <span>public <span>class<span> IntegerDemo {
    <span>public <span>static <span>void<span> main(String[] args) {
    Integer i1 = <span>new Integer(127<span>);
    Integer i2 = <span>new Integer(127<span>);
    System.out.println(i1 ==<span> i2);
    System.out.println(i1.equals(i2));
    System.out.println("-----------"<span>);

     Integer i3 </span>= <span&gt;new</span> Integer(128<span&gt;);
     Integer i4 </span>= <span&gt;new</span> Integer(128<span&gt;);
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(i3 </span>==<span&gt; i4);
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(i3.equals(i4));
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(</span>"-----------"<span&gt;);
    
     Integer i5 </span>= 128<span&gt;;
     Integer i6 </span>= 128<span&gt;;
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(i5 </span>==<span&gt; i6);
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(i5.equals(i6));
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(</span>"-----------"<span&gt;);
    
     Integer i7 </span>= <span&gt;127</span><span&gt;;
     Integer i8 </span>= <span&gt;127</span><span&gt;;
     <span&gt;Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(i7 </span></span><span&gt;==</span><span&gt;<span&gt; i8);//true</span>
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(i7.equals(i8));
    
     </span><span&gt;// 通过查看源码,我们就知道了,针对-128到127之<a href="https://www.jb51.cc/tag/jiande/" target="_blank">间的</a>数据,做了<a href="https://www.jb51.cc/tag/yige/" target="_blank">一个</a>数据缓冲池,如果数据是该范围内的,每次并不创建新的空间
     // Integer ii = Integer.valueOf(127);</span>

    <span> }
    }

Character

Character 类在对象中包装一个基本类型 char 的值

<span>/*<span>

  • Character 类在对象中包装一个基本类型 char 的值
  • 此外,该类提供了几种方法,以确定字符的类别(小写字母,数字,等等),并将字符从大写转换成小写,反之亦然
  • <span>构造方法:
  • Character(char value)
    <span>*/
    <span>public <span>class<span> CharacterDemo {
    <span>public <span>static <span>void<span> main(String[] args) {
    <span>//<span> 创建对象
    <span>//<span> Character ch = new Character((char) 97);
    Character ch = <span>new Character('a'<span>);
    System.out.println("ch:" +<span> ch);
    }
    }
Character 类,常见方法。
确定字符的类别(小写字母,数字,等等),并将字符从大写转换成小写

<span>/*<span>

  • public static boolean isUpperCase(char ch):判断给定的字符是否是大写字符
  • public static boolean isLowerCase(char ch):判断给定的字符是否是小写字符
  • public static boolean isDigit(char ch):判断给定的字符是否是数字字符
  • public static char toupperCase(char ch):把给定的字符转换为大写字符
  • public static char toLowerCase(char ch):把给定的字符转换为小写字符
    <span>*/
    <span>public <span>class<span> CharacterDemo {
    <span>public <span>static <span>void<span> main(String[] args) {
    <span>//<span> public static boolean isUpperCase(char ch):判断给定的字符是否是大写字符
    System.out.println("isUpperCase:" + Character.isUpperCase('A'<span>));
    System.out.println("isUpperCase:" + Character.isUpperCase('a'<span>));
    System.out.println("isUpperCase:" + Character.isUpperCase('0'<span>));
    System.out.println("-----------------------------------------"<span>);
    <span>//<span> public static boolean isLowerCase(char ch):判断给定的字符是否是小写字符
    System.out.println("isLowerCase:" + Character.isLowerCase('A'<span>));
    System.out.println("isLowerCase:" + Character.isLowerCase('a'<span>));
    System.out.println("isLowerCase:" + Character.isLowerCase('0'<span>));
    System.out.println("-----------------------------------------"<span>);
    <span>//<span> public static boolean isDigit(char ch):判断给定的字符是否是数字字符
    System.out.println("isDigit:" + Character.isDigit('A'<span>));
    System.out.println("isDigit:" + Character.isDigit('a'<span>));
    System.out.println("isDigit:" + Character.isDigit('0'<span>));
    System.out.println("-----------------------------------------"<span>);
    <span>//<span> public static char toupperCase(char ch):把给定的字符转换为大写字符
    System.out.println("toupperCase:" + Character.toupperCase('A'<span>));
    System.out.println("toupperCase:" + Character.toupperCase('a'<span>));
    System.out.println("-----------------------------------------"<span>);
    <span>//<span> public static char toLowerCase(char ch):把给定的字符转换为小写字符
    System.out.println("toLowerCase:" + Character.toLowerCase('A'<span>));
    System.out.println("toLowerCase:" + Character.toLowerCase('a'<span>));
    }
    }

 

统计一个字符串中大写字母字符,小写字母字符,数字字符出现的次数

<span>import<span> java.util.Scanner;

<span>/*<span>

  • 统计一个字符串中大写字母字符,小写字母字符,数字字符出现的次数。(不考虑其他字符)

  • 分析:

  • A:定义三个统计变量。

  • int bigCont=0;

  • int smalCount=0;

  • int numberCount=0;

  • B:键盘录入一个字符串。

  • C:把字符串转换为字符数组。

  • D:遍历字符数组获取到每一个字符

  • E:判断该字符是

  • 大写 bigCount++;

  • 小写 smalCount++;

  • 数字 numberCount++;

  • F:输出结果即可
    <span>*/
    <span>public <span>class<span> CharacterTest {
    <span>public <span>static <span>void<span> main(String[] args) {
    <span>//<span> 定义三个统计变量。
    <span>int bigCount = 0<span>;
    <span>int smallCount = 0<span>;
    <span>int numberCount = 0<span>;

     </span><span&gt;//</span><span&gt; <a href="https://www.jb51.cc/tag/jianpan/" target="_blank">键盘</a>录入<a href="https://www.jb51.cc/tag/yige/" target="_blank">一个</a>字符串。</span>
     Scanner sc = <span&gt;new</span><span&gt; Scanner(<a href="https://www.jb51.cc/tag/systemin/" target="_blank">system.in</a>);
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(</span>"请输入<a href="https://www.jb51.cc/tag/yige/" target="_blank">一个</a>字符串:"<span&gt;);
     String line </span>=<span&gt; sc.nextLine();
    
     </span><span&gt;//</span><span&gt; 把<a href="https://www.jb51.cc/tag/zifuchuanzhuanhuan/" target="_blank">字符串转换</a>为字符数组。</span>
     <span&gt;char</span>[] chs =<span&gt; line.<a href="https://www.jb51.cc/tag/toch/" target="_blank">toch</a><a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>rray();
    
     </span><span&gt;//</span><span&gt; 历字符数组<a href="https://www.jb51.cc/tag/huoqu/" target="_blank">获取</a>到每<a href="https://www.jb51.cc/tag/yige/" target="_blank">一个</a>字符</span>
     <span&gt;for</span> (<span&gt;int</span> x = 0; x < chs.length; x++<span&gt;) {
         </span><span&gt;char</span> ch =<span&gt; chs[x];
    
         </span><span&gt;//</span><span&gt; 判断该字符</span>
         <span&gt;if</span><span&gt; (Ch<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>cter.isUpperCase(ch)) {
             bigCount</span>++<span&gt;;
         } </span><span&gt;else</span> <span&gt;if</span><span&gt; (Ch<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>cter.isLowerCase(ch)) {
             smallCount</span>++<span&gt;;
         } </span><span&gt;else</span> <span&gt;if</span><span&gt; (Ch<a href="https://www.jb51.cc/tag/ara/" target="_blank">ara</a>cter.isDigit(ch)) {
             numberCount</span>++<span&gt;;
         }
     }
    
     </span><span&gt;//</span><span&gt; <a href="https://www.jb51.cc/tag/shuchu/" target="_blank">输出</a>结果即可</span>
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println("大写字母:" + bigCount + "个"<span&gt;);
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(</span>"小写字母:" + smallCount + "个"<span&gt;);
     Sy<a href="https://www.jb51.cc/tag/stem/" target="_blank">stem</a>.out.println(</span>"数字字符:" + numberCount + "个"<span&gt;);

    }
    }

 

int 类型与 Integer 对象转换,其他基本类型转换方式相同。

int 类型与 Integer 对象转换,其他基本类型转换方式相同。

int 对应的是 Integerchar 对应的 Character,其他 6 个都是基本类型首字母大写

parseXXX(String s); 其中 XXX 表示基本类型,参数为可以转成基本类型的字符串。

System.out.println(Integer.parseInt("123") + 2);

// 打印结果为 125

// 字符串 -> 基本数据类型
        String str="12";// 字符串,必须时整型字符串
        int num=Integer.parseInt (str);// 直接用类名调
        double num2=Double.parseDouble(str);
        System.out.println(num+1);
        System.out.println(num2);
        // 基本类型 -> 字符串
        System.out.println(""+12+1);
        String s1=String.valueOf(88);
        
        String s2=String.valueOf(1.2);
        System.out.println(s1+1);
        
        System.out.println(s2+1);
        
        String s3=Integer.toString(99);
        System.out.println(s3+1);

Integer.valueOf、 Integer.parseInt 、 new Integer

Integer.valueOf、 Integer.parseInt 、 new Integer

先看一下下面的结果

1.System.out.println(127==127); //true , int type compare2.System.out.println(128==128); //true , int type compare3.System.out.println(new Integer(127) == new Integer(127)); //false, object compare4.System.out.println(Integer.parseInt("128")==Integer.parseInt("128")); //true, int type compare5.System.out.println(Integer.valueOf("127")==Integer.valueOf("127")); //true ,object compare, because IntegerCache return a same object6.System.out.println(Integer.valueOf("128")==Integer.valueOf("128")); //false ,object compare, because number beyond the IntegerCache7.System.out.println(Integer.parseInt("128")==Integer.valueOf("128")); //true , int type compare
登录后复制

 

解释

int整型常量比较时,== 是值比较,所以1,2返回true。1,2是值比较。

new Integer() 每次构造一个新的Integer对象,所以3返回false。3是对象比较。

Integer.parseInt每次构造一个int常量,所以4返回true。4是值比较。

Integer.valueOf返回一个Integer对象,默认在-128~127之间时返回缓存中的已有对象(如果存在的话),所以5返回true,6返回false。5,6是对象比较。

第7个比较特殊,是int 和 Integer之间的比较,结果是值比较,返回true。

 

总结

对于整型的比较,首先判断是值比较还是对象比较,值比较肯定返回true,有一个是值就是值比较。对象比较,则看对象是怎么构造出来的,如果是采用new Integer方式,则每次产生新对象,两个new出来的Integer比较肯定返回false,如果是Integer.valueOf方式的话,注意值的区间是否在-128~127之间,如果在,则构造的相同值的对象是同一个对象,==比较后返回true,否则返回false。

所以,对于值比较==放心没问题,对于Integer的比较最好用equals方法比较对象内容,当然注意先判断Integer是否不为null。

 

知识扩展

针对Integer.valueOf源码分析一下

1.我们调用的Integer.valueOf方法, 它先调用parseInt转成int型数值,再调它自己的重载方法

public static Integer valueOf(String s) throws NumberFormatException {return Integer.valueOf(parseInt(s, 10));
    }
登录后复制

2.Integer.valueOf重载方法,根据数值i的大小,决定是否从缓存中取一个Integer对象

 public static Integer valueOf(int i) {if (i &gt;= IntegerCache.low &amp;&amp; i 
登录后复制

3.Integer的构造函数,非常简单

  public Integer(int value) {this.value = value;
    }
登录后复制

4.IntegerCache静态类,是Integer的内部类,三个属性(一个缓存的Integer型数组+一组缓存范围)

private static class IntegerCache {static final int low = -128;static final int high;static final Integer cache[];static {// high value may be configured by property(最大值可配置)int h = 127;
            String integerCacheHighPropValue =sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); //读取VM参数if (integerCacheHighPropValue != null) {try {int i = parseInt(integerCacheHighPropValue); //配置值转换成int数值i = Math.max(i, 127);  //和127比较,取较大者// Maximum array size is Integer.MAX_VALUE(控制缓存数组的大小,最大为整型的最大值,这样一来,h值就必须小于整型最大值,因为要存 -128~0这129个数嘛)h = Math.min(i, Integer.MAX_VALUE - (-low) -1); //实际就是 h=Math.min(i,Integer.MAX_VALUE-129),正整数能缓存的个数} catch( NumberFormatException nfe) {// If the property cannot be parsed into an int, ignore it.                }
            }
            high = h;

            cache = new Integer[(high - low) + 1]; //构造缓存数组int j = low;for(int k = 0; k = 127; //如果小于127,抛异常}private IntegerCache() {}
    }
登录后复制

 看完上述Integer.valueOf源码后,你就会发现,默认的Integer缓存int常量池是可以配置的,配置方法是添加VM参数,加: -Djava.lang.Integer.IntegerCache.high=200

Intellij IDEA 运行配置的VM Options选项中添加参数即可。

 

以上就是Integer.valueOf、 Integer.parseInt 、 new Integer的详细内容,更多请关注php中文网其它相关文章!

Integer、Long等基本类型的包装类比较时的注意点

Integer、Long等基本类型的包装类比较时的注意点

先来看一段代码:
Integer a = 1;
Integer b = 1;
System.out.println(a == b);     // true
 
Integer aa = 128;
Integer bb = 128;
System.out.println(aa == bb);   // false
 
为什么输出结果是这样?这就跟Integer创建对象的方式有关了。在使用 Integer 创建对象的过程中,首先会调用valueOf()方法,源码如下
public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}
Integer会对传入的参数进行了一个判断,在-128<i<127时直接从IntegerCache缓存中取,而当超出这个范围时,则在堆中新建了一个对象。
因此,上面代码中a 和 b 实际上都指向了IntegerCache中的同一个地址,而aa 和 bb 超过了-128~127这个范围,它们指向了堆中不同的对象。
 
Long.vlaueOf()源码
public static Long valueOf(long l) {
    final int offset = 128;
    if (l >= -128 && l <= 127) { // will cache
        return LongCache.cache[(int)l + offset];
    }
    return new Long(l);
}
可以看到,Long同样如此
 
所以,当我们在对这些包装类进行比较时,应该使用equals进行比较,这样就能避免这些意外情况发生。
Integer aa = 128;
Integer bb = 128;
System.out.println(aa.equals(bb));   // true
 
参考博客: http://www.51gjie.com/java/592.html

关于Java基本类型:int vs. Integerjava基本类型有哪八种的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于13-03 Java 基本类型包装类概述,Integer类,Character、int 类型与 Integer 对象转换,其他基本类型转换方式相同。、Integer.valueOf、 Integer.parseInt 、 new Integer、Integer、Long等基本类型的包装类比较时的注意点的相关信息,请在本站寻找。

本文标签: