【转】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为例,它提供了字符串转数字、进制转换、最大最小值等等一系列的方便。
集合类、泛型中不能使用基本数据类型。
等等吧,反正都提供了
【转】java基本数据类型vs封装数据类型的更多相关文章
- java封装数据类型——Boolean
众所周知,java对常见的原始数据类型都提供了对应的封装类型,增加一些常用的特性(如 计算hash值.比较相等.类型转换等),以扩展他们对数据处理的能力,使得他们更好地适应面向对象编程的各种场景.今天 ...
- java封装数据类型——Long
Long 是长整型 long 的封装数据类型.我们知道 long 相对于 int 的差异就是数据表示的范围扩大了,其它大部分特性都是一样的.所以 Long 跟 Integer 大部分方法都是相同的. ...
- java封装数据类型——Integer
今天来学习整型 int 的封装数据类型,Integer. 1. 定义 首先来看看定义.可以看到,Integer 继承 Number 抽象类,实现了 Comparable 接口.Number 类是常用数 ...
- Java的8种基本数据类型
待整理主题:Java的8种基本数据类型与对应封装类型.拆箱.装箱 =================================================================== ...
- 由java的八个基本数据类型说开去
Java中定义了四类/八种基本数据类型: 布尔型----boolean 字符型----char 整数型----byte,short,int,long 浮点型----float,double 这八种基本 ...
- JAVA中分为基本数据类型及引用数据类型
一.基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768 ...
- Java数据类型和MySql数据类型对应一览
类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述 VARCHAR L+N VARCHAR java.lang.String 12 CHAR N ...
- java数据类型,hibernate数据类型,标准sql数据类型之间的对应表
Hibernate API简介 其接口分为以下几类: l 提供访问数据库的操作的接口: l 用于配置Hibernate的接口: l 回调接口 l ...
- Java数据类型(基本数据类型)学习
Java数据类型(基本数据类型)学习 与其他语言一样,Java编程同样存在,比如int a,float b等.在学习变量之前我就必须先了解Java的数据类型啦. Java的数据类型包括基本数据类型和引 ...
随机推荐
- Python学习笔记015——文件file的常规操作之三(标准输入输出文件)
1 标准输入输出文件 在Python中,模块sys中含有标准的输入输出文件 sys.stdin 标准输入方法(一般是键盘) sys.stdout 标准输出方法(到显示器的缓冲输出) sys ...
- Python学习笔记010——匿名函数lambda
1 语法 my_lambda = lambda arg1, arg2 : arg1 + arg2 + 1 arg1.arg2:参数 arg1 + arg2 + 1 :表达式 2 描述 匿名函数不需要r ...
- php 文件上传,下载
文件下载: html: <html> <body> <a href="1.rar">下载1.rar</a> <br /> ...
- USB的中断说明
STM32的USB模块可以产生三种中断:USB唤醒中断.USB高优先级中断和USB低优先级中断,在STM32的参考手册中没有详细说明这三种中断对应哪些事件,现说明如下: 1)USB唤醒中断:在中断向量 ...
- STM32F4—fsmc的配置步骤
0:开启GPIO时钟和FSMC时钟 1:配置GPIO 2:配置片选控制寄存器 3:配置片选时序寄存器 4:配置写入时序寄存器 GPIO_InitTypeDef GPIO_InitStructure;/ ...
- k8s的容器监测探针
大部分的应用程序我们在部署的时候都会适当的添加监控,对于运行载体容器则更应该如此.kubernetes提供了 liveness probes来检查我们的应用程序.它是由节点上的kubelet定期执行的 ...
- Oracle学习笔记之四,SQL语言入门
1. SQL语言概述 1.1 SQL语言特点 集合性,SQL可以的高层的数据结构上进行工作,工作时不是单条地处理记录,而对数据进行成组的处理. 统一性,操作任务主要包括:查询数据:插入.修改和删除数据 ...
- WIN10中运行ASP出错
一个项目用ASP做的,想在WIN中IIS建立网站部署起来,开始怎么弄都不行,运行总是出现那句英文,后来才知道要在IIS中的网站的ASP选项中的调试属性中把发送错误到到浏览器打开,这样才能发现程序报错, ...
- android studio - 暂停AndroidStudio中的Git
解决办法 AndroidStudio 打开 Setting>Plugins 找到Git Integer 取消插件(将右边钩钩去掉) restart AndroidStudio done
- java.net.DatagramPacket/java.net.DatagramSocket-UDP Socket编程
UDP 的 Java 支持 UDP 协议提供的服务不同于 TCP 协议的端到端服务,它是面向非连接的,属不可靠协议,UDP 套接字在使用前不需要进行连接.实际上,UDP 协议只实现了两个功能: 在 I ...
