首页 > 编程语言 >08 | JAVA包装类型

08 | JAVA包装类型

时间:2022-09-02 08:23:39浏览次数:62  
标签:JAVA java 包装 08 int 类型 Integer byte 100

包装类型

我们已经知道,Java的数据类型分两种:

  • 基本类型:byteshortintlongbooleanfloatdoublechar
  • 引用类型:所有classinterface类型

引用类型可以赋值为null,表示空,但基本类型不能赋值为null

如何把一个基本类型视为对象(引用类型)?

比如,想要把int基本类型变成一个引用类型,我们可以定义一个Integer类,它只包含一个实例字段int,这样,Integer类就可以视为int的包装类(Wrapper Class):

public class Integer {
    private int value;

    public Integer(int value) {
        this.value = value;
    }

    public int intValue() {
        return this.value;
    }
}

定义好了Integer类,我们就可以把intInteger互相转换:

Integer n = null;
Integer n2 = new Integer(99);
int n3 = n2.intValue();

实际上,因为包装类型非常有用,Java核心库为每种基本类型都提供了对应的包装类型:

基本类型 对应的引用类型
boolean java.lang.Boolean
byte java.lang.Byte
short java.lang.Short
int java.lang.Integer
long java.lang.Long
float java.lang.Float
double java.lang.Double
char java.lang.Character

Auto Boxing 和 Auto Unboxing

Integer n = 100; // 编译器自动使用Integer.valueOf(int)
int x = n; // 编译器自动使用Integer.intValue()

装箱和拆箱会影响代码的执行效率,因为编译后的class代码是严格区分基本类型和引用类型的。

不变类

所有的包装类型都是不变类。我们查看Integer的源码可知,它的核心代码如下:

对两个Integer实例进行比较要特别注意:绝对不能用==比较,因为Integer是引用类型,必须使用equals()比较:

因为Integer.valueOf()可能始终返回同一个Integer实例,因此,在我们自己创建Integer的时候,以下两种方法:

  • 方法1:Integer n = new Integer(100);
  • 方法2:Integer n = Integer.valueOf(100);

方法2更好,因为方法1总是创建新的Integer实例,方法2把内部优化留给Integer的实现者去做,即使在当前版本没有优化,也有可能在下一个版本进行优化。

我们把能创建“新”对象的静态方法称为静态工厂方法Integer.valueOf()就是静态工厂方法,它尽可能地返回缓存的实例以节省内存。

创建新对象时,优先选用静态工厂方法而不是new操作符。

进制转换

  • 转数字 parseInt
  • 数字转字符串 toString toHexString ...
public class Main {
    public static void main(String[] args) {
        System.out.println(Integer.toString(100)); // "100",表示为10进制
        System.out.println(Integer.toString(100, 36)); // "2s",表示为36进制
        System.out.println(Integer.toHexString(100)); // "64",表示为16进制
        System.out.println(Integer.toOctalString(100)); // "144",表示为8进制
        System.out.println(Integer.toBinaryString(100)); // "1100100",表示为2进制
    }
}

有用的静态变量

// boolean只有两个值true/false,其包装类型只需要引用Boolean提供的静态字段:
Boolean t = Boolean.TRUE;
Boolean f = Boolean.FALSE;
// int可表示的最大/最小值:
int max = Integer.MAX_VALUE; // 2147483647
int min = Integer.MIN_VALUE; // -2147483648
// long类型占用的bit和byte数量:
int sizeOfLong = Long.SIZE; // 64 (bits)
int bytesOfLong = Long.BYTES; // 8 (bytes)

最后,所有的整数和浮点数的包装类型都继承自Number,因此,可以非常方便地直接通过包装类型获取各种基本类型:

// 向上转型为Number:
Number num = new Integer(999);
// 获取byte, int, long, float, double:
byte b = num.byteValue();
int n = num.intValue();
long ln = num.longValue();
float f = num.floatValue();
double d = num.doubleValue();

无符号整型 toUnsignedInt()静态方法

在Java中,并没有无符号整型(Unsigned)的基本数据类型。byteshortintlong都是带符号整型,最高位是符号位

例如,byte是有符号整型,范围是-128`+127`,但如果把`byte`看作无符号整型,它的范围就是`0`255。我们把一个负的byte按无符号整型转换为int

public class Main {
    public static void main(String[] args) {
        byte x = -1;
        byte y = 127;
        System.out.println(Byte.toUnsignedInt(x)); // 255
        System.out.println(Byte.toUnsignedInt(y)); // 127
    }
}

标签:JAVA,java,包装,08,int,类型,Integer,byte,100
From: https://www.cnblogs.com/mmxingye/p/16648476.html

相关文章

  • 09 | JavaBean一种类的格式
    JavaBean在Java中,有很多class的定义都符合这样的规范:若干private实例字段;通过public方法来读写实例字段。如果字段是xyz,那么读写方法名分别以get和set开头,并且后......
  • 10 | JAVA枚举类enum
    枚举类enumpublicclassMain{publicstaticvoidmain(String[]args){Weekdayday=Weekday.SUN;if(day==Weekday.SAT||day==Weekda......
  • 11 | JAVA纪录类Record
    纪录类(也是一种不变类)使用String、Integer等类型的时候,这些类型都是不变类,一个不变类具有以下特点:定义class时使用final,无法派生子类;每个字段使用final,保证创建实例......
  • 【突然想多了解一点】可以用 Task.Run() 将同步方法包装为异步方法吗?
    【突然想多了解一点】可以用Task.Run()将同步方法包装为异步方法吗?本文翻译自《ShouldIexposeasynchronouswrappersforsynchronousmethods?-StephenToub》,原......
  • Java-JDBC和mysql的使用
    1.MySqlJDBC(JavaDataBaseConnection)是通过JAVA访问数据库,需要对数据库有基本的理解和应用。MySql作为常见的数据库,在中小型网站经常被使用;其中包含了mysql服务器......
  • Java Web技术栈
    SpringBootMaven<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instanc......
  • 2022 年 8 月 JavaScript 新闻和更新
    2022年8月JavaScript新闻和更新向所有JavaScript崇拜者致敬!很遗憾夏天结束了,但我们准备了一份最新的JavaScript新闻摘要来让你振作起来。今天,您将熟悉我们全新......
  • java.beans.BeanInfo
    可用通过BeanInfo接口创建BeanInfo类,并提供关于bean的方法、属性、事件和其他特性的显式信息。通用方式BeanInfobeanInfo=Introspector.getBeanInfo(TradeTransaction......
  • [Java]零基础入门学习Day(1)
    Java环境的搭建Java开发工具Eclipse的下载与安装Java的第一个程序("HelloWorld") 一.Java环境的搭建1.下载JDK 首先我们需要下载java的开发工具包JDK,下载地址:......
  • Day 5 java
    Scanner的用法首先引用import库importjava.util.Scanner;下面输入时Scannerscanner=newScanner(System.in);Stringname=scanner.next();charAt(i)name.char......