广告
返回顶部
首页 > 资讯 > 后端开发 > Python >JAVA基本类型包装类 BigDecimal BigInteger 的使用
  • 182
分享到

JAVA基本类型包装类 BigDecimal BigInteger 的使用

2024-04-02 19:04:59 182人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录1、了解包装类2、Integer3、Double4、BigDecimal5、BigInteger1、了解包装类 Java 中预定义了八种基本数据类型,包括:byte,int,lo

1、了解包装类

Java 中预定义了八种基本数据类型,包括:byteintlongdoublefloatbooleancharshort。基本类型与对象类型最大的不同点在于,基本类型基于数值,对象类型基于引用。

例如有一个方法 f() ,它的参数分别是对象类型 和 基本类型:


void f(Object obj){
 //参数引用类型,保存的是内存地址
}

f(123){
 //基本类型
}


基本类型基于数值,所以基本类型是没有类而言的,是不存在类的概念的,也就是说,变量只能存储数值,而不具备操作数据的方法。

对象类型则截然不同,变量实际上是某个类的实例,可以拥有属性方法等信息,不再单一的存储数值,可以提供各种各样对数值的操作方法,但代价就是牺牲一些性能并占用更多的内存空间。

Java 中提供了哪些「包装类型」来弥补「基本类型」不具备面向对象思想的劣势呢?看下图:

java.lang.Number

这里需要提到 java.lang.Number,它是所有数值类的父类,其直接子类包括:ByteShortIntegerLongFloatDoubleBigDecimalBigInteger

这些类取出内部封装的基本类型值的方法很简单也很好记:byteValue()shortValue() intValue() longValue() floatValue() doubleValue()

其他使用方法也基本相同,下面我们以 Integer 和 Double 为例具体讲一讲

2、Integer

首先需要明确一点的是,既然 Integer int 的包装类型,那么必然 Integer 也能像 int 一样存储整型数值。有兴趣的同学可以看看源码

Integer 类的内部定义了一个私有字段 value,专门用于保存一个整型数值,整个包装类就是围绕着这个 value 封装了各种不同操作的方法:

创建对象


Integer i1 = 21;
Integer i2 = Integer.valueOf("21");

自动拆装箱

所谓「拆箱」就是指,包装类型转换为基本类型的过程,而所谓的「装箱」则是基本类型到包装类型的过程。


Integer integer = new Integer(21);//装箱
int num = integer.intValue();//拆箱

自从 jdk1.5 以后,引入了自动拆装箱的概念,上述代码可以简化成如下代码:


Integer integer = 21;//装箱
int num = integer;//拆箱

我们来进行分析一下。

自动装箱

Integer integer = 21; 给一个 Integer 类型的对象不能直接赋一个基本类型值,integer 保存的是一个内存地址。21 自动封装成一个对象,把这个对象的地址赋值给 integer。这个对象是自动创建的,是自动装箱。在程序中编译成:Integer integer = Integer.valueOf(21);

自动拆箱

int num = integer; 定义一个 int 类型变量,num 应该直接存一个值,integer 保存的是一个内存地址。integer 自动取出对象中的值,然后把值赋值给 num。系统为我们执行了:int num = integer.intValue();

拆装箱是需要方法调用的,耗资源,所以我们的程序中应当尽量避免大量的「拆装箱」操作。

自动拆箱要当心 null 值

我们看以下程序:


public class Main {
    public static void main(String[] args) {
        int j = 0;
        List<Integer> list = new ArrayList<>();
        list.add(3);
        list.add(null);
        for (int i : list) {
            j += i;
        }
        System.out.println(j);
    }
}

运行时会报空指针

所以在获取到值有可能为空要装箱的时候,一定要加上 null 值的校验。所以可以把程序改为:

程序结果为:

3

面试题1


  Integer i1 = 100;
        Integer i2 = 100;
        Integer i3 = 200;
        Integer i4 = 200;

        System.out.println(i1==i2);
        System.out.println(i3==i4);

输出结果:

true
false

Integer 类中,存在 Integer 实例缓存数组,范围:-128 - 127。如果在自动装箱的时候给局部变量的int型值是在上面的范围之中,如果是范围内的值,就使用存在的缓存对象;如果不是范围内的值,会新建对象。

面试题2


  Integer i1 = new Integer(21);
        Integer i2 = new Integer(21);
        System.out.println(i1 == i2);
        System.out.println(i1.equals(i2));

输出结果:

false
true

如果new就会在堆内存开辟空间,new两次就开辟两段空间,两段空间地址值一定不一样。不推荐这么写,过时了。

方法

1、从 Number 继承的 6 个方法

byteValue()shortValue()intValue() longValue()floatValue()doubleValue()

2、字符串解析成 int

Integer.parseInt("255"); //将字符串转换为 int 类型的数值,按十进制解析成 255
Integer.parseInt("11111111", 2) //按二进制解析成 255
Integer.parseInt("377",8); //按八进制解析成 255
Integer.parseInt("ff", 16); //按十六进制解析成 255

3、进制转换

Integer.toBinaryString(255); //将数字转成二进制,解析成"11111111"
Integer.toOctalString(255); //将数字转换成八进制,解析成"377"
Integer.toHexString(255); //将数字转换成十六进制,解析成"ff"

完整程序


  System.out.println("i1:" + Integer.parseInt("255"));
        System.out.println("i2:" + Integer.parseInt("11111111", 2));
        System.out.println("i3:" + Integer.parseInt("377", 8));
        System.out.println("i4:" + Integer.parseInt("ff", 16));

        System.out.println("s1:" + Integer.toBinaryString(255));
        System.out.println("s2:" + Integer.toOctalString(255));
        System.out.println("s3:" + Integer.toHexString(255));

输出结果

255
255
255
255
11111111
377
ff

3、Double

Double 类在对象中包装了一个基本类型 double 的值。Double 类对象包含一个 double 类型的字段。此外,该类还提供了多个方法,可以将 double 类型与 String 类型相互转换,同时 还提供了处理 double 类型时比较常用的常量和方法。

创建对象


Double d1 = 21d;
Double d2 = Double.valueOf("21");

方法

1、从Number类继承的6个方法,同上
2、将数字字符串转换为 Double 数值 Double.parseDouble("3.14");
3、判断浮点数特殊值
Double.isInfinite(double d):如果此对象表示的值是正无穷大或负无穷大,则返回 true;否则返回
Double.isNaN(double d):如果此 Double 值是一个非数字值,则返回 true,否则返回 false


Infinity:无穷大
NaN:not a number

4、BigDecimal

浮点数的运算是不精确的,我们看以下运算


System.out.println(2 - 1.9);
System.out.println(4.35 * 100);

运算结果:

那为什么会出现这种情况呢?

因为不论是 float 还是 double 都是浮点数,而计算机是二进制的,浮点数会失去一定的精确度。究其根本原因是,十进制值通常没有完全相同的二进制表示形式,十进制数的二进制表示形式可能不精确。只能无限接近于那个值。

BigDecimal 的作用就是做精确的浮点运算

构造方法


public BigDecimal(double val)    将double表示形式转换为BigDecimal *不建议使用
public BigDecimal(int val)  将int表示形式转换成BigDecimal
public BigDecimal(String val)  将String表示形式转换成BigDecimal * 推荐使用

参数类型为 double 的构造方法的结果有一定的不可预知性。所以通常情况下不使用。

String 构造方法是完全可预知的:写入 newBigDecimal(“0.1”), 将创建一个 BigDecimal,它正好等于预期的 0.1。因此,比较而言,通常建议优先使用 String 构造方法。

double 必须用作 BigDecimal 的源时,请使用 Double.toString(double) 转成String,再使用 String 构造方法。或使用 BigDecimal 的静态方法 valueOf

举例:使用 double 做构造参数的正确使用

如下程序中 bd1 展示了 参数类型为 double 的构造方法的的不可预知性,db2 展示了 String 的构造方法,bd3、bd4 展示了正确使用 double 做为参数的构造方法。


  BigDecimal bd1 = new BigDecimal(1.9);
        BigDecimal bd2 = new BigDecimal("1.9");
        BigDecimal bd3 = BigDecimal.valueOf(1.9);
        BigDecimal bd4 = new BigDecimal(Double.toString(1.9));


        System.out.println("db1:" + bd1);
        System.out.println("db2:" + bd2);
        System.out.println("db3:" + bd3);
        System.out.println("db4:" + bd4);

运行结果:

方法

add(BigDecimal bd)+
subtract(BigDecimal bd)-
multiply(BigDecimal bd)*
divide(BigDecimal bd)/
divide(BigDecimal bd,
保留位数,舍入方式)
setScale(保留位数,舍入方式) 舍入运算,运算结果会封装成新的大数字对象返回

举例:实现本节开头的精确运算


  BigDecimal bd1 = new BigDecimal("2");
        BigDecimal bd2 = new BigDecimal("1.9");
        System.out.println("2 - 1.9 = " + bd1.subtract(bd2));

        BigDecimal bd3 = new BigDecimal("4.35");
        BigDecimal bd4 = new BigDecimal("100");
        System.out.println("4.35 * 100 = " + bd3.multiply(bd4));

运行结果:

举例:四舍五入


BigDecimal bd = BigDecimal.valueOf(2.345);
double result = bd.setScale(2, RoundingMode.HALF_UP).doubleValue();
System.out.println("result:" + result);

运行结果:


举例:计算降落距离


  System.out.println("输入降落时间");
        double t = new Scanner(System.in).nextDouble();
        //1/2*9.8*t*t
        BigDecimal a = BigDecimal.valueOf(0.5);
        BigDecimal b = BigDecimal.valueOf(9.8);
        BigDecimal c = BigDecimal.valueOf(t);

        double result = a.multiply(b).multiply(c.pow(2)).doubleValue();

        System.out.println("降落距离:" + result + "米");

运行结果:

5、BigInteger

作用:做超大整数运算

在 Java中,由CPU原生提供的整型最大范围是 64 位 long 型整数。使用 long 型整数可以直接通过 CPU 指令进行计算,速度非常快。

如果我们使用的整数范围超过了 long 型怎么办?这个时候,就只能用软件来模拟一个大整数。java.math.BigInteger 就是用来表示任意大小的整数。

我们通过一个例子就可以了解它的使用。

举例:计算阶乘


public class Main {
    public static void main(String[] args) {
        System.out.println("输入数字来计算阶乘:");
        int number = new Scanner(System.in).nextInt();
        System.out.println("阶乘结果:" + f(number));
    }

    private static String f(int number) {
        //超大整数运算
        BigInteger bd = BigInteger.valueOf(number);
        for (int i = number - 1; i >= 1; i--) {
            BigInteger bi = BigInteger.valueOf(i);
            bd = bd.multiply(bi);
        }
        return bd.toString();
    }
}

运行结果:


方法

BigInteger abs()  返回大整数的绝对值
BigInteger add(BigInteger val) 返回两个大整数的和
BigInteger and(BigInteger val)  返回两个大整数的按位与的结果
BigInteger andNot(BigInteger val) 返回两个大整数与非的结果
BigInteger divide(BigInteger val)  返回两个大整数的商
double doubleValue()   返回大整数的double类型的值
float floatValue()   返回大整数的float类型的值
BigInteger GCd(BigInteger val)  返回大整数的最大公约数
int intValue() 返回大整数的整型值
long longValue() 返回大整数的long型值
BigInteger max(BigInteger val) 返回两个大整数的最大者
BigInteger min(BigInteger val) 返回两个大整数的最小者
BigInteger mod(BigInteger val) 用当前大整数对val求模
BigInteger multiply(BigInteger val) 返回两个大整数的积
BigInteger negate() 返回当前大整数的相反数
BigInteger not() 返回当前大整数的非
BigInteger or(BigInteger val) 返回两个大整数的按位或
BigInteger pow(int exponent) 返回当前大整数的exponent次方
BigInteger remainder(BigInteger val) 返回当前大整数除以val的余数
BigInteger leftShift(int n) 将当前大整数左移n位后返回
BigInteger rightShift(int n) 将当前大整数右移n位后返回
BigInteger subtract(BigInteger val)返回两个大整数相减的结果
byte[] toByteArray(BigInteger val)将大整数转换成二进制反码保存在byte数组中
String toString() 将当前大整数转换成十进制的字符串形式
BigInteger xor(BigInteger val) 返回两个大整数的异或

到此这篇关于JAVA基本类型包装类 BigDecimal BigInteger 的使用的文章就介绍到这了,更多相关JAVA BigDecimal、BigInteger 的使用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JAVA基本类型包装类 BigDecimal BigInteger 的使用

本文链接: https://www.lsjlt.com/news/135937.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JAVA基本类型包装类 BigDecimal BigInteger 的使用
    目录1、了解包装类2、Integer3、Double4、BigDecimal5、BigInteger1、了解包装类 Java 中预定义了八种基本数据类型,包括:byte,int,lo...
    99+
    2022-11-12
  • JAVA biginteger类bigdecimal类的使用示例学习
    目录biginteger类的使用BigInteger案例代码bigdecimal类的使用BigDecimal的案例代码biginteger类的使用 A:BigInteger的概述 &...
    99+
    2022-11-13
  • Java你不了解的大数型BigInteger与BigDecimal类
    BigInteger类 在Java当中,是有许多数字要进行处理的类,比如Integer类,但是Integer类它也是有上限的。它的最大值就是到2^31-1. 如果我们此时想要表示更大...
    99+
    2022-11-13
  • Java的大数型BigInteger与BigDecimal类实例分析
    这篇文章主要讲解了“Java的大数型BigInteger与BigDecimal类实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java的大数型BigInteger与BigDecima...
    99+
    2023-06-30
  • Java 八种基本类型和基本类型封装类
    首先,八种基本数据类型分别是:int、short、float、double、long、boolean、byte、char;     它们的封装类分别是:Integer、Short、Float、Double、Long、Bo...
    99+
    2023-05-31
    java 基本类型 ava
  • java基本数据类型和包装类介绍
    这篇文章主要介绍“java基本数据类型和包装类介绍”,在日常操作中,相信很多人在java基本数据类型和包装类介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java基本数据类型和包装类介绍”的疑惑有所帮助!...
    99+
    2023-06-03
  • 一文带你了解Java中基本数据类型的包装类
    这篇文章将为大家详细讲解有关一文带你了解Java中基本数据类型的包装类,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java是面向对象的编程语言,包装类的出现更好的体现这一思想。 其次,包装...
    99+
    2023-05-31
    java 基本数据类型 包装类
  • JavaScript中引用类型之基本包装类型的示例分析
    这篇文章主要介绍JavaScript中引用类型之基本包装类型的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体如下:为了操作基本类型值,ECDMAScript提供了3个特殊...
    99+
    2022-10-19
  • Java中redis的基本类型
    redis存储数据的基本类型有:string(字符串类型)、hash(散列类型)、list(列表类型)、set(集合类型)、zset(有序集合类型)。 redis中的每个对象都由一个...
    99+
    2022-11-13
  • 如何在Java中使用基础类和包装类
    这篇文章将为大家详细讲解有关如何在Java中使用基础类和包装类,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、简介当需要往ArrayList,HashMap中放东西时,像int,doubl...
    99+
    2023-06-15
  • 详解Java 虚拟机(第④篇)——8 种基本类型的包装类和常量池
    Java 基本类型的包装类的大部分都实现了常量池技术, 即Byte,Short,Integer,Long,Character,Boolean; 这 5 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据, 但是超出此范围仍然...
    99+
    2023-06-05
  • Java BigDecimal类的一般使用、BigDecimal转double方式
    目录BigDecimal类的一般使用、BigDecimal转doubleBigDecimal大据类BigDecimal类创建一个BigDecimal对象方法声明BigDecimal转...
    99+
    2022-11-13
  • TypeScript 安装使用及基本数据类型
    第一步 全局安装TypeScript 使用 npm 安装 npm install -g typescript 使用cnpm 安装 cnpm install -g types...
    99+
    2022-11-11
  • java基础之包装类的介绍及使用
    1. 包装类的介绍 针对八种基本数据类型定义相应的引用类型--包装类(封装类),有了类的热点后,就可以调用类中的方法 2. 基本数据类型 --> 包装类:调用包装类的构造器,...
    99+
    2022-11-12
  • Java基础之详解基本数据类型的使用
    一、整型 主要扩展一下不同进制的整型 二进制、八进制、十进制、十六进制 * 二进制 : 0B(数字零+B) 0b(数字零+b) * 八进制 :0(数字零开头) * 十进制 :正常写...
    99+
    2022-11-12
  • 浅谈Java对象禁止使用基本类型
    目录1. 关于POJO类属性为基本类型存在的问题2. Java开发手册关于POJO类属性规范3. 基本数据类型默认值4. 测试验证1. 关于POJO类属性为基本类型存在的问题 在项目...
    99+
    2023-02-03
    Java对象禁止使用基本类型 Java 禁止基本类型
  • Java面向对象中基本数据、包装类怎么用
    这篇文章主要为大家展示了“Java面向对象中基本数据、包装类怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java面向对象中基本数据、包装类怎么用”这篇文章吧。public cl...
    99+
    2023-06-02
  • Java基础之基本数据类型怎么用
    这篇文章主要为大家展示了“Java基础之基本数据类型怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java基础之基本数据类型怎么用”这篇文章吧。一、整型主要扩展一下不同进制的整型二进制、八...
    99+
    2023-06-20
  • 关于java中基本数据类型与引用数据类型的介绍
    一、基本数据类型byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值0int:整型,用于存储整...
    99+
    2015-04-05
    java入门 java 基本数据类型 引用数据类型
  • 怎么解析Java性能优化中的基本类型与引用类型
    这期内容当中小编将会给大家带来有关怎么解析Java性能优化中的基本类型与引用类型,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。★名词定义  先明确一下什么是“基本类型”,什么是“引用类型”。  简单地说,...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作