java中的基本数据类型和包装类型的这些知识,你都知道吗?(代码片段)

code随笔 code随笔     2022-12-26     553

关键词:

Java中的基本数据类型和包装类型

Java 中的基本数据按类型可以分为四大类:布尔型、整数型、浮点型、字符型;
这四大类包含 8 种基本数据类型。

  • 布尔型:boolean
  • 整数型:byte、short、int、long
  • 浮点型:float、double
  • 字符型:char

这8 种基本类型取值如下:

数据类型 代表含义 默认值 取值 包装类
boolean 布尔型 false 0(false) 到 1(true) Boolean
byte 字节型 (byte)0 ﹣128 到 127 Byte
char 字符型 ‘u0000‘(空) ‘u0000‘ 到 ‘uFFFF‘ Character
short 短整数型 (short)0 -$2^15$ 到 $2^15$
﹣1 Short
int 整数型 0 ﹣$2^31$ 到 $2^31$﹣1 Integer
long 长整数型 0L ﹣$2^63$ 到 $2^63$﹣1 Long
float 单浮点型 0.0f 1.4e-45 到 3.4e+38 Float
double 双浮点型 0.0d 4.9e-324 到 1.798e+308 Double

我们可以看到除 char 的包装类 Character 和 int 的包装类 Integer之外,
其他基本数据类型的包装类只需要首字母大写即可。包装类的作用和特点,本文下半部分详细讲解。
这些都是我们很熟悉的知识了,那下面的知识你有了解吗?

你可能不知道的知识点

首先我们来看一道题目?
下面这段代码输出什么呢?

public class Demo1 
    public static void main(String[] args) 

        Integer number1 = 127;
        Integer number2 = 127;

        System.out.println("number1==number2判断的值为" + (number1 == number2));

        Integer number3 = 128;
        Integer number4 = 128;

        System.out.println("number3==number4判断的值为" + (number3 == number4));
    

让我们来看一下答案:

技术图片

number1number2均赋值为了127,number3number4均赋值为了128,
那为什么number1==number2truenumber3==number4false呢?

我们来看一下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);
    

我们看到如果传入的参数在[IntegerCache.low,IntegerCache.high]之间就返回IntegerCache.cache[i + (-IntegerCache.low)],如果值没在这里面,就创建一个新对象返回;
实际上这是一个 高频区间的数据缓存,我们再来看看IntegerCache类的实现:

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");
            if (integerCacheHighPropValue != null) 
                try 
                    int i = parseInt(integerCacheHighPropValue);
                    i = Math.max(i, 127);
                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                 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 < cache.length; k++)
                cache[k] = new Integer(j++);

            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        

        private IntegerCache() 
    

我们看到IntegerCache.low为-128,IntegerCache.high为127;
所以在通过valueOf方法创建Integer对象的时候,如果数值在[-128,127]之间,便返回指向IntegerCache.cache中已经存在的对象的引用;否则创建一个新的Integer对象。
与Integer类似,有高频区间数据缓存的包装类还有:

  • Byte:缓存区 -128~127
  • Short:缓存区 -128~127
  • Character:缓存区 0~127
  • Long:缓存区 -128~127
  • Integer:缓存区 -128~127

我们再来看一下以下代码:

public class Demo2 
        public static void main(String[] args) 

            Boolean bool1 = false;
            Boolean bool2 = false;
            Boolean bool3 = true;
            Boolean bool4 = true;

            System.out.println("bool1==bool2判断的值为"+(bool1==bool1));
            System.out.println("bool3==bool4判断的值为"+(bool3==bool4));
        

让我们来看一下答案:

技术图片

我们来看一下Boolean的valueOf代码:

public static Boolean valueOf(boolean b) 
        return (b ? TRUE : FALSE);
    

再来看一下TRUE和FALSE的定义:

public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);

可以看到它们使用静态 final 定义,就会返回静态值,所以答案2中返回都是true。

Double、Float的valueOf方法的实现是类似的,但是它们的valueOf与Integer、Short、Byte、Character、Long的不同。

我们再看一下下面的代码:

public class Demo3 
    public static void main(String[] args) 

        Double d1 = 20.0;
        Double d2 = 20.0;

        System.out.println("d1==d2判断的值为" + (d1 == d2));

        Double d3 = 30.0;
        Double d4 = 30.0;

        System.out.println("d3==d4判断的值为" + (d3 == d4));
    

让我们来看一下答案:

技术图片

看一下Double类型的valueOf的实现

public static Double valueOf(String s) throws NumberFormatException 
        return new Double(parseDouble(s));

它会返回一个新的Double对象。
看一下Float类型的valueOf的实现

public static Float valueOf(String s) throws NumberFormatException 
        return new Float(parseFloat(s));

Float类型的valueOf的实现与Double类型类似。

欢迎关注

扫下方二维码即可关注,微信公众号:code随笔

技术图片










java高阶部分知识点汇总-基本类型的包装类详讲

...装类可以直接互相赋值使用。本节内容将给大家介绍Java中的包装类。一.包装类现在我们已经非常清楚,Java是一门面向对象的语言。但是作为面向对象语言他也不得不包含8种不支持面向对象语法的基本数据类型,基本数据类型... 查看详情

java基础知识(java基本数据类型包装类)

...位于java.lang包,使用时不需要导入,系统自动导入。Java中的8个包装类分别是 查看详情

1.30号java复习题目——java的基本数据类型和包装类(基础知识整理)

1.基本数据类型Java基本数据按类型可以分为四大类:布尔型、整数型、浮点型、字符型,这四大类包含8种基本数据类型。布尔型:boolean整数型:byte、short、int、long浮点型:float、double字符型:char8种基本类型取值如下(了解查... 查看详情

深入浅出java中的包装类

前阵子,我们分享了《Java中的基本数据类型转换》这篇文章,对许多粉丝还是有带来帮助的,今天讲一下Java包装类的的由来,及自动装箱、拆箱的概念和原理。什么是包装类型Java设计当初就提供了8种基本数据类型及对应的8种... 查看详情

java包装类(代码片段)

一.什么是包装类    Java中的基本数据类型没有方法和属性,而包装类就是为了让这些拥有方法和属性,实现对象化交互。 数值型包装类都继承至Number,而字符型和布尔型继承至Object。二.基本数据和包装类之间的转换 ... 查看详情

java知识点梳理——装箱和拆箱

1、前言:Java是典型的面向对象编程语言,但其中有8种基本数据类型不支持面向对象编程,基本数据类型不具备对象的特性,没有属性和方法;Java为此8种基本数据类型设计了对应的类(包装类),使之相互转换,间接实现基本... 查看详情

在java中为什么每一个基本类型都有一个包装类型,他们的区别又是什么

...般是创建一个新的对象储存在堆里,然后我们通过栈中的引用来使用这些对象。所以Java中和C++一样,基本类型没有用new这个关键字来创建。但是Java是一个面对对象的编程语言,但是Java中的基本类型不是面向对... 查看详情

java核心:java中的装箱和拆箱

一、为什么需要装箱和拆箱?  基础数据类型是数据,不是对象,也不是Object的子类。Java为每种基本数据类型都提供了对应的包装器类型。装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为... 查看详情

java中的包装类

...型都对应了一种包装类。java是纯面向对象的语言,在java中的一切东西都可以用对象的形式表示,包括java中的基本数据类型。包装类中除了Integer和Character外,其他的包装类都是以java中的基本数据类型的首字母大写命名的。 &... 查看详情

java基本类型的类包装知识点总结

(1)Double类和Float类实现对double、float基本型数据的类包装。使用Double类的构造方法Double(doublenum)创建一个Double类型的数据,Double对象调用doubleValue()方法返回该对象含有的double型数据。Float、Byte、Integer、Short、Long类的用法类似。... 查看详情

java数据类型包装器

Java库在java.lang包中提供了八个类来表示八种基本类型中的每一种。这些类称为包装类,因为它们在对象中包装原始值。下表列出了原始类型及其相应的包装类。基本类型包装类byteByteshortShortintIntegerlongLongfloatFloatdoubleDoublecharCharac... 查看详情

java语言学习总结扩展篇包装类的概念及其使用(代码片段)

...,在类中定义一些方法,这个类叫做包装类我们可以使用类中的方法来操作这些基本类型的数据装箱和拆箱基本类型与对应的包装类对象之间,来回转换的过程称为”装箱“与”拆箱":●装箱:从基本类型转换为对应的包装类... 查看详情

java基本数据类型包装类

...926672920104902636829/Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基... 查看详情

浅析java中的包装类

1.包装类的介绍java是面向对象计算机语言但是不是完全的面向对象,8种基本数据类型不是面向对象的,但是java给我们创建了8种类来对这几种基本数据类型来创建对象,这8种类统称为包装类。具体如下:其中除Boolean和char类之外... 查看详情

java的包装类

java的包装类 Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基... 查看详情

java开发知识之java的包装类

...的包装类一丶什么是包装类    包装类的意思就是对基本数据类型封装成一个类.这些类都是Number的子类.区别就是封装数据类型不同.包含的方法基本相同.具体可以查询JAVAAPI.以整形包装类为例Integer类.位于Java.lang包.二丶包装... 查看详情

0513泛型和学生信息(代码片段)

....3【补充知识点包装类】Java中数据类型其实是分两大类 1.基本数据类型 byteshortintlongfloatdoublecharboolean 2.引用数据类型 Java中有一个概念 万物皆对象。 所以Java中对于基本数据类型也做了封装,完成了对于基本数据类型的【包装类... 查看详情

01java基本类型和包装类型的区别?

基本类型和包装类型的区别?1包装类型可以为null,而基本类型不可以数据库的查询结果可能是null,如果使用基本类型的话,因为要自动拆箱(将包装类型转为基本类型,比如说把Integer对象转换成int值),就会抛出NullPointerExcept... 查看详情