包装类

在实际应用中, 经常需要把基本数据类型转化为对象以便操作. 因此, Java在设计类时, 为每个基本数据类型设计了一个对应的类进行包装,

这样八个和基本数据类型对应的类统称为包装类(Wrapper Class).

包装类---------> java.lang包中

|:-----:|:-----:|
| 基本数据类型 | 包装类 |
| byte | Byte |
| boolean | Boolean |
| short | Short |
| char | Character |
| int | Int |
| long | Long |
| float | Float |
| double | Double |

除Character和Boolean类外, 其他的都是"数字型", "数字型"都是java.lang.Number的子类. Number类是抽象类, 因此它的抽象方法都需要在其子类当中实现. Number类提供了抽象方法:intValue(), langValue(), floatValue(), doubleValue(), 意味着所有的"数字型"包装类里都可以互相转型

包装类主要用途:

1.作为和基本数据类型对应的数据类型存在, 方便设计到对象的操作, 如Object[], 集合等操作

2.包含每种基本数据类型的相关属性, 如最大值, 最小值, 以及相关的操作方法(这些操作方法的作用是在基本数据类型, 包装类对象, 字符串三者之间提供相互之间的转化方法)

/*********************其他包装类用法类似*****************************/
public class WrapperClass {
void testInteger() {
// 基本类型转化成Integer对象
Integer int_1 = new Integer(10); // JDK9之后好像过时了
Integer int_2 = Integer.valueOf(20); // 官方推荐写法 // 包装对象之间的转化
Short int1 = int_1.shortValue();
Double int2 = int_1.doubleValue(); // Integer对象转化为int
int a = int_1.intValue(); // 字符串转化成Integer对象
Integer int_3 = Integer.parseInt("3334");
Integer int_4 = new Integer("99"); // Integer对象转化成字符串
String str_1 = int_3.toString(); // 一些常见int类型相关的常量
System.out.println("int能表示的最大整数: " + Integer.MAX_VALUE);
System.out.println("int能表示的最小整数: " + Integer.MIN_VALUE); System.out.print("int_3: ");
System.out.println(int_3);
System.out.print("int_4: ");
System.out.println(int_4);
} public static void main(String[] srgs) {
WrapperClass test = new WrapperClass();
test.testInteger();
}
} /*
int能表示的最大整数: 2147483647
int能表示的最小整数: -2147483648
int_3: 3334
int_4: 99
*/

自动装/拆箱

自动装箱和拆箱就是将基本数据类型和包装类之间进行自动的互换

JDK1.5之后, Java引入自动装/拆箱

自动装箱

基本类型的数据处于需要对象的环境中时, 会自动转换为对象

Integer i = 4在JDK1.5之前是非法的, 必须使用Integer i = new Integer(4)来实现基本数据类型转换为包装对象(new方法好像过时了)

JDK1.5之后Integer i = 4是正确的, 自动执行Integer i = Integer.valueof(5)

自动拆箱

每当需要一个值是, 对象会自动转换成基本类型, 没必要再显式调用intValue(), doubleValue()等转型方法

Integer i = 4;	// 自动装箱
int j = i; // 自动拆箱

总结

Integer i = 13;		// 自动装箱
// 相当于编译器自动执行下面语句
Integer i = Integer.valueOf(13); // 调用的是valueOf(13), 而不是new Integer(13) int j = i; // 自动拆箱
// 相当于编译器自动执行下面语句
int j = i.intValue();
  1. 自动装箱通过调用包装类的xxxx.ValueOf()方法实现(xxxx代表Integer, Short等)
  2. 自动拆箱通过调用包装类的VarName.xxxxValue()方法实现(xxxx代表int, short等)

自动装/拆箱的功能实际上是通过编译器来帮忙实现的, 编译器在编译时所依据的语法, 决定是否装箱

自动装/拆箱功能就是所谓的"编译器蜜糖", 虽然使用这个功能很方便, 但在程序运行过程中需了解Java语义, 注意包装类空指针异常

/***************包装类空指针异常****************/
public static void main(String[] srgs) {
Integer i = null; // 空指针
int j = i;
} /********************报错***********************
Exception in thread "main" java.lang.NullPointerException
at zyb.cn.WrapperClass.main(WrapperClass.java:37)
*/

包装类的缓存

整型, char类型所对应的包装类, 在自动装箱时, 对于-128~127之间的值会进行缓存处理, 其目的是为了提高效率

缓存处理的原理: 如果数据在-128~127之间, 那么在类加载时, 就已经为该类区间的每个数值创建了对象, 并将这256个对象存放到一个名为cache数组中. 每当自动装箱过程发生时(或者手动调用valueOf()), 就会先判断数据是否在该区间内, 如果在, 则直接获取数组中对应的包装类对象的引用, 如果不在, 则会通过new调用包装类的构造方法来创建对象

/********************Integer相关源码************************/
@HotSpotIntrinsicCandidate
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
} /*
* 1.IntegerCache类为Integer类的一个静态内部类, 仅供Integer类使用
* 2.一般情况下IntegerCache.low为-128, IntegerCache.high为127, IntegerCache.cache为内部类的一个静态属性, 相关源码如下
*/ /********************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 =
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() {}
}

由上面的源码可以看出, 静态代码块的目的就是初始化数组cache, 这个过程会在类加载时完成

/***************************测试例子****************************/
public static void main(String[] args) {
/*
* 缓存[-128, 127]之间的数字, 实际是系统初始的时候, 创建了[-128, 127]之间的一个缓存数组
* 当调用valueOf()时, 首先检查是否在[-128, 127]之间, 如果在这个范围则直接从缓存数组中拿出已经建好的对象
*如果不在这个范围, 则创建新的Integer()对象
*/
Integer in1 = -128;
Integer in2 = Integer.valueOf(-128);
System.out.println(in1 == in2); // true, 因为128在缓存内
System.out.println(in1.equals(in2)); System.out.println("############分隔符#############"); Integer in3 = 1280;
Integer in4 = 1280; System.out.println(in3 == in4); // false, 因为1280不在缓存内
System.out.println(in3.equals(in4));
} /*
true
true
############分隔符#############
false
true
*/

Java_包装类的更多相关文章

  1. Integer与int的区别(包装类和基本数据类型的区别)

    1. 默认值 int默认值为0,Integer的默认值为null.推论:Integer既可以表示null又可以表示0 2. 包装类中提供了该类型相关的很多算法操作方法 如把十进制装换为2进制(toBi ...

  2. final和包装类

    ==================================================================================================== ...

  3. java之数据结构之链表及包装类、包

    链表是java中的一种常见的基础数据结构,是一种线性表,但是不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针.与线性对应的一种算法是递归算法:递归算法是一种直接或间接的调用自身算法的过 ...

  4. 0024 Java学习笔记-面向对象-包装类、对象的比较、String常量池问题

    包装类 基本类型-->包装类 byte-->Byte short-->Short int-->Integer long-->Long char-->Characte ...

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

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

  6. Java学习_int和Integer的区别+包装类

    1.Java 中的数据类型分为基本数据类型和引用数据类型 int是基本数据类型,Integer是引用数据类型: Ingeter是int的包装类,int的初值为0,Ingeter的初值为null. 2. ...

  7. Java基础——基本类型和包装类、基本类型和字符串之间的转换

    基本类型和包装类之间的转换 基本类型和包装类之间经常需要互相转换,以 Integer 为例(其他几个包装类的操作雷同哦): 在 JDK1.5 引入自动装箱和拆箱的机制后,包装类和基本类型之间的转换就更 ...

  8. java : 包装类 缓冲机制的使用(转载)

    摘要: 八种基本数据类型和其包装类中 Integer valueOf(int i).Byte valueOf(byte b).Short valueOf(short s).Long valueOf(l ...

  9. Java学习笔记 05 数据包装类

    一.包装类 综述 >>java.lang包中的Integer类.Long类和Short类,分别将基本数据类型int.long和short封装成一个类.这些类都是Number的子类. Int ...

随机推荐

  1. 035 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 02 多重if结构

    035 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 02 多重if结构 本文知识点:Java中的多重if结构 选择结构回顾 if选择结构 注意: 1.条 ...

  2. npm包管理器报错-npm ERR! Response timeout while trying to fetch https://registry.npmjs.org/@XXX(over 30000ms)

    由于这两天买的新电脑在短期内频频蓝屏.卡机,不得不把自己其他的本本拿出来换上,但是程序员换电脑是真的痛苦,其他不说就说一个配环境 真的折腾哈 我是一名前端菜鸟,现在自己的本本上使用的是npm包管理工具 ...

  3. laravel 500错误的一种可能

    报这个错误,我一度认为,再加上,百度,大家都说是配置有问题,经过我不断地问我学长,结果就是一个小错误,简直太丢人了. 居然是少了一个括号的问题,自闭了

  4. c#之task与thread区别及其使用

    如果需要查看更多文章,请微信搜索公众号 csharp编程大全,需要进C#交流群群请加微信z438679770,备注进群, 我邀请你进群! ! ! --------------------------- ...

  5. AntDesign初体验

    AntDesign初体验 作为一个java开发也需要掌握一定的前端开发技能,毕竟靠人不如靠自己.再者,有时候一些小的改动自己就可以搞定了,就不用低三下四去求别人了: 安装Nodejs $ npm in ...

  6. 极简 Node.js 入门 - 5.2 url & querystring

    极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...

  7. 解决python的requests库在使用过代理后出现拒绝连接的问题

    在使用过代理后,调用python的requests库出现拒绝连接的异常 问题 在windows10环境下,在使用代理(VPN)后.如果在python中调用requests库来地址访问时,有时会出现这样 ...

  8. golang 爬取百度贴吧绝地求生页面

    package main import ( "github.com/antchfx/htmlquery" "io" "net/http" & ...

  9. 如何使用 Gin 和 Gorm 搭建一个简单的 API 服务 (三)

    修改数据结构   基本的 API 已经定义好了,现在是个修改 Person 对象结构的好时机.只要修改 Person 结构体,数据库和 API 都会自动做出相应的修改.   我要做的是在 Person ...

  10. spring boot:用redis+lua实现表单接口的幂等性(spring boot 2.2.0)

    一,什么是幂等性? 1,幂等: 幂等操作:不管执行多少次,所产生的影响都和一次执行的影响相同. 幂等函数或幂等方法:可以使用相同的参数重复执行,并能获得相同的结果的函数/方法. 这些函数/方法不用担心 ...