前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JAVA基本数据类型与引用数据类型

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

作者头像
用户7886150
修改2021-04-26 17:43:00
修改2021-04-26 17:43:00
1K0
举报
文章被收录于专栏:bit哲学院bit哲学院

参考链接: Java变量和(原始)数据类型

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

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

- 数据类型图: 

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

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

              ┃                         ┣字符型:char 

数据类型╋                         ┗布尔型:boolean  

              ┃                        ┏类(class) 

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

                                        ┗数组(array) 

- 基本数据类型 

数据类型大小(bit)范围默认值包装类byte(字节)8-128 - 1270Byteshot(短整型)16-32768 - 327670Booleanint(整型)32-2147483648-21474836470Shortlong(长整型)64-9233372036854477808-92333720368544778070Characterfloat(浮点型)32-3.40292347E+38-3.40292347E+380.0fIntegerdouble(双精度)64-1.79769313486231570E+308-1.79769313486231570E+3080.0dLongchar(字符型)16‘ \u0000 - u\ffff ’‘\u0000 ’Floatboolean(布尔型)1true/falsefalseDouble 

注意: 

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); //输出0

        System.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去销毁

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档