您的位置:首页 > 编程语言 > Java开发

java基础复习(5)

2014-08-18 12:36 148 查看
本文资料http://blog.csdn.net/mazhimazh/article/category/1907605

我们知道Java中数据类型分为引用类型以及基本数据类型,其结构如下图所示



1)基本数据类型

java中基本数据类型分为四类八种,其大小在java中都是固定的




1.1)boolean与Boolean

1.1.1)boolean

boolean所表示出来的信息是1bit,但是字节是计算机里最小的可寻址单元,那我们的boolean如果是1/8 byte的话则jvm必定要对boolean进行特殊的处理(指令),但查阅资料得知java并没有对boolean类型进行特殊的处理,那么现在出现了一个问题,java中boolean类型如果是在java中分配的内存是1位的话,那么
它又是如何处理的呢?

翻阅sum对于boolean类型的描述




从描述信息来看,boolean表现出来的信息是1位的信息,但是实际大小并没有明确定义,看到这里就感觉很奇怪了,那boolean类型的在java中到底分配了多大的大小呢?为此,翻阅了google和百度,原来关于这个问题讨论的专题真不少

http://www.importnew.com/1305.html
http://blog.csdn.net/ithomer/article/details/7310008
http://bbs.csdn.net/topics/190122943
http://hi.baidu.com/nwsuafers/item/5c3939481aeea4066dc2f01b
看了这么些资料,在http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.3.4的2.3.4节关于boolean类型的介绍有这么段话




这个地方明确说出了,在虚拟机里boolean在编译时候会用int或者byte表示,false用证书0表示,而true用非零整数表示,所有单个boolean类型所分配的大小和int是一样的为4byte,但是boolean数组的时候,则每个boolean会分配一个字节大小的内存,boolean数组会被当成byte数组进行访问,所以每个boolean占1byte

Java虚拟机不提供操作boolean类型的字节码指令,程序在编译后boolean类型都转化成了int操作。但是Java虚拟机支持boolean类型的数组的访问和修改,共用byte类型数组的字节码指令。

所以综上所述,单个boolean在jvm中分配的内存和int一样4个字节,而boolean数组中每个boolean所占内存和byte一样为1byte

1.1.2)Boolean

Boolean对象作为boolean的封装对象,jvm所分配的大小在后面会统一记录,现在就看下Boolean封装的一些方法




这里我们看下getBoolean和parseBoolean方法,话说这两个乍一看是不是感觉一样的(这两个方法的确有点难以分辨),所以在这个地方特地记录一下,其实parseBoolean是真的从字符串转boolean,那getBoolean是干什么的?看下java的对于此方法的解释




翻译下来:

public static boolean getBoolean(String name)当且仅当以参数命名的系统属性存在,且等于"true" 字符串时,才返回 true。(从 JavaTM 1.0.2 平台开始,字符串的测试不再区分大小写。)通过 getProperty 方法可访问系统属性,此方法由 System 类定义。如果没有以指定名称命名的属性或者指定名称为空或 null,则返回 false。

1.2)byte和Byte

1.2.1)byte

关于byte在jvm中的存储看到这篇资料 但是目前还是不确定 只是做个记录 还得查资料进行补充

http://blog.csdn.net/nethibernate/article/details/5578911
在java中byte所占内存大小是1byte即8位

1.2.2)Byte

在我的一篇博客“一些表达式的陷阱”中的5题关于Integer的测试,那个问题是不是很奇怪,其实在Byte中也存在这样的问题,下面我们啦通过源代码来看下这个问题。




这个cache在什么时候进行初始化呢?是在ByteCache静态类加载的时候,通过运行static静态块来完成的。那么这个静态内部类到底在什么时候加载呢?肯定是在valueOf()方法中调用的时候。试想一下,如果在Byte类加载的时候就对这256个Byte数进行缓存,那么有可能会造成资源的浪费。因为程序可能根本用到不。所以如上的写法已经把缓存数组延迟到最迟加载了,也就是第一次在使用Byte数值的时候,默认都会调用valueOf() 方法,事实证明在对Byte进行Byte
a=1定义赋值的时候就会默认调用valueOf方法,具体资料参照http://blog.csdn.net/mazhimazh/article/details/17681787

1.3)char和Character

1.3.1)char

char在Java中是16位的,因为Java用的是Unicode,可以取的范围是0~65535(十六进制为0~OxFFFF),而且ASCLL码值也是存在里面的,在0-127

1.3.2)Character

Character是char的包装类

1.4)short和Short

1.4.1)short

short在java中是16位的,取值这些就可以不说了,下面来直接看个程序




我们看到这个地方是报错的,它的错是




很明显,它的错是说不能从int转为ishort,我们感觉很奇怪了 ,我压根没用int怎么会报这个错呢?原来






1.4.2)Short

Short作为short类型的包装类,提供的方法都差不多

1.5)int和Integer

1.4.1)int

int作为整数的基本类型,所占的内存大小为4个字节

1.4.2)Integer

Integer作为int的封装类,而int作为证书的基本类型,所以我们要求Integer的中方法是非常高的,所以在Integer中,他们使用 了大量的位运算来提高效率

http://blog.csdn.net/mazhimazh/article/details/17684701
1.6)String

java中字符串使用的非常频繁,说到String,下面的这个资料不错

http://sarin.iteye.com/blog/603684/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: