基本数据类型不一定存储在栈中,是不是颠覆了你的认知

news2025/2/26 7:07:55

大家好,我是三叔,很高兴这期又和大家见面了,有很多小伙伴问我,基本数据类型一定在栈内存中吗?网上答案也是五花八门,部分读者都有被误导过,基本数据类型不一定在栈内存中!

虽然基本数据类型通常存储在栈内存中,但是也有一些情况下它们会存储在堆内存中。例如,当基本数据类型被封装为对应的包装类时,它们会被存储在堆内存中。当一个int类型的值被封装为Integer对象时,这个对象会被存储在堆内存中。

注意

基本数据类型不一定都在栈内存中:

  1. 如果是成员变量,基本数据类型变量名和对象 存放在堆中,引用类型也在堆中,是成员共享的。
  2. 如果在局部变量中,基本数据类型的变量名和值都在栈中,引用对象类型的变量名在栈中,值在堆中,当调用方法时,会在java栈中生成栈帧,局部变量就存放在方法栈中,当方法调用结束就会释放该栈帧,所以局部变量随栈帧的销毁而结束,这就是局部变量只能在方法中有效的原因。

eg:

// 成员变量
	class Demo{
		//a放在堆中,a中存放地址值,指向“abc”,“abc”放入堆中
		String a = "abc";
		//同理,b和1都放在堆中
		int b = 1;
	}
	
	
	class Demo{
		// 局部变量
		public void getName(){
			//变量名a:放在栈中,值:"abc"放在堆中
			String a = "abc";
			
			// 变量名b 和 值1都放在栈中
			int b = 1;
		}
	}

此外,当基本数据类型作为成员变量或数组元素被包含在一个对象中时,它们也会被存储在堆内存中。例如,如果一个类中有一个int类型的成员变量,那么每个该类的实例对象都会在堆内存中分配内存来存储这个成员变量。(下面我会举例说明)

不过,需要注意的是,尽管基本数据类型有可能被存储在堆内存中,但它们的值依然是不可变的。即使基本数据类型被存储在堆内存中,它们的值也不会被改变,因为Java中的基本数据类型都是不可变的。

补充

基本数据类型的存储方式

Java中的基本数据类型存储大部分情况在栈内存中。栈内存是一种临时存储区域,存储在栈内存中的数据的生命周期和所在的方法的生命周期是一样的。在Java中,每当定义一个基本数据类型的变量时,都会在栈内存中分配一段空间,用于存储变量的值。当这个变量超出其作用域时,这段空间就会被释放,这也就是Java的垃圾回收机制。

Java将基本数据类型存储在栈内存中,是为了提高程序的执行效率。因为基本数据类型的数据量很小,通常只需要占用几个字节的内存,将它们存储在栈内存中可以使它们的访问速度更快,而且不需要进行垃圾回收。

值类型与引用类型

基本数据类型在Java中被定义为值类型,也就是说,它们的变量和数据是直接存储在栈内存中的,而不是存储在堆内存中的。与引用类型相比,值类型的存储方式更加高效,因为它们不需要进行指针的解引用和内存的分配和回收。

基本数据类型在堆内存

基本数据类型通常存储在栈内存中,但是也有一些情况下它们会存储在堆内存中。例如,当基本数据类型被封装为对应的包装类时,它们会被存储在堆内存中。当一个int类型的值被封装为Integer对象时,这个对象会被存储在堆内存中。

此外,当基本数据类型作为成员变量或数组元素被包含在一个对象中时,它们也会被存储在堆内存中。例如,如果一个类中有一个int类型的成员变量,那么每个该类的实例对象都会在堆内存中分配内存来存储这个成员变量。

@Data
public class Student {
    private int id;
    private String name;
    private int[] scores;
	
    public Student(int id, String name, int[] scores) {
        this.id = id;
        this.name = name;
        this.scores = scores;
    }
    
	public Student(int[] scores) {
        this.scores = scores;
    }

    public void printInfo() {
        System.out.println("Student ID: " + id);
        System.out.println("Student Name: " + name);
        System.out.print("Scores: ");
        for (int i = 0; i < scores.length; i++) {
            System.out.print(scores[i] + " ");
        }
        System.out.println();
    }
}

public class Demo{
    public static void main(String[] args) {
        int[] scores = {90, 85, 95};
        Student student = new Student(1, "Tom", scores);
        student.printInfo();
    }
}

在这里插入图片描述

在这个例子中,定义了一个Student类,其中有一个int类型的成员变量id,一个String类型的成员变量name和一个int类型的数组成员变量scores。在main方法中,创建了一个int类型的数组scores,并将它作为参数传递给了Student类的构造方法,这个数组将会被存储在堆内存中。

直接修改了 scores 数组的第一个元素的值,并打印了通过 student 对象获取到的 scores 数组,发现 scores 数组的值已经被改变了。

public class Demo {
    public static void main(String[] args) {
        int[] scores = {90, 85, 95};
        Student student = new Student(scores);
        scores[0] = 95;
        System.out.println(Arrays.toString(student.getScores()));
    }
}

在这里插入图片描述

scores 数组在存储在堆内存中的 Student 对象中时,是以引用类型的方式存储的,而引用类型变量存储的是对象在堆中的内存地址,所以改变 scores 数组的值会直接影响到存储在堆内存中的 Student 对象的 scores 成员变量。

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

基本数据类型是Java基础数据类型(byte、short、int、long、float、double、char和boolean),而引用类型则是Java中的类、接口和数组类型(例如上面的int[] 数组)。基本数据类型和引用类型的区别主要体现在它们在内存中的存储方式和赋值方式上。

基本数据类型的值存储在栈内存中,而引用类型的值(也就是对象)存储在堆内存中。基本数据类型的变量存储着它们的值本身,而引用类型的变量存储着指向对象的引用。

在Java中,基本数据类型是被定义为值类型,也就是说,它们的变量和数据是直接存储在栈内存中的,而不是存储在堆内存中的。与引用类型相比,值类型的存储方式更加高效,因为它们不需要进行指针的解引用和内存的分配和回收。

另外,基本数据类型和引用类型的赋值方式也是有区别的。当我们给一个基本数据类型的变量赋值时,实际上是将一个值复制到了这个变量所在的内存空间中。而当我们给一个引用类型的变量赋值时,实际上是将一个指向对象的引用复制到了这个变量所在的内存空间中。因此,如果两个引用变量指向同一个对象,那么改变其中一个引用变量所指向的对象的状态,将会影响到另一个。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/520803.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Lychee荔枝图床+cpolar内网穿透快速搭建稳定的私人图床【无需公网IP】

文章目录 1.前言2. Lychee网站搭建2.1. Lychee下载和安装2.2 Lychee网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 图床作为图片集中存放的服务网站&#xff0c;可以看做是云存储的一部分&#xff0c;既可…

【Linux内核解析-linux-5.14.10-内核源码注释】自旋锁spinlock机制

自旋锁 Note: 在使用自旋锁时应该避免长时间持有锁&#xff0c;否则可能会导致其他线程或进程无法访问共享资源。因此&#xff0c;建议将锁的持有时间尽量缩短&#xff0c;以提高系统的并发性能。 Linux中的自旋锁机制是一种用于同步多个线程或进程访问共享资源的技术。当一个…

一分钟图情论文:《公共图书馆法》视域下的馆员知识与能力体系探究

一分钟图情论文&#xff1a;《公共图书馆法》视域下的馆员知识与能力体系探究 在公共服务体系建设过程中&#xff0c;图书馆建设是十分关键地一环&#xff0c;在图书馆建设过程中又以图书馆员队伍的建设首当其冲。在当今复杂的信息环境下&#xff0c;我们该如何培养图书馆员&a…

语言与专业的奇迹:如何利用ChatGPT优化跨国贸易

贸易公司&#xff0c;在进行跨国贸易时&#xff0c;往往需要面对不同国家的甲方或者乙方&#xff0c;在与之沟通的过程中&#xff0c;语言和专业是必须要过的一关&#xff0c;顺畅的交流&#xff0c;往往会带来更好的收益。 今天以“茶”为例&#xff0c;给大家介绍一“知否AI…

Nacos 服务网格2

博主介绍&#xff1a;✌全网粉丝4W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战、定制、远程&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面…

cam_lidar_calibration标定速腾激光雷达和单目相机外参

目录 一、资源链接二、代码测试2.1安装依赖2.2代码下载和修改2.2.1 optimiser.h文件2.2.2 feature_extractor.h文件 2.3编译代码2.4测试数据集2.4.1迭代计算2.4.2查看校准结果 三、标定自己激光雷达和相机3.1修改代码3.1.1camera_info.yaml配置文件3.1.2params.yaml配置文件3.1…

跳槽,如果没有更好的选择,可以去美团试试···

在美团干了半年&#xff0c;说一下自己的感受&#xff0c;美团是一家福利中等&#xff0c;工资待遇中上&#xff0c;高层管理团队强大&#xff0c;加班强度一般&#xff0c;技术不错&#xff0c;办公环境一般&#xff0c;工作氛围中上&#xff0c;部门差距之间工作体验差距巨大…

阿里巴巴官方上线!号称国内Java八股文天花板(终极版)首次开源

铜三铁四已经结束了&#xff0c;但还是有很多Java程序员没有找到工作或者成功跳槽&#xff0c;跳槽成功的也只是从一个坑中&#xff0c;跳入另一个坑中…… 在LZ看来&#xff0c;真正有意义的就业与跳槽&#xff0c;是要进入到一个有绝对潜力的行业或者薪资能实现爆炸式增长的。…

Science Advances:宋艳课题组发现经颅近红外激光刺激可提升人类工作记忆

图1. 新闻稿封面 工作记忆——在几秒钟内主动“记住”有用信息的能力——在许多高级认知活动中起着至关重要的作用。由于工作记忆能力的个体差异可以预测流体智力和广泛的认知功能&#xff0c;这使得提高工作记忆能力成为干预和增强的有吸引力的目标。 美国食品及药品管理局声…

SpringSecurity 一文彻底掌握

文章目录 前言一、SpringSecurity Web方案&#x1f353;Test Controller 测试请求控制器&#x1f923;SpringSecurity 基本原理&#x1f30d;代码底层流程&#xff1a;重点看三个过滤器FilterSecurityInterceptor 方法级的权限过滤器ExceptionTranslationFilter 异常过滤器User…

智能玩具机器人语音识别方案——NRK3301离线语音IC

机器人玩具已经成为儿童玩具和教育用品的主流&#xff0c;它不仅能充分激发和满足了儿童消费群体的好奇心&#xff0c;同时还能强化了消费群体和玩具的互动体验。 机器人玩具主要是通过语音识别技术&#xff0c;让我们可以与玩具对话&#xff0c;可以用语音对玩具发出命令&…

ENVI实现基于像元方法的栅格图像镶嵌拼接(所有图像无需地理信息)

本文介绍基于ENVI软件&#xff0c;利用“Pixel Based Mosaicking”工具实现栅格遥感影像镶嵌拼接的方法。 首先需要说明的是&#xff0c;本文需要镶嵌的遥感影像并不含地理参考信息&#xff0c;因此仅可以使用ENVI中的“Pixel Based Mosaicking”工具&#xff08;该工具可以对…

SpringMVC简介、请求与响应、REST风格、SSM整合、拦截器

目录 SpringMVC简介 SpringMVC概述 入门案例 入门案例工作流程分析 Controller加载控制 PostMan 请求与响应 设置请求映射路径 五种类型参数传递 JSON数据传输参数 JSON对象数据 JSON对象数组 日期类型参数传递 响应 REST风格 REST风格简介 RESTful入门案例…

前后端分离实现社区销售系统

在当今的互联网时代&#xff0c;社区销售系统越来越普及。这种系统可以方便地管理商品、订单以及会员等信息&#xff0c;使得销售过程更加高效和便利。本文将介绍如何通过前后端分离的方式实现一个社区销售系统。 需求分析 社区销售系统主要包括会员管理、商品管理、订单管理…

C++ ---- 类和对象(中)

目录 类的默认成员函数介绍 构造函数 构造函数概念 构造函数特性 析构函数 析构函数概念 析构函数特性 拷贝构造 拷贝构造概念 拷贝构造特点 赋值重载 赋值重载介绍 赋值重载特性 取地址重载和const取地址重载 const成员 取地址和const取地址重载 类的默认成员函…

【致敬未来的攻城狮计划】— 连续打卡第三十天:总结与回顾

学习目标&#xff1a; 自2023年4月13日开始&#xff0c;我参加了为期一个月的【致敬未来的攻城狮计划】&#xff0c;今天是第三十天&#xff0c;做一个总结和回顾。 我参加的是【致敬未来的攻城狮计划】第二期&#xff08;攻城狮计划&#xff09; 在这里首先还是感谢 李…

【云服务器】关于UDP/TCP跨平台网络通信服务器无响应的情况及解决办法

关于跨平台网络通信服务器无反应的情况 一、问题出现二、云服务器Centos7防火墙开放端口2.1 检查防火墙状态2.2 开启防火墙2.3 在running 状态下&#xff0c;向firewall 添加需要开放的端口2.4 重新加载防火墙配置2.5 查看端口是否放开 三、云服务器防火墙配置开放端口3.1 进入…

决策树与随机森林

决策树解决回归问题时进行平均数计算。 决策树 (1)熵&#xff08;entropy)与特征节点 熵&#xff08;entropy&#xff09;&#xff0c;度量着信息的不确定性&#xff0c;信息的不确定性越大&#xff0c;熵越大。信息熵和事件发生的概率成反比。 ■信息熵代表随机变量的复杂度…

c++《list容器的使用》

本文主要介绍list的一些常见接口的使用 文章目录 一、list的介绍二、list的使用2.1 list的构造函数2.2 list迭代器的使用2.3 list相关的容量大小相关的函数2.4 list数据的访问相关的函数2.5 list的数据调整相关的函数2.6 list中其他函数操作 一、list的介绍 list是可以以O(1)的…

IOC理论推导

1.UserDao接口 package com.kuang.dao;public interface UserDao {void getUser(); }2.UserDaoImpl业务接口 package com.kuang.dao;public class UserDaoImpl implements UserDao{Overridepublic void getUser() {System.out.println("默认获取用户数据");} }3.Us…