一、包装类概述

  1、为什么需要包装类

    Java并不是面向对象的语言。Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的。基本数据类型有它的优势:性能(效率高,节省空间)。

   在实际使用中经常需要将基本数据类型转成对象,这时就需要将基本数据类型数据转化为对象。

  2、包装类

  Java 提供了两个类型系统:基本类型引用类型

  使用基本类型在于效率,然后很多情况,需要创建对象使用,因为对象可以做更多的功能。

  

  基本类型对应的包装类

  

基本类型 对应的包装类(位于java.lang包中)
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

二、装箱与拆箱

  基本类型与对应包装类对象之间,来回转换的过程称为“装箱”与“拆箱”。

    •  装箱:从基本类型转换到对应的包装类对象;
    • 拆箱:从包装类对象转换到对应的基本类型。

  1、装箱:把基本类型的数据,包装到包装类中(基本类型的数据 -> 包装类)

    构造方法

      Integer(int value) 构造一个新分配的 Integer 对象,它表示指定的 int 值。

      Integer(String s) 构造一个新分配的 Integer 对象,它表示 String 参数所指示的 int 值。传递的字符串,必须是基本类型的字符串,否则会抛出异常 如:"100" 正确;  "a" 抛出NumberFormatException数字格式化异常

    静态方法

      static Integer valueof(int i):返回一个表示指定的 int 值的 Integer 实例。

      static Integer valueof(String a):返回保存指定的 String 的值的 Integer 对象。

  2、拆箱:在包装类中取出基本类型的数据(包装类->基本类型的数据)

    成员方法

      int intValue() 以 int 类型返回该 Integer 的值。

  Demo:

  // 装箱
//构造方法
Integer in1 = new Integer(1);
Integer in2 = new Integer("1"); //静态方法
Integer in3 = Integer.valueOf(1);
Integer in4 = Integer.valueOf("1"); // 拆箱
int i = in1.intValue();

三、自动装箱(auto_boxing)与自动拆箱(unboxing)

  由于经常要做基本类型与包装类之间的转换,从 Java5(JDK1.5)开始,基本类型与包装类的装箱、拆箱动作可以自动完成。

  自动装箱:当把基本数据类型的值,赋值给包装类的变量时,就会自动装箱。

  自动拆箱:把包装类的对象赋值给对应的基本数据类型的变量时,就会自动拆箱。

  注意:自动装箱与拆箱都是只发送在对应类型上。

  Demo:

 Integer i = 3;     // 自动装箱。相当于Integer i = Integer.valueOf(3);
i = i + 5; // 等号右边:将 i 对象转成基本数值(自动拆箱) i.intValue() + 5;
// 加法运算完成后,再次装箱,把基本数值转成对象。

四、包装类的 API

  1、基本类型转换为字符串 String

      a、基本类型的值 + ""    最简单的方法(最常用)

       b、包装类的静态方法 toString(参数)

 static String toString(int i) 返回一个表示指定整数的 String 对象。

       c、String 类的静态方法 valueOf(参数)

 static String valueOf(int i) 返回 int 参数的字符串表示形式。

  2、字符串(String)转换为基本类型

    除了 Character 类之外,其他所有包装类都具有 parseXxx 静态方法可以将字符串参数转换为对应的基本类型。

public static byte parseByte(String s):将字符串参数转换为对应的byte基本类型。
public static short parseShort(String s):将字符串参数转换为对应的short基本类型。
public static int parseInt(String s):将字符串参数转换为对应的int基本类型。
public static long parseLong(String s):将字符串参数转换为对应的long基本类型。
public static float parseFloat(String s):将字符串参数转换为对应的float基本类型。
public static double parseDouble(String s):将字符串参数转换为对应的double基本类型。
public static boolean parseBoolean(String s):将字符串参数转换为对应的boolean基本类型。

   也可以使用 valueOf(xx) 方法,将字符串转换为基本类型。

static Integer valueOf(String s)  返回保存指定的 String 的值的 Integer 对象。 

    注意:如果字符串参数的内容无法正确转换为对应的基本类型,则会抛出java.lang.NumberFormatException异常。

  3、进制转换(Integer 类型)

System.out.println(Integer.toBinaryString(10));//转为二进制
System.out.println(Integer.toOctalString(10));//转为八进制
System.out.println(Integer.toHexString(10));//转为十六进制

  4、常量值(Byte,Short,Integer,Long,Float,Double)

    MAX_VALUE:代表范围内的最大值;MIN_VALUE:代表范围内的最小值

Integer.MIN_VALUE
Integer.MAX_VALUE

  5、转换大小写(Character对象)

Character.toUpperCase('a')
Character.toLowerCase('T')

  

五、包装类对象的缓存问题

  在编程时大量需要值在-128到127范围之间的Integer对象。如果只能通过new来创建,需要在堆中开辟大量值一样的Integer对象。这是相当不划算的,IntegerCache.cache很好的起到了缓存的作用。

  对于自动装箱这种情况,Byte,Short,Integer,Long:都有缓存对象,范围 -128~127;Character 缓存对象范围 0~127;Boolean 缓存对象范围:true,false。

  Float,Double没有缓存对象。

  Demo1:

 (1)
int a = 1;
int b = 1;
System.out.println(a == b);//true (2)
int c = 130;
int d = 130;
System.out.println(c == d);//true (3)
//自动装箱
Integer a = 1;
Integer b = 1;
System.out.println(a == b);//true a == b比较的也是地址值 a和b指向的是同一个缓存的常量对象 (4)
Integer c = 130;
Integer d = 130;
System.out.println(c == d);//false c == d比较的也是地址值 c和d都是在堆中新建的Integer对象 (5)
Integer a = 1;
Double b = 1.0;
Long c = 1L;
long d = 1L; //System.out.println(a == b);//无法比较,因为对象比较地址,必须是同一种类型或有父子类关系
//System.out.println(a == c);//无法比较,因为对象比较地址,必须是同一种类型或有父子类关系 System.out.println(a == d);// true 因为d是基本数据类型,a才会自动拆箱, int 与 long 比较,可以比较 (6)
Double d1 = 1.0;
Double d2 = 1.0;
System.out.println(d1 == d2);//false Float与 Double没有缓存对象 (7)
Character c1 = '0';//ASCII码,Unicode码:48
Character c2 = '0';
System.out.println(c1 == c2);//true Character c3 = '中';
Character c4 = '中';
System.out.println(c3 == c4);//false

  Demo2:

 Integer i = 1;
Integer j = 1;
System.out.println(i == j);//true Integer i = 128;
Integer j = 128;
System.out.println(i == j);//false Integer i = new Integer(1);//新new的在堆中
Integer j = 1;//这个用的是缓冲的常量对象,在方法区
System.out.println(i == j);//false Integer i = new Integer(1);//新new的在堆中
Integer j = new Integer(1);//另一个新new的在堆中
System.out.println(i == j);//false Integer i = new Integer(1);
int j = 1;
System.out.println(i == j);//true,凡是和基本数据类型比较,都会先拆箱,按照基本数据类型的规则比较

Java 基本类型包装类Wrapper的更多相关文章

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

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

  2. java 基本类型包装类

    一 基本类型包装类 1.包装类概述 Java中提供了相应的对象来解决实现字符串与基本数据之间转换问题,基本数据类 型对象包装类:java将基本数据类型值封装成了对象. 8种基本类型对应的包装类如下: ...

  3. java 基本类型包装类,system类,Math类,Assrays类,大数据运算

    实现字符串与基本数据之间转换 将字符串转成基本数据类型方法 例如:将字符串转成成int类型 String str ="123"; int a =Integer.parseInt(s ...

  4. java基本类型包装类之间的值比较问题

    废话不多说,先看代码 Integer a = 2;Integer b = 2;if(a==b){ System.out.println("相等");}else{ System.ou ...

  5. Java基础知识点1:基本类型包装类

    基本类型的包装类 简介 通常来说我们在程序中经常会使用元类型,比如 int data = 1; float data = 2.1F; 但是在有些场景中不能直接使用元类型,比如如果我们想要建立一个int ...

  6. Java基础知识强化64:基本类型包装类的引入

    1. 基本类型包装类概述 (1)将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据. (2)常用的操作的之一:用于基本数据类型与字符串之间的转换. (3)基本类型和包装类的对应 ...

  7. Java基础学习笔记十四 常用API之基本类型包装类

    基本类型包装类 Java中有8种基本的数据类型,可是这些数据是基本数据,想对其进行复杂操作,变的很难.怎么办呢?在实际程序使用中,程序界面上用户输入的数据都是以字符串类型进行存储的.而程序开发中,我们 ...

  8. 第47节:Java当中的基本类型包装类

    Java当中的基本类型包装类 01 基本数据类型对象的包装类 什么是基本数据类型对象包装类呢?就是把基本数据类型封装成对象,这样就可以提供更多的操作基本数值的功能了. 基本数据类型对象的包装类8个: ...

  9. java学习笔记18(基本类型包装类,system类)

    基本类型包装类 定义:程序界面用户输入的数据都是以字符串类型存储的,如果需要操作这些字符串进行运算,需要转成基本数据类型,这时就要用到基本类型包装类,例: public class Demo { pu ...

随机推荐

  1. springtask 基本使用和 cron 表达式

    springtask 的基本使用和 cron 表达式 spring 容器依赖 <dependency> <groupId>org.springframework</gro ...

  2. 几款不错的java表达式引擎

    mvel 比较老牌了,很强大,但是好久没更新了 参考地址: http://mvel.documentnode.com/ https://github.com/mvel/mvel ScriptEngin ...

  3. 常见的概率分布类型(二)(Probability Distribution II)

    以下是几种常见的离散型概率分布和连续型概率分布类型: 伯努利分布(Bernoulli Distribution):常称为0-1分布,即它的随机变量只取值0或者1. 伯努利试验是单次随机试验,只有&qu ...

  4. nodejs内存溢出 FATAL ERROR: CALL_AND_RETRY_0 Allocation failed – process out of memory

    spa项目整体迁移转为ssr后,改动之后部署一切还好,就是突然有一天访问人数太多,node进程很容易就挂了自动重启. 最后经过压力测试,考虑到是堆内存溢出的问题,就报错误:FATAL ERROR: C ...

  5. SpringData JPA一对多多对一多对多关联

    一.一对多.多对一 1.Country实体类 2.City实体类 3.CountryDao层 4.CityDao层 5.Controller package com.zn.controller; im ...

  6. Gamma阶段第六次scrum meeting

    每日任务内容 队员 昨日完成任务 明日要完成的任务 张圆宁 #91 用户体验与优化https://github.com/rRetr0Git/rateMyCourse/issues/91(持续完成) # ...

  7. Spring Events

    https://www.baeldung.com/spring-events by Eugen Paraschiv Spring+ I just announced the new Learn Spr ...

  8. ASP.Net Core使用分布式缓存Redis从入门到实战演练

    一.课程介绍 人生苦短,我用.NET Core!缓存在很多情况下需要用到,合理利用缓存可以一方面可以提高程序的响应速度,同时可以减少对特定资源访问的压力.  所以经常要用到且不会频繁改变且被用户共享的 ...

  9. .net core 读取配置文件的值

    .net core中的配置文件可以存一些自定义的值,我们需要去读取 在配置中添加json: "name": "sealee", "Connection ...

  10. QuantLib 金融计算——收益率曲线之构建曲线(4)

    [TOC] 如果未做特别说明,文中的程序都是 C++11 代码. QuantLib 金融计算--收益率曲线之构建曲线(4) 本文代码对应的 QuantLib 版本是 1.15.相关源代码可以在 Qua ...