• 【转】java基本数据类型vs封装数据类型


    1、基本概念

    说java是面向对象的语言是正确的,但是她不纯,基本数据类型就不是对象。

    基本数据类型可以大致分为三类:
    数据型:int、short、long、byte、float、double
    字符型:char
    布尔型: boolean

    这些基本数据类型都有与这对应的封装数据类型:
    数字型:Integer、Short、Long、Byte、Float、Double
    字符型:Character
    布尔型:Boolean

    2、内存使用

    java的内存分运行时内存和存储型内存,分别是栈和堆。
    每个线程都有自己的运行栈,而堆是线程共享的存储空间,栈是为提高java运行速度而生,是小而快的瞬时内存,而堆则慢了一个数量级的存储内存,这种结构相当于电脑的内存和硬盘(贴切!)。
    栈中存放了基本数据类型和引用数据类型;堆中存储对象,包括jdk提供的原始对象、自定义对象、对象中的成员变量(包括基本数据类型)、数组。

    栈上内存由于是运行时内存,所以它的生存周期就是当前运行代码块或者函数的生存周期,随着运行结束就些基本数据类型就不存在了;而堆上内存是线程共享的,它的生存周期就没栈上内存这么简单,要由JVM的GC策略决定(以后再总结jvm一些知识)。

    举int、Integer的例子(例子都是局部变量,否则就误导观众了):
    int a=1;
    Integer b = new Integer(1);
    第一句中int a和1都存在于栈中,第二句中的b被分配在栈中,new Integer(1)在堆中分配。
    a和b都是引用,除去这两个比较一个内存占用,基本数据类型1占用了32位数据,而封装数据类型new Integer(1)则占用了128位,其中96位数据是说明这个对象,只有32位是有效数据。

    从内存分配看效率:
    栈上分配32位快了堆上分配128位数倍;
    栈上数据可共享:int a = 1; int b = 1;引用a和b不同,但1确是同一块数据;

    3、“优秀”代码案例

    public int compare(Integer f, Integer s) {
    return f == s ? 0 : 1;
    }

    当你调用compare(1,1)期待它返回0时,恭喜你中枪了,你的两个1已经被自动装箱了,比较的是两个引用,但它们是不可能相等的

    再来一个初始化方面的

    public class NullError {
    static Integer i;
    public static void main(String[] args) {
    if (i == 1) {
    System.out.println(“OK”);
    }
    }
    }

    上面的程序打印的不是OK,很遗憾是个空指针异常,因为i是对象,它的初始化值是null,解决方法很简单,将i改为基本数据类型int就可以了。

    再来一个性能方面的

    public static void main(String[] args) {
    Long sum = 0L;
    for (long i = 0; i < Integer.MAX_VALUE; i ++) {
    sum += i;
    }
    System.our.println(sum);
    }

    上面这个程序中sum被定义成了一个封装类型,在for循环中被反复的装箱、拆箱,对象被一次又一次的创建、销毁,导致明显的性能下降

    4、总结

    基本数据类型相比封装类型更简单、更速度,所以当我们有的选的时候应该尽量选择基本数据类型。
    当必须使用封装类型时一定要小心+谨慎,尤其要避免案例中的问题。

    为什么要有封装类型的存在呢?
    丰富了基本数据类型功能,还以Integer为例,它提供了字符串转数字、进制转换、最大最小值等等一系列的方便。
    集合类、泛型中不能使用基本数据类型。
    等等吧,反正都提供了

  • 相关阅读:
    javascript数据类型转换
    javascript运算符
    数据类型
    第一个JavaScript代码
    Javascript简介
    z-index
    Java代码优化
    Java中,什么是构造函数?什么是构造函数重载?什么是复制构造函数?
    java中继承条件下构造方法的执行过程
    java中的继承、重载和覆盖是什么意思
  • 原文地址:https://www.cnblogs.com/yanghj010/p/6030209.html
Copyright © 2020-2023  润新知