- 浏览: 92780 次
- 性别:
- 来自: 北京
最新评论
-
JaHunter:
bootstrap示例:http://www.bootcss. ...
实用网址 -
JaHunter:
http://www.entrepreneur.com/art ...
read -
zdsong2009:
很受用,现在公司正(ˇˍˇ) 想做一个B2C,
B2C -
marshan:
停掉tomcat,然后删除temp目录下的东东。
java.io.NotSerializableException错误解决方法 -
JaHunter:
http://www.filamentgroup.com/la ...
实用网址
(写了很多 Java程序,也开发过很多Java项目,现在才决定要写点Java相关的系列文章,因为我对自己的文章没有绝对的信心,都是开发过程中的经验之谈,再加 上我自己以前考过SCJP证书,所以希望写点不误导读者的更加细节和详细的文章出来,所以希望有读者觉得有笔误的话留我的Email地址给我,而且为了不 误导读者,都使用了【草案】,谢谢大家的合作: silentbalanceyh@126.com )
【以下讲解都在 32bit 的系统中】
1.Java数据类型基本概念:
数据类型在计算机语言里面,是对内存位置的一个抽象表达方式,可以理解为针对内存的一种抽象的表达方式。接触每种语言的时候,都会存 在数据类型的认识,有复杂的、简单的,各种数据类型都需要在学习初期去了解,Java是强类型语言,所以Java对于数据类型的规范会相对严格。数据类型 是语言的抽象原子概念,可以说是语言中最基本的单元定义,在Java里面,本质上讲将数据类型分为两种:简单类型和复杂类型。
简单类型: 简单数据类型是不能简化的、内置的数据类型、由编程语言本 身定义,它表示了真实的数字、字符和整数。
复杂类型 :Java语言本身不支持C++中的结构(struct) 或联合(union)数据类型,它的复合数据类型一般都是通过类或接口进行构造,类提供了捆绑数据和方法的方式,同时可以针对程序外部进行信息隐藏。
2.Java中的 基本 类型:
1) 概念:
Java中的简单类型从概念上分为四种: 实数、整数、字符、布尔值 。但是有一点需要说明的是,Java里面只有八种原始类 型,其列表如下:
实数: double、float
整数: byte、short、int、 long
字符: char
布尔值: boolean
复杂类型和基本类型的内存模型本质上是不一样的,简单数据类型的存储原理是这样的:所有的简单数据类型不存在“引用”的概念,简单数 据类型都是直接存储在内存中的内存栈上的,数据本身的值就是存储在栈空间里面,而Java语言里面只有这八种数据类型是这种存储模型;而其他的只要是继承 于Object类的复杂数据类型都是按照Java里面存储对象的内存模型来进行数据存储的,使用Java内存堆和内存栈来进行这种类型的数据存储,简单地 讲,“引用”是存储在有序的内存栈上的,而对象本身的值存储在内存堆上的。
2) 详细介绍:
Java的简单数据 讲解 列表如下:
int: int为 整数 类型,在存储的时候,用 4个字节 存储,范围为 -2,147,483,648 到2,147,483,647 ,在变 量初始化的时候, int 类型的默认值为 0 。
short : short 也 属于 整数 类 型,在存储的时候,用 2 个字节 存储,范围为 -32,768 到 32,767 ,在变量初始化的时候, short 类型的默认值为 0 ,一般情况下,因为 Java 本 身转型的原因,可以直接写为 0 。
long : long 也 属于 整数 类 型,在存储的时候,用 8 个字节存储,范围为 -9,223,372,036,854,775,808 到 9,223,372,036, 854,775,807 ,在变量初始化的时候, long 类型的默认值为 0L 或 0l ,也可直接写为 0 。
byte : byte 同 样属于 整数 类 型,在存储的时候,用 1 个字节 来存储,范围为 -128 到 127 ,在变量初始化的时候, byte 类型的默认值也为 0 。
float : float 属 于 实数 类 型,在存储的时候,用 4 个字节 来存储,范围为 32 位 IEEEE 754 单精度 范 围,在变量初始化的时候, float 的默认值为 0.0f 或 0.0F ,在初始化的时候可以写 0.0 。
double : double 同样属于 实数 类型,在存储的时候,用 8 个字节 来存储,范围为 64 位 IEEE 754 双精度 范 围,在变量初始化的时候, double 的默认值为 0.0 。
char : char 属 于 字符 类 型,在存储的时候用 2 个字节 来存储,因为 Java 本身的字符集不是用 ASCII 码来进行存储,是使用的 16 位 Unicode 字符集,它的字符范围即是 Unicode 的字符范围 ,在变量初始化的时候, char 类型的默认值为 'u0000' 。
boolean : boolean 属于 布尔 类型,在存储的时候不使用字节,仅仅使用 1 位 来存储,范围仅仅为 0 和 1 ,其字面量为 true 和 false ,而 boolean 变量在初始化的时候变量的默认值为 false 。
3) 相关介绍:
在 Java 基本类型在使用字面量赋值的时候,有几个简单的特性如下:
【 1 】当整数类型的数据使用字面量赋值的 时候,默认值为 int 类型,就是直接使用 0 或者其他数字的时候,值的类型为 int 类型,所以当使用 long a = 0 这种赋值方式的时候, JVM 内部存在数据转换。
【 2 】当实数类型的数据使用字面量赋值的时候,默认值为 double 类型,就是当字面两出现的时候, JVM 会使用 double 类型的数据类型。
( * :以上两点在转型中进行详细说明。)
【 3 】从 JDK 5.0 开始, Java 里面出现了自动拆箱解箱的操作,基于这点需要做一定的说明:
对应原始的数据类型,每种数据类型都存在一个复杂类型的封装 类,分别为 Boolean 、 Short 、 Float 、 Double 、 Byte 、 Int 、 Long 、 Character ,这些类型都是内置的封装类,这些封装类( Wrapper )提供了很直观的方法,针对封装类需要说明的是,每种封装类都有 一个 xxxValue() 的方法,通过这种方法可以把它引用的对象里面的值转化成为原始 变量的值,不仅仅如此,每个封装类都还存在一个 valueOf(String) 的方法直接把字符串对象转换为相应的简单类型。
在 JDK 5.0 之前,没有存在自动拆解箱的操作,即 Auto Box 操作,所以在这之前是不能使用以下方式的赋值代码的:
Integer a = 0; // 这种赋 值方式不能够在 JDK 1.4 以及以下的 JDK 编译器 中通过
但是 JDK 5.0 出现了自动拆解箱的操作,所以在 JDK 5.0 以上的编译器中,以上的代码是可以通过的,关于自动拆箱解箱我会 另外用一篇 1.4 到 5.0 的升级加以详细说明。
3.Java 中简基本数据类型的转型:
Java 中的简单数据类型的转换分为两种: 自 动转换和强制转换
1) 自动转换:
当一个较“小”的数据和较“大”的数据一起运算的时候,系统将自动将较“小”的数据转换为较“大”的数据,再进行运算。
在方法调用过程,如果实际参数较“小”,而函数的形参比较“大”的时候,除非有匹配的方法,否则会直接使用较“大”的形参函数进行调 用。
2) 强制转换:
将“大”数据转换为“小”数据时,可以使用强制类型转换,在强制类型转换的时候必须使用下边这种语句:
int a = (int)3.14;
只是在上边这种类型转换的时候,有可能会出现精度损失。
关于类型的自动提升,遵循下边的规则:
所有的 byte 、 short 、 char 类型的值将提升为 int 类型;
如果有一个操作数是 long 类型,计算结果是 long 类型;
如果有一个操作数是 float 类型,计算结果是 float 类型;
如果有一个操作数是 double 类型,计算结果是 double 类型;
自动类型转换图如下:
byte -> short(char) -> int -> long -> float -> double
如果是强制转换的时候,就将上边的图反过来
3) 转换附加:
当两个类型进行自动转换的时候,需要满足条件:【 1 】这两种类型是兼容的,【 2 】目的类型的数值范围应该比源转换值的范围要大。而拓展范围就遵 循上边的自动类型转换树,当这两个条件都满足的时候,拓展转换才会发生,而对于几个原始类型转换过程,根据兼容性 boolean 和 char 应该是独立的,而其他六种类型是可以兼容的,在强制转换过程,唯 独可能特殊的是 char 和 int 是可以转换的,不过会使用 char 的 ASCII 码值比如:
int a = (int)'a';
a 的值在转换过后输出的话,值为 97 ;
4.Java 中的高精度数:
Java 提供了两个专门的类进行高精度运算: BigInteger 与 BigDecimal ,虽然 Java 原始变量都具有对应的封装类型,但是这两个 变量没有对应的原始类型,而是通过方法来提供这两种类型的一些运算,其含义为普通类型能够做的操作,这两个类型对应都有,只是因为精度过大可能效率不够 高。至于这两个类的具体操作可以参考 JDK 的相关 API 文档。
5. 关于数据类型的一些技巧:(以下为参考一篇原文文档)
若要求精度的结果,尽量避免使用 float 和 double :
float 和 double 类型本身是为了做科学运算,即执行二进 制浮点运算而设计,但是却不能提供完全精确的结果,所以在要求精度的数值中,避免使用 float 和 double , float 和 double 在货币运算中尤其不合适,要让 float 和 double 精确表达 0.1 也是不可能的事。测试一下下边这段代码就明白 了:
System.out.println(2.02-0.42);
结果是不是出乎意料,这个结果并不是偶然,而是 JVM 本身设计的目的决定的。 而要解决这个问题,最好的办法是使用 BigDecimal 、 int 或者 long 进行相关运算,特别是货币运算,使用 BigDecimal 代替 double 是一个很好的办法。
BigDecimal 唯一的缺点在于: BigDecimal 没有相对 应的原始类型,所以在进行基本数值运算的时候,需要进行方法调用才能操作,这样会使得和我们的编程习惯不相符合,若使用 int 和 long ,就需要进行简单的封装运算。
所以在要求精度答案的计算任务里面,一般慎用 float 和 double ,如果在进行商务运算,并且要求四舍五入或者简单的舍入行为,使用 BigDecimal 可能更加方便。所以尽量避免在精度运算中使用 float 和 double ,特别是我们常用的货币运算。
5. 总结:
以上是开发过程中针对 Java 数据类型的一份总结,最后一个技巧是在一个 商务系统运算的时候发现的,然后参考了网上的很多文档,偶然在一篇 BLOG 中发现的,原文提倡在 精度运算中尽量不用 float 和 double ,而关于 Java 的基本数据类型,上边应该涵盖了所有开发会用到的内容,还有一点就是在于几个特殊值的比较,这里没有做说明,比如 Double.NaN == Double.NaN 输出为 false ,等等所有封装类的特殊类型,没有进行详 细说明。
原文地址:http://docs.google.com/Doc?docid=0AXJpK9YuEe6pZGM5ZDd3ODNfN2d3NWhwcWc4&hl=en
发表评论
-
统计代码行数
2013-11-20 10:47 518public class ReadFile { ... -
常用验证方法
2013-11-20 10:44 5151.正则表达式 /** ... -
DateUtil
2013-11-20 10:42 679DateUtil 1.取得当前日期“年”,并判断此年 ... -
set相关
2013-11-20 10:41 517ArrayList 允许快速随机存取,相比于Link ... -
集合排序
2013-11-20 10:38 957集合排序(BigDecimal、根据对象某个属性排序) ... -
编程良好习惯
2013-03-22 21:38 673转: 对于面向对象编程语言,有5个基本原则能帮助你写出整洁 ... -
关于dll文件的生成以及找不到jni.h的解决办法
2010-08-02 18:48 1702来源:http://jzgl-javaeye.iteye.co ... -
java 产生随机数的几种方式
2010-07-12 12:57 1318一.在j2se里我们可以使用Math.random()方法来产 ... -
关于session的详细解释
2010-07-04 15:24 887一、术语session 在我的经验里,session这个 ... -
java文件操作
2010-06-28 13:36 792import java.io.*; public cl ... -
mysql 删除多余重复记录
2010-03-25 00:30 1655(stu表中的名字(name)是重复的) 问题: 在Mys ... -
proxool连接池
2009-12-18 10:50 706proxool 在hibernate.cfg.xml中加入 & ... -
tomcat虚拟主机配置
2009-11-13 15:41 620tomcat:虚拟主机配置 在server.xml中 &l ... -
struts国际化手动切换
2009-11-11 16:19 1303当页面请求时,把本地信息(主要为Accept-Language ... -
JAVA中如何用接口实现多继承和多态
2009-11-07 17:57 932JAVA里没有多继承,一 ... -
servlet,jsp乱码及解决方案
2009-11-07 11:40 2371MIME多用途Internet邮件扩 ... -
jstl数字格式
2009-07-22 11:45 1062<fmt:formatNumber value=&quo ... -
jstl日期
2009-07-22 11:43 1571<%@ page language="java ... -
Hibernate代码小集
2009-07-17 21:09 10061.hibernate:查找总共多少条记录 L ... -
mysql
2009-07-13 08:48 1096备份数据库:在mysql的bin目录下, C:\Progra ...
相关推荐
### Java基本数据类型详解 #### 一、引言 在Java编程语言中,理解基本数据类型对于编写高效、可靠的程序至关重要。本文将详细介绍Java中的基本数据类型,包括它们的定义、范围、存储空间以及如何在实际开发中正确...
java基本数据类型
非常明了的介绍了JAVA的基本数据类型,为以后打好坚实基础。
java基本数据类型和数组,java编制0-255之间的UNICODE编码表
**一、Java基本数据类型** 1. **整型(Integral Types)** - `byte`: 占用1字节,取值范围-128到127。 - `short`: 占用2字节,取值范围-32,768到32,767。 - `int`: 占用4字节,取值范围-2,147,483,648到2,147,...
Java 基本数据类型详解 Java 是一种面向对象的编程语言,Java 语言中有两大类数据类型:基本数据类型和引用数据类型。基本数据类型是 Java 语言的基础,理解基本数据类型是学习 Java 的关键。 Java 基本数据类型有...
Java 基本数据类型与数组 Java 中的基本数据类型是指在 Java 中可以使用的最基本的数据类型,包括布尔型、字符型、整数型、浮点型等八种基本数据类型。这些基本数据类型是 Java 语言的基础,理解它们对于学习 Java ...
### Java基本数据类型及其封装类 Java是一种广泛使用的面向对象编程语言,支持多种数据类型来满足不同的编程需求。其中,基本数据类型是最基础且最常用的元素之一。它们直接存储值而不是对象引用,因此效率较高。...
JAVA的基本数据类型
### 2016年Java基本数据类型介绍 #### 一、引言 Java作为一门广泛应用的编程语言,在企业级应用开发中占据了重要的地位。它不仅适用于电信、银行等行业,而且在其他各种业务场景中也得到了广泛的应用。本文将详细...
"Java基本数据类型" Java 是一种强类型语言,意味着每一个变量都必须有一个声明的类型。在 Java 中,有两种类型:基本类型(primitive type)和复合数据类型(reference type)。 一、逻辑类(boolean) 在 Java ...
java基本数据类型模型
Java基本数据类型习题解析 Java是一种 objeto-orientada 编程语言,基本数据类型是Java语言的基础,它们是构建其他数据类型的基本单元。在Java中,有八种基本数据类型:byte、short、int、long、float、double、...
Java是一种广泛使用的面向对象...以上就是从题目中提取的Java基本数据类型和变量相关的知识点,涵盖了标识符规则、保留字、数据类型、变量、溢出、作用域、类型转换等方面的内容。这些知识是理解和编写Java程序的基础。