JAVA基本数据类型与引用数据类型


Java提供了两类数据类型:一种是基本类型(原始类型),一种是引用类型。

- 数据类型图:

┏数值型━┳━整数型:byte short int long

┏基本数据类型━━┫             ┗━浮点型:float double

┃                         ┣字符型:char

数据类型╋                         ┗布尔型:boolean

┃                        ┏类(class)

┗引用数据类型━━╋接口(interface)

┗数组(array)

- 基本数据类型

数据类型 大小(bit) 范围 默认值 包装类
byte(字节) 8 -128 - 127 0 Byte
shot(短整型) 16 -32768 - 32767 0 Boolean
int(整型) 32 -2147483648-2147483647 0 Short
long(长整型) 64 -9233372036854477808-9233372036854477807 0 Character
float(浮点型) 32 -3.40292347E+38-3.40292347E+38 0.0f Integer
double(双精度) 64 -1.79769313486231570E+308-1.79769313486231570E+308 0.0d Long
char(字符型) 16 ‘ \u0000 - u\ffff ’ ‘\u0000 ’ Float
boolean(布尔型) 1 true/false false Double

注意:

1、在基本数据类型中,除了boolean类型所占长度与平台有关外,其他数据类型长度都是与平台无关的。比如,int永远占4个字节(1 Byte = 8 bit)。

2、void不是基本数据类型

在 Java 中基本类型只有八种,详见 Java Language Specification 的 4.2 节:
http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2

另外,在 Java Language Specificaion 的第 14.8 节也提及 void 并不是一种类型:
http://java.sun.com/docs/books/jls/third_edition/html/statements.html#5989

为什么《Thinking in Java》等一些书籍都说,void是基本类型的一种呢?

来看void的包装类java.lang.Void源码:

package java.lang;/*** The Void class is an uninstantiable placeholder class to hold a* reference to the Class object representing the Java keyword* void.** 翻译:Void类是一个不可重复的占位符类,*      用于保存对表示Java关键字void的Class对象的引用
**/
public final class Void { //final表明这个类是不允许被其他类继承/*** The Class object representing the pseudo-type corresponding to* the keyword void.* 翻译:Class对象表示对应于关键字void的伪类型。*/public static final Class<Void> TYPE = Class.getPrimitiveClass("void");/** The Void class cannot be instantiated.* 翻译:Void类不能被实例化。*/private Void() {}
}

再看getPrimitiveClass()方法的源码:

    /** Return the Virtual Machine's Class object for the named* primitive type.* 翻译:返回指定基本类型的虚拟机的Class对象。*/
static native Class getPrimitiveClass(String name);

“Ctrl+Alt+H”查看调用getPrimitiveClass()方法的所有类,确实是“Byte、Boolean、Short、Character、Integer、Long、Float、Double、Void”一共9个包装类,由此猜测把void也归到基本数据类型的说法可能来源于此。

3、基本数据类型的默认值仅在作为类中属性时生效

在方法内部必须先对基本数据类型变量赋值后才能使用,否则编译不通过。Demo如下:

public class DefaultValueTest {static int intA;static boolean blnA;public static void main(String[] args) {int intB;boolean blnB;System.out.println(intA); //输出0System.out.println(blnA); //输出false//System.out.println(intB); //编译不通过//System.out.println(blnB); //编译不通过}
}

在程序中如果某些数据可能会返回空值,那么用包装类比较好。比如当结果为空时,转换为int会发生异常,而转换为Integer则不会,因为对象可以为null。此时建议用包装类,虽然会牺牲一些转换效率,但可以避免持久化数据时产生的一些异常。

- 引用数据类型

引用类型(reference type)指向一个对象,不是原始值,指向对象的变量是引用变量。

在java里面除去基本数据类型的其它类型都是引用数据类型,自己定义的class类都是引用类型,可以像基本类型一样使用。

引用类型常见的有:String,StringBuffer,ArrayList,HashSet,HashMap等。
String也属于引用数据类型:

String a = "china";
String b =a; // 则a、b都指向常量池的"china"。
String a =  new String("china");
String b =a; //则a、b都指向堆中的"china"。
String a =  new String("china");
String b =a;a = a.substring(0,1); //则b指向栈中的"china",a指向新的对象"c"。

如果要对比两个对象是否相同,则需要使用equals()方法,但有一点需要注意:equals()方法的默认行为是比较引用。如果是你自己写的类,你应该为它重写equals()来比较对象的内容。大多数Java类库都实现了比较对象内容的equals()方法。

- 两种类型对比

最后,基本数据类型和引用数据类型的一些对比如下:

基本数据类型 引用数据类型
在栈中进行分配 在堆中进行分配,堆的读写速度远不及栈
变量名指向具体的数值 变量名指向存数据对象的内存地址,即变量名指向hash值
变量在声明之后java就会立刻分配给他内存空间 它以特殊的方式(类似C指针)指向对象实体(具体的值),这类变量声明时不会分配内存,只是存储了一个内存地址
基本类型之间的赋值是创建新的拷贝 对象之间的赋值只是传递引用
“==”和“!=”是在比较值 “==”和“!=”是在比较两个引用是否相同,需要自己实现equals()方法
基本类型变量创建和销毁很快 类对象需要JVM去销毁

JAVA基本数据类型与引用数据类型相关推荐

  1. JAVA基本数据类型和引用数据类型的参数传递详解

    今天动力节点java培训机构小编为大家介绍 JAVA基本数据类型和引用数据类型的参数传递,希望通过此文大家能够熟悉JAVA基本数据类型和引用数据类型的参数传递,下面就随小编一起来了解一下JAVA基本数 ...

  2. java 数据类型分为_JAVA中分为基本数据类型及引用数据类型

    byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值 ...

  3. java引用数据类型可以更改类型_java,基本数据类型和引用数据类型

    java中的数据类型分为基本数据类型和引用数据类型 基本数据类型 整型:byte,short,int,long 浮点型:float,double 字符型:char 布尔型:boolean 引用数据类型 ...

  4. Java基础之路--引用数据类型之数组

    什么是数组 数组:存储在一个连续的内存块中的相同数据类型(引用数据类型)的元素集合. 数组中的每一个数据称之为数组元素,数组中的元素以索引来表示其存放的位置,索引(下标)从0开始. 数组的定义 第一种 ...

  5. java中数组的返回值是什么类型_java基础学习:数组的常用操作与基础二维数组用法、及基本数据类型和引用数据类型赋值的区别...

    一.Arrays jdk中为了便于开发,给开发者提供了Arrays类,其中包含了很多数组的常用操作.例如快速输出.排序.查找等. 1.数组的常用方法 1.数组以字符串形式的输出,2.sort对数组排序 ...

  6. [转载] JAVA中分为基本数据类型及引用数据类型

    参考链接: C++和Java中布尔数据类型的比较 一.基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型, ...

  7. Java中的基本数据类型和引用数据类型

    一.数据类型 Java中的数据类型分为两大类,基本数据类型和引用数据类型. 1.基本数据类型 基本数据类型只有8种,可按照如下分类 ①整数类型:long.int.short.byte ②浮点类型:fl ...

  8. Java基本数据类型和引用数据类型

    Java提供了两类数据类型:一种是基本数据(原始类型),一种是引用类型. 数据类型图: 基本数据类型: 注意: 1.在基本数据类型中,除了boolean类型所占长度与平台有关外,其他数据类型长度都是与 ...

  9. Java中基本数据类型和引用数据类型的区别

    Java中基本数据类型和引用数据类型的区别 一.数据类型 1.基本数据类型 2.引用数据类型 二.基本数据类型和引用数据类型的区别 1.储存位置 基本变量类型 引用变量类型 2.参数传递方式 基本变量 ...

  10. Java中的基本数据类型和引用数据类型的区别

    一.数据类型 Java中的数据类型分为两大类,基本数据类型和引用数据类型. 1.基本数据类型 基本数据类型只有8种,可按照如下分类 ①整数类型:long.int.short.byte ②浮点类型:fl ...

最新文章

  1. 为什么深度学习不能取代传统的计算机视觉技术?
  2. iKair:放弃硬件制造,切入上游去“送水”的逻辑
  3. 批量导入数据到hive表中:假设我有60张主子表如何批量创建导入数据
  4. VS2015提示gets未定义
  5. tomcat设置php root,apache+tomcat+php搭建
  6. 【译】How Microsoft Lost the API War
  7. centos6 mysql 导出sql_centos环境下如何导出数据库
  8. 【知识小课堂】4 之 索引
  9. python init函数可以外部调用么,如何从python类中调用外部函数
  10. centos 6.5 apache mysql php_CentOS 6.5系统安装配置LAMP(Apache+PHP5+MySQL)服务器环境
  11. Windows Phone 7开发,进度条ProgressBar使用详解
  12. java获取spring数据源_Spring动态注册多数据源的实现方法
  13. 自己实现一个右滑删除的ListView
  14. Leetcode:convert_sorted_array_to_binary_search_tree
  15. ASIHTTPRequest开源类项目导入问题及解决方法
  16. 利用阿里云LAMP环境搭建搭建wiki知识库
  17. 查看设置本机共享文件 net share
  18. Charles的安装及设置
  19. PHP composer作用,php-composer作用分析
  20. php100视频教程75到100讲的解压密码

热门文章

  1. CSS导航条制作心得
  2. jpg怎么转换成pdf?分享3个方法
  3. scau 17967 大师姐唱K的固有结界 分类暴力 + RMQ
  4. 长文干货!带你了解高并发大对象处理
  5. 卸载ubuntu20.04自带软件
  6. word2016 加载EndNote X9插件(最后还有 超好用的使用技巧哦)
  7. 网上申请流量卡要上传身份证吗,这种情况安全吗?
  8. 教你如何查看,朋友圈访客记录
  9. SPOJ1693 COCONUTS - Coconuts
  10. html网页布局白边问题