基本类型和引用类型

Java中的数据类型有两类:

l  基本类型(又叫内置数据类型,或理解为值类型)

l  引用类型

基本类型和引用类型的区别

1.  从概念方面来说

基本类型:变量名指向具体的数值

引用类型:变量名指向存数据对象的内存地址

2.  从内存构建方面来说

基本类型:变量在声明之后java就会立刻分配给他内存空间

引用类型:它以特殊的方式(类似C指针)指向对象实体(具体的值),这类变量声明时不会分配内存,只是存储了一个内存地址。

3.  从使用方面来说

基本类型:使用时需要赋具体值,判断时使用“==”号

引用类型:使用时可以赋null,判断时使用equals方法

Java 基本类型

​Java的每种基本类型所占存储空间的大小是固定的。它们的大小不像其他大多数语言那样随机器硬件架构的变化而变化。这种不变性是Java程序相对其他大多数语言而言,更容易移植的原因之一。

所有数值类型都有正负号,所以不要去寻找无符号的数值类型。

基本类型的分类

与绝大多数编程语言类似,Java也支持数值型、字符型、布尔型数据。

Java语言提供了8种基本类型,大致分为4

整数型

byte:8位,最大存储数据量是255,存放的数据范围是-128~127之间。

short:16位,最大数据存储量是65536,数据范围是-32768~32767之间。

int:32位,最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1。

long:64位,最大数据存储容量是2的64次方减1,数据范围为负的2的63次方到正的2的63次方减1。

浮点型

float:32位,数据范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F。

double:64位,数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加。

字符型

char:16位,存储Unicode码,用单引号赋值。

布尔型

boolean:只有true和false两个取值。

基本类型取值范围表

例:对于数值类型的基本类型的取值范围,我们无需强制去记忆,因为它们的值都已经以常量的形式定义在对应的包装类中了。

publicclass PrimitiveDemo  {

publicstaticvoid main(String[] args) {

// byte

System.out.printf("基本类型:byte 二进制位数:%d\n", Byte.SIZE);

System.out.printf("包装类:%s\n", Byte.class.getName());

System.out.printf("最小值(Byte.MIN_VALUE): 0x%x(十六进制), %d(十进制)\n", Byte.MIN_VALUE,  Byte.MIN_VALUE);

System.out.printf("最大值(Byte.MAX_VALUE): 0x%x(十六进制), %d(十进制)\n\n", Byte.MAX_VALUE,  Byte.MAX_VALUE);

// short

System.out.printf("基本类型:short 二进制位数:%d\n", Short.SIZE);

System.out.printf("包装类:%s\n", Short.class.getName());

System.out.printf("最小值(Short.MIN_VALUE): 0x%x(十六进制), %d(十进制)\n", Short.MIN_VALUE,  Short.MIN_VALUE);

System.out.printf("最大值(Short.MAX_VALUE): 0x%x(十六进制), %d(十进制)\n\n", Short.MAX_VALUE,  Short.MAX_VALUE);

// int

System.out.printf("基本类型:int 二进制位数:%d\n", Integer.SIZE);

System.out.printf("包装类:%s\n", Integer.class.getName());

System.out.printf("最小值(Integer.MIN_VALUE): 0x%x(十六进制), %d(十进制)\n", Integer.MIN_VALUE,  Integer.MIN_VALUE);

System.out.printf("最大值(Integer.MAX_VALUE): 0x%x(十六进制), %d(十进制)\n\n", Integer.MAX_VALUE,  Integer.MAX_VALUE);

// long

System.out.printf("基本类型:long 二进制位数:%d\n", Long.SIZE);

System.out.printf("包装类:%s\n", Long.class.getName());

System.out.printf("最小值(Long.MIN_VALUE): 0x%x(十六进制), %d(十进制)\n", Long.MIN_VALUE,  Long.MIN_VALUE);

System.out.printf("最大值(Long.MAX_VALUE): 0x%x(十六进制), %d(十进制)\n\n", Long.MAX_VALUE,  Long.MAX_VALUE);

// float

System.out.printf("基本类型:float 二进制位数:%d\n", Float.SIZE);

System.out.printf("包装类:%s\n", Float.class.getName());

System.out.printf("最小值(Float.MIN_VALUE): %s\n", Float.toString(Float.MIN_VALUE));

System.out.printf("最大值(Float.MAX_VALUE): %s\n\n", Float.toString(Float.MAX_VALUE));

// double

System.out.printf("基本类型:double 二进制位数:%d\n", Double.SIZE);

System.out.printf("包装类:%s\n", Double.class.getName());

System.out.printf("最小值(Double.MIN_VALUE): %s\n", Double.toString(Double.MIN_VALUE));

System.out.printf("最大值(Double.MAX_VALUE): %s\n\n", Double.toString(Double.MAX_VALUE));

// char

System.out.printf("基本类型:char 二进制位数:%d\n", Character.SIZE);

System.out.printf("包装类:%s\n", Character.class.getName());

System.out.printf("最小值(Character.MIN_VALUE): 0x%x(十六进制), %d(十进制)\n", (int)  Character.MIN_VALUE, (int) Character.MIN_VALUE);

System.out.printf("最大值(Character.MAX_VALUE): 0x%x(十六进制), %d(十进制)\n\n", (int)  Character.MAX_VALUE, (int) Character.MAX_VALUE);

}

}

输出:

基本类型:byte 二进制位数:8

包装类:java.lang.Byte

最小值(Byte.MIN_VALUE):  0x80(十六进制), -128(十进制)

最大值(Byte.MAX_VALUE):  0x7f(十六进制), 127(十进制)

基本类型:short 二进制位数:16

包装类:java.lang.Short

最小值(Short.MIN_VALUE):  0x8000(十六进制), -32768(十进制)

最大值(Short.MAX_VALUE):  0x7fff(十六进制), 32767(十进制)

基本类型:int 二进制位数:32

包装类:java.lang.Integer

最小值(Integer.MIN_VALUE):  0x80000000(十六进制), -2147483648(十进制)

最大值(Integer.MAX_VALUE):  0x7fffffff(十六进制), 2147483647(十进制)

基本类型:long 二进制位数:64

包装类:java.lang.Long

最小值(Long.MIN_VALUE):  0x8000000000000000(十六进制),  -9223372036854775808(十进制)

最大值(Long.MAX_VALUE):  0x7fffffffffffffff(十六进制),  9223372036854775807(十进制)

基本类型:float 二进制位数:32

包装类:java.lang.Float

最小值(Float.MIN_VALUE):  1.4E-45

最大值(Float.MAX_VALUE):  3.4028235E38

基本类型:double 二进制位数:64

包装类:java.lang.Double

最小值(Double.MIN_VALUE):  4.9E-324

最大值(Double.MAX_VALUE):  1.7976931348623157E308

基本类型:char 二进制位数:16

包装类:java.lang.Character

最小值(Character.MIN_VALUE):  0x0(十六进制), 0(十进制)

最大值(Character.MAX_VALUE):  0xffff(十六进制), 65535(十进制)

数据类型间的转换

自动转换

一般情况下,定义了某数据类型的变量,就不能再随意转换。但是JAVA允许用户对基本类型做有限度的类型转换。

如果符合以下条件,则JAVA将会自动做类型转换:

1)由数据转换为数据

显而易见的是,“小”数据类型的数值表示范围小于“大”数据类型的数值表示范围,即精度小于“大”数据类型。

所以,如果“大”数据向“小”数据转换,会丢失数据精度。比如:long转为int,则超出int表示范围的数据将会丢失,导致结果的不确定性。

反之,“小”数据向“大”数据转换,则不会存在数据丢失情况。由于这个原因,这种类型转换也称为扩大转换

这些类型由“小”到“大”分别为:(byteshortchar)< int long float double

这里我们所说的“大”与“小”,并不是指占用字节的多少,而是指表示值的范围的大小。

2)转换前后的数据类型要兼容

由于 boolean 类型只能存放 true 或 false,这与整数或字符是不兼容的,因此不可以做类型转换。

3)整型类型和浮点型进行计算后,结果会转为浮点类型

long x = 30;
float y = 14.3f;
System.out.println("x/y = " + x/y);

运行结果

x/y = 1.9607843

可见 long 虽然精度大于 float 类型,但是结果为浮点数类型。

强制转换

在不符合自动转换条件时或者根据用户的需要,可以对数据类型做强制的转换。

转换方式为:在数值的前面用一个括号"()"把要强制转换的类型标注出来。

float f = 25.5f;
int x = (int)f;
System.out.println("x = " + x);

装箱和拆箱

Java中基本类型的包装类如下:

Byte <-> byte

Short <-> short

Integer <-> int

Long <-> long

Float <-> float

Double <-> double

Character <-> char

Boolean <-> boolean

装箱

装箱是将值类型转换为引用类型

例:

Integer i1 = new Integer(10); // 非自动装箱

Integer i2 = 10; // 自动装箱

System.out.println("i1 = " + i1);

System.out.println("i2 = " + i2);

拆箱

拆箱是将引用类型转换为值类型

int i1 = new Integer(10); // 自动拆箱

Integer tmp = new Integer(20);

int i2 = tmp.intValue(); // 非自动拆箱

System.out.println("i1 = " + i1);

System.out.println("i2 = " + i2);

为何需要装箱

一种最普通的场景是,调用一个含类型为Object的参数的方法,该Object可支持任意类型(因为Object是所有类的父类),以便通用。当你需要将一个值类型(如Int32)传入时,需要装箱。

另一种用法是,一个非泛型的容器,同样是为了保证通用,而将元素类型定义为Object。于是,要将值类型数据加入容器时,需要装箱。

自动装箱、自动拆箱

基本数据(Primitive)类型的自动装箱(boxing)、拆箱(unboxing)是自Java SE5开始提供的功能。

Java SE5之前的形式:

Integer i1 = new Integer(10); // 非自动装箱

Java SE5之后:

Integer i2 = 10; // 自动装箱

Java对于自动装箱和拆箱的设计,依赖于一种叫做享元模式的设计模式(有兴趣的朋友可以去了解一下源码,这里不对设计模式展开详述)。

[Java 基础]数据类型的更多相关文章

  1. Java基础-数据类型应用案例展示

    Java基础-数据类型应用案例展示 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.把long数据转换成字节数组,把字节数组数据转换成long. /* @author :yinz ...

  2. Java基础-数据类型int,short,char,long,float,double,boolean,byte

    Java语言是静态类型的(statical typed),也就是说所有变量和表达式的类型再编译时就已经完全确定.由于是statical typed,导致Java语言也是强类型(Strong typed ...

  3. java基础数据类型包装类

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  4. 谈谈Java基础数据类型

    Java的基本数据类型 类型 意义 取值 boolean 布尔值 true或false byte 8位有符号整型 -128~127 short 16位有符号整型 -pow(2,15)~pow(2,15 ...

  5. Java基础数据类型二进制转换

    前言: 本文主要介绍java基础类型的二进制转换和二进制的基本概念. 二进制: 1,二进制是以0和1为码,逢2进1,比如3=11=1*2+1. 2,在计算机当中其它进制的算法基本基于2进制,因为计算机 ...

  6. java基础-数据类型之殇

    一 前言 Java的数据类型分为2种,分别是基本数据类型和引用数据类型:java的数据类型是强数据类型,意味着每声明一个变量,其必定有与之对应的数据类型:面试常问的java8大基本数据类型其实是基本数 ...

  7. Java 基础数据类型

    Java 提供的基础数据类型(也称内置数据类型)包含:整数类型.浮点类型.字符类型.布尔类型. 整数类型 整数类型变量用来表示整数的数据类型.整数类型又分为字节型(byte).短整型(short).整 ...

  8. [未完成]关于java基础数据类型中的一些总结

    java基本数据类型转换图: 有时候也把char型成为字符型,是加上字符型也是一种特殊的整数类型.

  9. 【Demo 0001】Java基础-数据类型

    本章学习要点:       1.  了解Java 语言       2.  了解Java程序结构;        3.  了解Java中基本数据类型;       4.  掌握基本数据类型之间的运算 ...

  10. JAVA基础数据类型

    JAVA的数据类型粗略分两种 1.基本数据类型 整数类型: byte,short,int,long 浮点类型: float,double 字符类型: char 布尔类型: boolean 基本语法格式 ...

随机推荐

  1. poj1200-Crazy Search(hash入门经典)

    Hash:一般是一个整数.就是说通过某种算法,可以把一个字符串"压缩" 成一个整数.一,题意: 给出两个数n,nc,并给出一个由nc种字符组成的字符串.求这个字符串中长度为n的不同 ...

  2. 设置Android Studio启动时可选最近打开过的工程

    Android Studio启动时,默认会打开最近关闭的工程. 如果想Android Studio在启动时,打开欢迎界面(Welcome to Android Studio界面),则可以通过设置Set ...

  3. Call for Papers International Conference for Smart Health (ICSH) 2014

    Call for PapersInternational Conference for Smart Health (ICSH) 2014 Beijing, China July 10-11, 2014 ...

  4. 一个基于Orchard的开源CRM --coevery简介

    Coevery是开源的.NET Web平台项目,力争打造一个开放而鲁棒的CRM系统,采用Orchard架构,并使用AngularJS改善页面体验.作为一个后发优势的CRM 产品,Coevery 具有一 ...

  5. C#实现DNS解析服务和智能DNS服务

    C#实现DNS解析服务有一个开源项目ARSoft.Tools.Net, ARSoft.Tools.Net是一个非常强大的开源DNS控件库,包含.Net SPF validation, SenderID ...

  6. Windows+GCC下内存对齐的常见问题

    结构/类对齐的声明方式 gcc和windows对于modifier/attribute的支持其实是差不多的.比如在gcc的例子中,内存对齐要写成: class X { //... } __attrib ...

  7. [异常解决] ubuntu上安装JLink驱动遇到的坑及给后来者的建议

    一.前言 最近将整个电脑格式化,改成了linux操作系统 希望这样能让自己在一个新的世界探索技术.提升自己吧- win上的工具用多了,就不想变化了- 继上一篇<ubuntu上安装虚拟机遇到的问题 ...

  8. Win7&Ubuntu12.04 双系统引导问题

    周末的时候手贱,重装系统,导致原来的ubuntu12.04和win7双系统的引导不见了,所以在此进行一下说明,如何修复. 1. win7和ubuntu12.04双系统引导修复 问题描述:    在重装 ...

  9. Understanding RabbitMQ Exchange & Queue

    Exchanges are the only places where messages could be published to; while queues are the only places ...

  10. FPGrowth算法总结复习

    摘要: 1.算法概述 2.算法推导 3.算法特性及优缺点 4.注意事项 5.实现和具体例子 6.适用场合 内容: 1.算法概述 关联规则(associatio rules):从大规模数据集中寻找物品建 ...