Java基本数据类型与引用数据类型 及在堆栈中内存的存储原理

Java数据类型分为基本数据类型与引用数据类型。
在这里插入图片描述

1、 基本数据类型

  • byte:Java中最小的数据类型,在内存中占1个字节(8 bit),取值范围-128~127,默认值0

  • short:短整型,2个字节(16 bit),取值范围-32768~32717,默认值0

  • int:整型,用于存储整数,在内存中占4个字节,取值范围-2147483648~2147483647,默认值0

  • long:长整型,在内存中占8个字节-263~263-1,默认值0L

  • float:浮点型,在内存中占4个字节,用于存储带小数点的数字(与double的区别在于float类型有效小数点只有6~7位),默认值0

  • double:双精度浮点型,用于存储带有小数点的数字,在内存中占8个字节,默认值0

  • char:字符型,用于存储单个字符,内存中占2个字节,取值范围0~65535,默认值为空

  • boolean:布尔类型,占1个字节,用于判断真或假(仅有两个值,即true、false),默认值false

2 、引用类型

Java语言本身不支持C++中的结构(struct)或联合(union)数据类型,它的复合数据类型一般都是通过类或接口进行构造,类提供了捆绑数据和方法的方式,同时可以针对程序外部进行信息隐藏。引用类型分3种:类,接口,数组;

  • 类(Class):所有的类,无论是Java自身已经存在的,还是用户后来创建的;
    Objec类: 它是所有类的父类,每个类都实现这个类的方法;用Object 可以定义所有的类;
    String类: String类代表字符串,

  • 接口(interface): 系统自带或者用户创建的

  • 数组(array): 系统自带或者用户创建的

3 、Java中的数据类型在内存的存储原理

  • 基本数据类型的存储原理
    所有的简单数据类型不存在“引用”的概念,基本数据类型都是直接存储在内存中的内存栈上的,数据本身的值就是存储在栈空间里面,Java语言里面八种数据类型是这种存储模型 (对于整型定义数值不在(-128~127)之间的话 定义时会在堆中创建对象);
  • 引用类型的存储原理
    引用类型继承于Object类(也是引用类型)都是按照Java里面存储对象的内存模型来进行数据存储的,使用Java内存堆和内存栈来进行这种类型的数据存储,简单地讲,“引用”(存储对象在内存堆上的地址)是存储在有序(先进后出)的内存栈上的,而对象本身的值存储在内存堆上的

#基本数据类型和引用类型的区别主要在于基本数据类型是分配在栈上的,而引用类型是分配在堆上的

# #不论是基本数据类型还是引用类型,他们都会先在栈中分配一块内存,对于基本类型来说,这块区域包含的是基本类型的内容;而对于引用类型来说,这块区域包含的是指向真正内容的指针,真正的内容被手动的分配在堆上。

补充说明:Java String 和 new String()的区别

(1) String str1 = "abcd"的实现过程:首先栈区创建str1引用,然后在String池(常量池:独立于栈和堆而存在,存储不可变量)中寻找其指向的内容为"abcd"的对象,如果String池中没有,则创建一个,然后str指向String池中的对象,如果有,则直接将str1指向"abcd"

  • 如果后来又定义了字符串变量 str2 = “abcd”,则直接将str2引用指向String池中已经存在的“abcd”,不再重新创建对象,此时比较str1==str2,返回值true;
  • 当str1进行了赋值(str1=“abc”),则str1将不再指向"abcd",而是重新指String池中的"abc",此时如果定义String str3 = “abc”,进行str1 == str3操作,返回值为true,因为他们的值一样,地址一样;
  • str1 = “abc”+“d”;拼凑的“abcd”时,此时与str1==str2,返回值true,因为他们是在编译期确定,都指向静态池中的“abcd”,他们的值一样,地址一样;。
  • 但是如果内容为"abc"的str1进行了字符串的+连接str1 = str1+“d”,此时str1指向的是在中新建的内容为"abcd"的对象,因为此时str1 = str1+"d"是在运行期创建的 编译期并未识别str1,即此时进行str1==str2,返回值false,因为地址不一样。

(2) String str3 = new String(“abcd”)的实现过程:直接在堆中创建对象。如果后来又有String str4 = new String(“abcd”),str4不会指向之前的对象,而是重新创建一个对象并指向它,所以如果是执行str3==str4 则返回值是false,因为两个对象的地址不一样,如果是执行str3.equals(str4),返回true,因为内容相同。

下篇介绍“==”与equals的区别

本文参kao其他文章,原文在:https://www.cnblogs.com/Latiny/p/8099581.html

猜你喜欢

转载自blog.csdn.net/weixin_43896747/article/details/85105144