首页 > 其他分享 >包装类

包装类

时间:2024-08-05 13:41:11浏览次数:12  
标签:拆箱 Java 包装 数据类型 对象 装箱

包装类

一.什么是包装类

包装类(Wrapper Classes)在Java中是指将基本数据类型(如int、double、char等)封装成对象的类。这些类都是Java类库的一部分,它们为每种基本数据类型提供了一个对应的类,使得基本数据类型能够以对象的形式存在和操作。包装类不仅为基本数据类型提供了对象的封装,还提供了许多有用的方法,比如类型转换、解析字符串为基本数据类型等。

二.包装类的特点

  1. 封装性:将基本数据类型封装成对象,使得它们可以存储在集合中(如List、Set等),因为集合只能存储对象。
  2. 提供方法:包装类提供了一系列的方法,用于操作封装的基本数据类型。例如,Integer类提供了parseInt(String s)方法,用于将字符串转换为整数。
  3. 自动装箱和拆箱:从Java 5(也称为Java 1.5)开始,引入了自动装箱(Autoboxing)和自动拆箱(Unboxing)机制。这意味着在基本数据类型和对应的包装类之间进行赋值时,Java编译器会自动完成装箱和拆箱操作,无需程序员显式调用包装类的构造器或转换方法。
  4. 缓存机制:对于某些包装类(如IntegerShortByteCharacterBoolean),Java在自动装箱时会使用缓存机制。对于Integer来说,当数值在-128到127之间时,Java会返回缓存中的对象,而不是创建新的对象。这可以提高性能并减少内存消耗。

三.基本数据类型与包装类

在Java中,基本数据类型(Primitive Types)和包装类(Wrapper Classes)是两种不同但紧密相关的数据类型表示方式。它们之间的主要区别在于,基本数据类型是Java语言内置的,用于直接存储数据值,而包装类则是将基本数据类型封装成对象,提供了更多的功能和灵活性。

基本数据类型

Java定义了八种基本数据类型,它们分别是:

  • byte:8位带符号整数
  • short:16位带符号整数
  • int:32位带符号整数
  • long:64位带符号整数
  • float:32位IEEE 754单精度浮点数
  • double:64位IEEE 754双精度浮点数
  • boolean:表示真假的值
  • char:16位Unicode字符

基本数据类型直接存储数据值,并且具有固定的大小和性能特性。它们不是对象,因此不能调用方法,也不能被赋予null值(除了boolean,但它本身就不包含null的概念)。

包装类

包装类是与基本数据类型相对应的类,它们分别是:

  • Byte
  • Short
  • Integer
  • Long
  • Float
  • Double
  • Boolean
  • Character

包装类将基本数据类型封装成对象,使得它们可以像其他对象一样被操作。包装类提供了许多有用的方法,比如类型转换(parseInt(), parseDouble()等)、字符串表示(toString())、值比较(equals())等。此外,包装类对象可以被赋予null值,这是它们与基本数据类型的一个重要区别。

基本数据类型与包装类的关系

  • 自动装箱与拆箱:从Java 5(Java 1.5)开始,Java引入了自动装箱和拆箱机制。这意味着在基本数据类型和对应的包装类之间进行赋值时,Java编译器会自动完成装箱(将基本数据类型转换为包装类对象)和拆箱(将包装类对象转换为基本数据类型)操作。
  • 性能:虽然包装类提供了更多的功能和灵活性,但在处理大量数据时,使用基本数据类型通常会有更好的性能,因为基本数据类型直接在内存中存储数据值,而包装类对象则包含了对基本数据类型的封装和额外的信息(如对象头、类型信息等)。
  • 用途:基本数据类型通常用于存储数据值,而包装类则更多地用于需要对象行为的场景,比如将基本数据类型存储在集合中、使用泛型、或者调用对象特有的方法等。

示例

// 基本数据类型的使用  
int num = 10;  
  
// 包装类的使用  
Integer numWrapper = Integer.valueOf(10); // 手动装箱  
int numFromWrapper = numWrapper.intValue(); // 手动拆箱  
  
// 自动装箱与拆箱  
Integer autoBoxed = 10; // 自动装箱  
int autoUnboxed = autoBoxed; // 自动拆箱

在Java编程中,理解基本数据类型与包装类之间的区别和联系是非常重要的,这有助于编写更高效、更灵活的代码。

四.包装类共同点

Java中的包装类具有多个共同点,这些共同点主要体现在它们的设计、功能和实现上。以下是包装类的一些主要共同点:

1. 封装基本数据类型

  • 包装类将Java中的基本数据类型(如int、double、char等)封装为对象。这使得基本数据类型能够以对象的形式存在和操作,从而提供了更多的灵活性和功能。

2. 提供额外的方法

  • 包装类提供了一系列额外的方法,这些方法使得对基本数据类型的操作更加丰富和灵活。例如,Integer类提供了parseInt(String s)方法用于将字符串转换为整数,toString()方法用于将整数转换为字符串等。

3. 实现Comparable接口

  • 大多数包装类都实现了Comparable接口,这使得它们支持比较操作。通过实现compareTo(T other)方法,包装类对象可以与其他相同类型的对象进行比较,以确定它们的大小关系。

4. 重写Object类的方法

  • 所有包装类都重写了

    Object
    

    类的一些方法,如

    equals(Object obj)
    

    hashCode()
    

    。这些方法在包装类对象进行比较和哈希表存储时非常重要。

    • equals(Object obj):用于判断两个包装类对象是否相等。在包装类中,这个方法通常会比较对象内部封装的基本数据类型值,而不是对象的引用地址。
    • hashCode():返回一个对象的哈希码值,这个值在对象的哈希表存储中非常重要。对于包装类对象,hashCode()方法通常会基于内部封装的基本数据类型值来计算哈希码。

5. 缓存机制

  • 对于某些包装类(如IntegerShortByteCharacterBoolean),Java在自动装箱时会使用缓存机制。这意味着对于特定范围内的值(如Integer的-128到127),Java会返回缓存中的对象,而不是创建新的对象。这有助于提高性能和减少内存消耗。

6. 提供了与String的转换方法

  • 包装类通常提供了将自身转换为String类型的方法(如toString()),以及将String类型解析为包装类对象的方法(如parseInt()parseDouble()等)。这使得包装类与字符串之间的转换变得非常方便。

7. 不可变性

  • 除了String类之外,包装类对象也是不可变的。一旦一个包装类对象被创建并初始化,其内部封装的基本数据类型值就不能被改变。这有助于保持数据的一致性和安全性。

8. 泛型适用性

  • 包装类可以作为泛型类型参数使用,而基本数据类型则不能。这使得包装类在泛型编程中更加灵活和强大。

综上所述,Java中的包装类在封装基本数据类型、提供额外方法、实现Comparable接口、重写Object类方法、使用缓存机制、提供与String的转换方法、保持不可变性以及支持泛型等方面具有多个共同点。这些共同点使得包装类在Java编程中扮演着非常重要的角色。

五.自动装箱/拆箱

自动装箱(Autoboxing)和自动拆箱(Unboxing)是Java 5(也称为Java 1.5)引入的特性,它们简化了基本数据类型与其对应的包装类之间的转换过程。这两个过程是由Java编译器自动完成的,因此得名自动装箱和自动拆箱。

自动装箱

自动装箱是指将基本数据类型(如int、double等)的值自动转换为对应的包装类对象(如Integer、Double等)的过程。这个过程是在编译时由Java编译器自动完成的,而不需要程序员显式地调用包装类的构造器。

示例

int num = 10;  
Integer numWrapper = num; // 自动装箱

在上面的示例中,num是一个基本数据类型int的变量,而numWrapper是一个Integer类型的变量。将num赋值给numWrapper时,Java编译器会自动将num的值包装成一个Integer对象,并将其赋值给numWrapper

自动拆箱

自动拆箱是指将包装类对象自动转换为对应的基本数据类型值的过程。这个过程也是在编译时由Java编译器自动完成的,而不需要程序员显式地调用包装类的转换方法(如intValue()doubleValue()等)。

示例

Integer numWrapper = 10; // 实际上是自动装箱  
int num = numWrapper; // 自动拆箱

在上面的示例中,numWrapper是一个Integer类型的变量,而num是一个基本数据类型int的变量。将numWrapper赋值给num时,Java编译器会自动将numWrapper对象拆箱,获取其内部封装的基本数据类型值,并将其赋值给num

注意事项

  1. 性能:虽然自动装箱和拆箱提供了便利,但它们可能会引入额外的性能开销。因为装箱涉及到对象的创建和内存分配,而拆箱涉及到对象的类型转换。在性能敏感的代码中,应该避免不必要的装箱和拆箱操作。
  2. 空指针异常:自动拆箱时,如果包装类对象为null,则会抛出NullPointerException。因为基本数据类型不能是null,所以拆箱操作必须确保包装类对象不是null
  3. 缓存:对于某些包装类(如IntegerShortByteCharacterBoolean),Java在自动装箱时会使用缓存机制。这意味着在特定范围内(如Integer的-128到127)的值会被重用,而不是每次都创建新的对象。这有助于减少内存分配和垃圾回收的开销。
  4. 设计原则:在设计API时,应该考虑使用包装类还是基本数据类型。如果API的参数或返回值可能为null,则应该使用包装类;否则,使用基本数据类型可能更为合适。

标签:拆箱,Java,包装,数据类型,对象,装箱
From: https://www.cnblogs.com/yhy373286277/p/18343033

相关文章

  • 【Java】包装类型变量的形参传递,方法内修改后,方法外还是原值?
    背景前几天有个朋友写代码时,想把int变量作为形参传入方法中进行修改后,在方法外能够获取到修改后的变量进行下一步操作。类似这样:classTest{publicstaticvoidmain(String[]args){intx=1;add(x);System.out.println(x);}pub......
  • c++function bind包装器详解
    包装器function包装器function包装器也叫适配器,c++中的function本质是一个类模板,也是一个包装器,那么为什么需要包装器呢。template<classF,classT>TuseF(Ff,Tx){staticintcount=0;cout<<"count:"<<++count<<endl;cout<<"count:&q......
  • 【数据结构】包装类和泛型
     ......
  • 如何将输入暗淡从 fit 方法传递到 skorch 包装器?
    我正在尝试将PyTorch功能合并到scikit-learn环境中(特别是Pipelines和GridSearchCV),因此一直在研究skorch神经网络的标准文档示例看起来像importtorch.nn.functionalasFfromtorchimportnnfromskorchimportNeuralNetClassifierclassMyModule......
  • java包装类型缓存简单探究-Integer为例
    文章目录包装类型缓存自动装箱与valueOf感悟结语包装类型缓存包装类型缓存是什么本文以常用的Integer包装类为例做一个探索,感兴趣可以用类似方法查看其他包装类。我们都知道它会缓存-128到127之间的整数Integer对象。结论大伙都知道。那么我们今天就来探究一下底......
  • 如何判断一个函数是否被另一个特定函数包装?
    使用下面的代码:defwrap(x):defwrapped(y):returnx+yreturnwrappedf=wrap(1)是否可以看出f是一个被函数包裹的函数wrap?显示变量f,它是可见的:>>>f<functionwrap.<locals>.wrappedat0x10067cf40>但是有没有办法确定|||被......
  • 可包装对象
    std::function模板类是一个通用的可调用对象的包装器,用简单的、统一的方式处理可调用对象。#include<iostream>#include<functional>usingnamespacestd;voidshow(intage,conststring&message){ cout<<"age"<<age<<"message"<<......
  • cimport 包装 C 库的 cython 模块
    我有这种C/cython项目:project/├──src/│└──modules/│├──cython1.pyx│├──cython1.pxd│├──cython2.pyx│├──cython2.pxd│├──includes/││├──c1.h││├──c1.c│......
  • Java基础-基本类型和包装类型
    基本类型Java有八种基本类型intfloatdoublelongbooleancharshortbyte基本类型如果是局部变量,那它们的位置会在虚拟机栈种。如果是成员变量它们会存放在堆中。包装类型相对应的Java也有八种包装类型IntFloatDoubleLongBooleanCharShortByte区别1.默认值:......
  • C++11 包装器
    前文C++11lambda表达式-CSDN博客C++11新的类功能&&可变参数模板-CSDN博客C++11右值引用和移动语义-CSDN博客function包装器1.概念        目前我们知道的可调用对象有:函数指针(类型定义太复杂),仿函数对象(要定义一个类,用的时候有点麻烦,不适合做类型统一),lam......