Java之关于基本数据类型和引用数据类型的存放位置

 更新时间:2023年07月31日 11:12:33   作者:roon9527  
这篇文章主要介绍了Java之关于基本数据类型和引用数据类型的存放位置,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

基本数据类型和引用数据类型的存放位置

1、基本数据类型存放在哪?

基本类型的变量存在栈里或者堆里不是由"大小可知,生存期可知"就能确定了。

关键是上下文。

比如:

void method(){
	int a = 3;
}

这自然是存在栈里的。局部方法嘛。

而:

class Test {
    int a = 3;
}

这就肯定是随对象放到堆里的。

**因此,不要孤立的看到基本类型就说放到栈里,看到引用类型就说放到堆里。

**从更深层次去理解它们会更好,例如为什么是在基本类型的实例变量在堆上创建,局部变量在栈上创建,这样做有什么好处

2、思考

如果你熟悉java的内存结构的话就会知道,堆 是所有线程共享的内存区域,栈 是每个线程独享的,如果你将一个实例变量放在栈内,那么就不存在多个线程访问同一个对象资源了,这显然是不对的,所以实例变量要在堆上创建,也不是线程安全的。

但是对于局部变量,是在栈上创建的,每一次方法调用创建一个帧,独享一份内存区域,其他的线程是不会访问到该线程的资源,在 栈上创建也会减轻GC的压力,随着该方法的结束,帧出栈,相对应的内存消除,这种局部变量占用的内存自然就消失了,因此局部变量是线程安全的。

3、注

基本数据类型是放在栈中还是放在堆中,这取决于基本类型声明的位置。

一:在方法中声明的变量

即使变量是局部变量,每当程序调用方法时,系统都会为该方法建立一个方法栈,其所在方法中声明的变量就放在方法栈中,当方法结束系统会释放方法栈,其对应在该方法中声明的变量随着栈的销毁而结束,这就局部变量只能在方法中有效的原因。

在方法中声明的变量可以是基本类型的变量,也可以是引用类型的变量。

(1)当声明是基本类型的变量的时,其变量名及值(变量名及值是两个概念)是放在方法栈中

(2)当声明的是引用变量时,所声明的变量(该变量实际上是在方法中存储的是内存地址值)是放在方法的栈中,该变量所指向的对象是放在堆类存中的。

二:在类中声明的变量是成员变量

也叫全局变量,放在堆中的(因为全局变量不会随着某个方法执行结束而销毁)。

同样在类中声明的变量即可是基本类型的变量 也可是引用类型的变量

(1)当声明的是基本类型的变量其变量名及其值放在堆内存中的

(2)引用类型时,其声明的变量仍然会存储一个内存地址值,该内存地址值指向所引用的对象。引用变量名和对应的对象仍然存储在相应的堆中.

总结:

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

众所周知Java是一种强类型语言,在Java语言中,Java的数据类型一共分为两大类,分别为基本数据类型和引用数据类型,其中基本数据类型细分小类可分为整数类型、浮点类型、字符类型、布尔类型这四小类。

基本数据类型和引用数据类型

1. 基本数据类型

只有8种,可按照如下分类 :

  • 整数类型: long、int、short、byte
  • 浮点类型: float、double
  • 字符类型: char
  • 布尔类型: boolean
No.数据类型大小/位可表示数据范围默认值
1byte(字节型)8-128~1270
2short(短整型)16-32768~327670
3int(整型)32-2147483648~21474836470
4long(长整型)64-9223372036854775808~92233720368547758070
5float(单精度)32-3.4E38~3.4E380.0
6double(双精度)64-1.7E308~1.7E3080.0
7char(字符)160~255‘\u0000’ (其实就是一个空格)
8boolean(布尔)-true或falsefalse

2. 引用数据类型

引用数据类型非常多,大致包括:类Class、 接口类型Inteface、 数组类型Array、 枚举类型Enum、 注解类型、 字符串型

例如,String类型就是引用类型。简单来说,所有的非基本数据类型都是引用数据类型。

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

1. 存储位置区别

a). 基本变量类型

在方法中定义的非全局基本数据类型变量的具体内容是存储在栈中的,基本数据类型在被创建时,在栈上给其划分一块内存,将数值直接存储在栈上的。

b). 引用变量类型

只要是引用数据类型变量(类class、接口interface、数组array),其变量或者对象的具体内容信息都是存放在堆中的,而栈中存放的是其具体内容所在内存的引用地址

Tips : 通过变量地址可以找到变量的具体内容,就如同通过房间号可以找到房间一般

public class Main{
   public static void main(String[] args){
       //基本数据类型
       int i=1;
       double d=1.2;
       //引用数据类型
       String str="helloworld";
   }
}

c)内存划分:

在这里插入图片描述

2. 传递方式区别

a. 基本变量类型

方法中定义的非全局基本数据类型变量,调用方法时作为参数是按数值传递的

//基本数据类型作为方法参数被调用
public class Main{
   public static void main(String[] args){
       int msg = 100;
       System.out.println("调用方法前msg的值:\n"+ msg);    //100
       fun(msg);
       System.out.println("调用方法后msg的值:\n"+ msg);    //100
   }
   public static void fun(int temp){
       temp = 0;
   }
}

内存空间

在这里插入图片描述

b. 引用变量类型

引用数据类型变量,调用方法时作为参数是按引用传递的

//引用数据类型作为方法参数被调用
class Book{
    String name;
    double price;
    public Book(String name,double price){
        this.name = name;
        this.price = price;
    }
    public void getInfo(){
        System.out.println("图书名称:"+ name + ",价格:" + price);
    }
    public void setPrice(double price){
        this.price = price;
    }
}
public class Main{
   public static void main(String[] args){
       Book book = new Book("Java开发指南",66.6);
       book.getInfo();  //图书名称:Java开发指南,价格:66.6
       fun(book);
       book.getInfo();  //图书名称:Java开发指南,价格:99.9
   }
   public static void fun(Book temp){
       temp.setPrice(99.9);
   }
}

调用时为temp在栈中开辟新空间,并指向book的具体内容,方法执行完毕后temp在栈中的内存被释放掉

内存空间

在这里插入图片描述

在这里插入图片描述

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Mybatis-plus自定义SQL注入器查询@TableLogic逻辑删除后的数据详解

    Mybatis-plus自定义SQL注入器查询@TableLogic逻辑删除后的数据详解

    这篇文章主要给大家介绍了关于Mybatis-plus自定义SQL注入器查询@TableLogic逻辑删除后的数据的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-03-03
  • Java实现对象转CSV格式

    Java实现对象转CSV格式

    CSV是一种逗号分隔值格式的文件,一般用来存储数据的纯文本格式文件。Java对象转CSV,有现成的工具包,commons-lang3 的ReflectionToStringBuilder 就可以简单的解决的对象转CSV,快跟随小编一起学习一下吧
    2022-06-06
  • java显示目录文件列表和删除目录功能

    java显示目录文件列表和删除目录功能

    这篇文章主要介绍了java显示目录文件列表和删除目录功能,文章通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2017-12-12
  • mybatis中一对一关系association标签的使用

    mybatis中一对一关系association标签的使用

    这篇文章主要介绍了mybatis中一对一关系association标签的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 五分钟带你了解Java的接口数据校验

    五分钟带你了解Java的接口数据校验

    这篇文章主要介绍了五分钟带你了解Java的接口数据校验,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • SpringBoot定时任务的实现详解

    SpringBoot定时任务的实现详解

    这篇文章主要介绍了SpringBoot定时任务的实现详解,定时任务是企业级开发中最常见的功能之一,如定时统计订单数、数据库备份、定时发送短信和邮件、定时统计博客访客等,简单的定时任务可以直接通过Spring中的@Scheduled注解来实现,需要的朋友可以参考下
    2024-01-01
  • 细谈java同步之JMM(Java Memory Model)

    细谈java同步之JMM(Java Memory Model)

    Java内存模型是在硬件内存模型上的更高层的抽象,它屏蔽了各种硬件和操作系统访问的差异性,保证了Java程序在各种平台下对内存的访问都能达到一致的效果。下面我们来一起学习下JMM
    2019-05-05
  • MyBatis中#和$的区别小结

    MyBatis中#和$的区别小结

    ${} 和 #{} 都是 MyBatis 中用来替换参数的,它们都可以将用户传递过来的参数,替换到 MyBatis 最终生成的 SQL 中,但它们区别却是很大的,接下来我们一起来看
    2023-09-09
  • java对double数组排序示例分享

    java对double数组排序示例分享

    这篇文章主要介绍了java对double数组排序示例,代码简单,下面我们直接上代码,需要的朋友可以参考下
    2014-03-03
  • Java实现每日给女友微信发送早安信息

    Java实现每日给女友微信发送早安信息

    这篇文章主要为大家详细介绍了Java如何实现每日给女友微信发送早安等微信信息,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以了解一下
    2022-12-12

最新评论