首页 > 编程语言 >java数据类型

java数据类型

时间:2023-09-25 12:03:04浏览次数:52  
标签:java 对象 虚拟机 数据类型 boolean 引用 类型 Java


Java虚拟机中,数据装型及其运算都是由Java虚拟机规范严格定义的。数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。

Java定义了8种基本数值类型:byte、short、int、long、char、float、double和boolean。

Java定义的引用类型包括:类类型,接口类型和数组。

java数据类型_Java

java语言中的所有基本类型同样也都是Java虚拟机中的基本装型。但是boolean有点特別,虽然Java虚拟机也把boolean看做基本类型。但是指令集对boolean只有很有限的支持, 当编译器把Java源码编译为字节码时,它会用int或byte来表示boolean。在Java虚拟机中, false是由整数零来表示的,所有非零整数部表示true。涉及boolean值的操作则会使用int。另外, boolean数组是当做byte数组来访问的,但是在“堆”区,它也可以被表示为位域。

除了boolean以外, Java语言中的基本类型构成了Java虚拟机中的数值装型. 虚独机中的数值类型分为两种:整数美型和浮点数类型。和Java语言一样, java虚拟机的基本类型的值域在任何地方都是一致的,比如,不管底层的主机平台是什么. 一个long在任何虚拟机中总是一个64位二进制补码表示的有符号整数。

Java虚拟机中还有一个只在内部使用的基本类型: returnAddress,它返回当前调用函数返回的地址,Java程序员不能使用这个类型。这个基本类型被用来实现Java程序中的finally子句。

Java是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper class),从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换。

8种基本数据类型所对应的包装类型为:

Byte、Short、Integer、Long、Character、Float、Double和Boolean

在JVM虚拟机中所占位数与字节数如下:

类型

位数

字节数

byte

8

1

short

16

2

int

32

4

long

64

8

float

32

4

double

64

8

char

16

2

Java虚拟机的引用类型被统称为“引用”(reference),有三种引用装型:类类型,接口类型, 以及数组类型, 它们的值都是对动态创建对象的引用 。 类类型的值是对类实例的引用;数组类型的值是对数组对象的引用, 在Java虚拟机中, 数组是个真正的对象, 而接口类型的值, 则是对实现了该接口的某个类实例的引用 。 还有一种特殊的引用值是null , 它表示该引用变量投有引用任何对象。

Java对象的大小

基本数据的类型的大小是固定的,这里就不多说了。对于非基本类型的Java对象,其大小就值得商榷。在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任何属性的对象的大小,看下面语句:

Object ob = new Object();

 这样在程序中完成了一个Java对象的声明,它所占的空间为:4byte+8byte。4byte是Java栈中保存引用的所需要的空间。而那8byte则是Java堆中对象的信息。因为所有的Java非基本类型的对象都需要默认继承Object对象,因此不论什么样的Java对象,其大小都大于8byte。

有了Object对象的大小,我们就可以计算其他对象的大小了。

Class NewObject {
    int count;
    boolean flag;
    Object ob;
}

其大小为:空对象大小(8byte)+int大小(4byte)+Boolean大小(1byte)+空Object引用的大小(4byte)=17byte。但是因为Java在对对象内存分配时都是以8的整数倍来分,因此大于17byte的最接近8的整数倍的是24,因此此对象的大小为24byte。

这里需要注意一下基本类型的包装类型的大小。因为这种包装类型已经成为对象了,因此需要把他们作为对象来看待。包装类型的大小至少是12byte(声明一个空Object至少需要的空间),而且12byte没有包含任何有效信息,同时,因为Java对象大小是8的整数倍,因此一个基本类型包装类的大小至少是16byte。这个内存占用是很恐怖的,它是使用基本类型的N倍(N>2),有些类型的内存占用更是夸张(随便想下就知道了)。因此,可能的话应尽量少使用包装类。在JDK5.0以后,因为加入了自动类型装换,因此,Java虚拟机会在存储方面进行相应的优化。

引用类型

对象引用类型分为强引用、软引用、弱引用和虚引用

强引用:就是我们一般声明对象是时虚拟机生成的引用,强引用环境下,垃圾回收时需要严格判断当前对象是否被强引用,如果被强引用,则不会被垃圾回收

软引用:软引用一般被做为缓存来使用。与强引用的区别是,软引用在垃圾回收时,虚拟机会根据当前系统的剩余内存来决定是否对软引用进行回收。如果剩余内存比较紧张,则虚拟机会回收软引用所引用的空间;如果剩余内存相对富裕,则不会进行回收。换句话说,虚拟机在发生OutOfMemory时,肯定是没有软引用存在的。

弱引用:弱引用与软引用类似,都是作为缓存来使用。但与软引用不同,弱引用在进行垃圾回收时,是一定会被回收掉的,因此其生命周期只存在于一个垃圾回收周期内。

强引用不用说,我们系统一般在使用时都是用的强引用。而“软引用”和“弱引用”比较少见。他们一般被作为缓存使用,而且一般是在内存大小比较受限的情况下做为缓存。因为如果内存足够大的话,可以直接使用强引用作为缓存即可,同时可控性更高。因而,他们常见的是被使用在桌面应用系统的缓存。

参考:

http://pengjiaheng.iteye.com/blog/518623

http://pengjiaheng.iteye.com/blog/519471

 

 

 

标签:java,对象,虚拟机,数据类型,boolean,引用,类型,Java
From: https://blog.51cto.com/u_6947107/7594389

相关文章

  • Java 8 Lambda 表达式解析
    Lambda表达式,也可称为闭包,它是推动Java8发布的最重要新特性。使用Lambda表达式可以使代码变的更加简洁紧凑。坦白的说,初次看见Lambda表达式瞬间头就大了,为了更好的理解,我们可以把Lambda表达式当作是一种匿名函数(对Java而言这并不完全正确,但现在姑且这么认为),简单地说,就是......
  • Java容器类详解
    Java的容器在Java中,我们想要保存对象可以使用很多种手段。最简单的就是数组。但是数组具有固定的尺寸,而通常来说,程序总是在运行时根据条件来创建对象,我们无法预知将要创建对象的个数以及类型,所以Java推出了容器类来解决这一问题。Java容器的基本概念Java容器类库是用来保存对象的,他......
  • 运行时数据区——Java虚拟机栈
     与程序计数器一样,Java虚拟机栈(JavaVirtualMachineStacks)也是线程私有的,它的生命周期与线程相同。Java栈以帧为单位保存线程的运行状态。每个方法在执行的时候都会创建一个栈帧用于存储局部变量表、操作栈、动态链接、方法出口等信息。虚拟机只会直接对Java栈执行两种操......
  • Java底层学习
    最近在看几本Java的书,也做了很多笔记,主要是关于Java虚拟机、JavaGC、Java并发编程等方面,参考的主要几本书籍有:《深入理解Java虚拟机》——周志明《深入理解Java虚拟机第二版》——美BillVenners《Java性能调优指南》——也是老美的《Java高并发程序设计》——葛一鸣本来想自己......
  • java web应用远程debug
    javaweb应用远程debug1、在启动参数中加入下面的参数address对应的端口可以修改-Xdebug-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=155552、添加远程服务3、填充服务名(任意)、远程服务的ip和对应的端口(和上面的参数address保持一致)4、debug启动服务5......
  • Java 常用类
    使用Scanner获取键盘输入hasNextXxx()是否还有下个输入项,其中Xxx可以是int、Long等代表基本数据类型的字符串。如果只是判断是否包含下一个字符串,则直接使用hasNext()nextXxx()获取下一个输入项publicclassScannerTest{publicstaticvoidmain(String[]args){......
  • spring boot错误之-Error (3, 32) java 程序包org springframework boot不存在
    问题:springboot错误之-Error(3,32)java程序包orgspringframeworkboot不存在用IDEA创建springboot,遇到上面的问题(我这里maven用的3.6.1版本)解决方法:在Settings里面,Maven路径和settings.xml要设置正确org.springframework.boot版本更改为2.1.0.RELEASE即可......
  • 9.24java wab实现创建新界面验证码
    <!DOCTYPEhtml><html><head><title>UserLogin</title><style>.container{width:300px;margin:0auto;padding:20px;border:1pxsolid#ccc;text-align:center;}.inpu......
  • Java LinkedList与ArrayList源码解析:根本区别和表面区别的详解
    在Java中,LinkedList和ArrayList是两个常见的集合类。它们都实现了List接口,但它们在实现方式上有很大的区别。本篇博客将详细解析LinkedList和ArrayList的源码,解释它们的根本区别和表面区别,并提供详细的代码解释。LinkedList与ArrayList的根本区别:数据结构:LinkedList是基于链表......
  • JAVA语法&包和访问控制
    目录前言一、Java包概述1.包的简介2.包的语法3.包的命名规则4.JDK类库里的包 5.怎么导包二、访问控制1.访问权限修饰符2.Static关键字作用前言在编写 Java一、Java包概述1.包的简介计算机中存放了若干类型的文档,为了管理方便,操作系统采用了树形结构的文件夹形式存放这些文档,并对......