Saul's blog Saul's blog
首页
后端
分布式
前端
更多
分类
标签
归档
友情链接
关于
GitHub (opens new window)

Saul.J.Wu

立身之本,不在高低。
首页
后端
分布式
前端
更多
分类
标签
归档
友情链接
关于
GitHub (opens new window)
  • Java入门基础

    • 计算机常识

    • Java语言概述

    • 基本语法

    • 数组

    • 面向对象

      • 面向对象
      • 类和对象
      • 类的成员-属性
      • 类的成员-方法
      • 类的成员-构造器
      • 面向对象特性-封装
      • this关键字
      • package关键字
      • import关键字
      • 面向对象特征-继承
      • 方法的重写
      • 访问权限修饰符
      • super关键字
      • 子类对象实例化的全过程
      • 面向对象特征-多态
      • 强制类型转换
      • Object类
      • 包装类
        • 包装类wrapper
        • 基本数据类型转换为包装类
        • 包装类转换为基本数据类型
        • 自动装箱与自动拆箱
        • 基本数据类型包装类与String的相互转换
        • 包装类常见面试题
        • 总结
      • static关键字
      • 单例设计模式
      • main方法
      • 类的成员-代码块
      • final关键字
      • 抽象类与抽象方法
      • 接口
      • 类的成员-内部类
    • 异常处理

  • Java核心基础

  • 设计模式

  • Web开发

  • SpringBoot

  • 微服务

  • Elasticsearch

  • 运维

  • 后端
  • Java入门基础
  • 面向对象
SaulJWu
2020-12-13

包装类

# 包装类wrapper

  • 针对八种基本数据类型定义相应的引用类型—包装类(封装类)
  • 有了类的特点,就可以调用类中的方法,Java才是真正的面向对象

image-20201215012004239

有了包装类以后,才能使用多态,能以多态的方式作为参数传输。

# 基本数据类型转换为包装类

装箱:包装类使得一个基本数据类型的数据变成了类。

基本数据类型包装成包装类的实例---装箱

通过包装类的构造器实现:

int i = 500;
Integer t = new Integer(i);
1
2

还可以通过字符串参数构造包装类对象:

Float f = new Float(“4.56”);
Long l = new Long(“asdf”);  //NumberFormatException
1
2

有了类的特点,可以调用类中的方法:

String s = f.toString();
1

# 包装类转换为基本数据类型

拆箱:将数字包装类中内容变为基本数据类型。

获得包装类对象中包装的基本类型变量---拆箱

调用包装类的.xxxValue()方法:

boolean b = bObj.booleanValue();
1
int j = t.intValue();
1

包装类不适合运算,需要转换为基本数据类型才适合运算。

# 自动装箱与自动拆箱

JDK1.5之后,支持自动装箱,自动拆箱。但类型必须匹配。

Integer i = 100;//自动装箱
Boolean b = false;//自动装箱
int num = i;//自动拆箱
1
2
3

注意Boolean默认为null,不是false。

# 基本数据类型包装类与String的相互转换

字符串转换成基本数据类型

通过包装类的构造器实现:

int i = new Integer("12");
1

包装类在实际开发中用的最多的在于字符串变为基本数据类型。

通过包装类的parseXxx(String s)静态方法:

Float f = Float.parseFloat("12.1");
1

基本数据类型转换成字符串

调用字符串重载的valueOf()方法:

String fstr= String.valueOf(2.34f);
1

更直接的方式:

String intStr = 5 + "";
1

连接字符串。

# 包装类常见面试题

面试题1

Object o1 = true ? new Integer(1) : new Double(2.0);
System.out.println(o1);
1
2

结果是1.0。

为什么结果不是1,编译的时候,三元运算符要求数据类型一致,整数类型自动提升为浮点型了。

面试题2

Object o2;
if (true) {
    o2 = new Integer(1);
}else{
    o2 = new Double(2.0);
}
System.out.println(o2);
1
2
3
4
5
6
7

结果是1。

这里没要求数据类型是一致,所以不会发生数据类型的自动提升

面试题3

Integer i = new Integer(1);
Integer j = new Integer(1);
System.out.println(i == j);//false

Integer m = 1;
Integer n = 1;
System.out.println(m == n);//true

Integer x = 128;
Integer y = 128;
System.out.println(x == y);//false
1
2
3
4
5
6
7
8
9
10
11

第一个是false,因为比较的引用地址。

第二个是true,第三个是false

来看看Integer源码:

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() {}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

在Integer源码中,有一个内部类IntegerCache,内部类里面有个数组,这个数组缓存了-128到127,目的是提高效率。

所以当Integer为1时,直接引用缓存中的值,两个对象的引用地址都是一样的,所以返回true,当Integer为128时,它不在缓存范围内,所以每次都要去new一个对象,两个对象的引用地址不一样,所以返回false。

# 总结

image-20201215012851751

帮我改善此页面 (opens new window)
#包装类#wrapper
上次更新: 2020/12/18, 12:50:58
Object类
static关键字

← Object类 static关键字→

最近更新
01
zabbix学习笔记二
02-28
02
zabbix学习笔记一
02-10
03
Linux访问不了github
12-08
更多文章>
Theme by Vdoing | Copyright © 2020-2022 Saul.J.Wu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式