java基础(六)——数据类型的存储方式

面试必考之Java基础数据类型 你有思考过编程语言为什么要有「数据类型」吗? 面试官其实是想让你告诉他:小讯同学是谁?她出生在哪儿? 阅读详情
转自:

Java中基本数据类型的存储方式和相关内存的处理方式(java程序员必读经典)


1.java是如何管理内存的

        java的内存管理就是对象的分配和释放问题。(其中包括两部分)

        分配:内存的分配是由程序完成的,程序员需要通过关键字new为每个对象申请内存空间(基本类型除外),所有的对象都在堆(Heap)中分配空间。 

        释放:对象的释放是由垃圾回收机制决定和执行的,这样做确实简化了程序员的工作。但同时,它也加重了JVM的工作。因为,GC为了能够正确释放对象,GC必须监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等,GC都需要进行监控。

2.什么叫java的内存泄露

        在java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连(也就是说仍存在该内存对象的引用);其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。(关于内存泄漏与内存溢出的区别,可以参考这篇文章:http://wade6.iteye.com/blog/1842907)

3.JVM的内存区域组成

       java把内存分两种(其实是4种,栈、堆、方法区、程序计数器):

       一种是栈内存,另一种是堆内存

       (1)在函数中定义的基本类型变量(即基本类型的局部变量)和对象的引用变量(即对象的变量名)都在函数的栈内存中分配;

       (2)堆内存用来存放由new创建的对象和数组以及对象的实例变量。

       在函数(代码块)中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量所分配的内存空间;

        在堆中分配的内存由java虚拟机的自动垃圾回收器来管理。

        堆和栈的优缺点

        堆的优势是可以动态分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的。

        缺点就是要在运行时动态分配内存,存取速度较慢;

        栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器;另外,栈数据可以共享。

        但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。

        此外补充一下java中还有一个方法区的东东:

        方法区中主要存储所有对象数据共享区域,存储静态变量和普通方法、静态方法、常量、字符串常量(严格说存放在常量池,堆和栈都有)等类信息,说白了就是保存类的模板

4.java中数据在内存中是如何存储的

a)基本数据类型

        java的基本数据类型共有8种,即int,short,long,byte,float,double,boolean,char(注意,并没有String的基本类型 )。这种类型的定义是通过诸如int a = 3;long b = 255L;的形式来定义的。如int a = 3;这里的a是一个指向int类型的引用,指向3这个字面值(字面值一般是放在常量池中)。这些字面值的数据,由于大小可知,生存期可知(这些字面值定义在某个程序块里面,程序块退出后,字段值就消失了),出于追求速度的原因,就存在于栈中。

        另外,栈有一个很重要的特殊性,就是存在栈中的数据可以共享。比如: 我们同时定义:int a=3; int b=3;编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找有没有字面值为3的地址,没找到,就开辟一个存放3这个字面值的地址,然后将a指向3的地址。接着处理int b = 3;在创建完b这个引用变量后,由于在栈中已经有3这个字面值,便将b直接指向3的地址。这样,就出现了a与b同时均指向3的情况。

        定义完a与b的值后,再令a = 4;那么,b不会等于4,还是等于3。在编译器内部,遇到a=4时,它就会重新搜索栈中是否有4的字面值,如果没有,重新开辟地址存放4的值;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。

b)对象

        在java中,创建一个对象包括对象的声明和实例化两步,下面用一个例题来说明对象的内存模型。假设有类Rectangle定义如下:

public class Rectangle {
	double width;
	double height;

	public Rectangle( double w, double h){
		w = width;
		h = height;
	}
}

        (1)声明对象时的内存模型  用Rectangle rect;声明一个对象rect时,将在栈内存为对象的引用变量rect分配内存空间,但Rectangle的值为空,称rect是一个空对象。空对象不能使用,因为它还没有引用任何”实体”。 

        (2)对象实例化时的内存模型  当执行rect=new Rectangle(3,5);时,会做两件事:类加载的准备阶段,在堆内存中为类的成员变量width,height分配内存,并将其初始化为各数据类型的默认值;类加载的初始化阶段,接着进行显式初始化(类定义时的初始化值);最后调用构造方法,为成员变量赋值。返回堆内存中对象的引用(相当于首地址)给引用变量rect,以后就可以通过rect来引用堆内存中的对象了。

c)创建多个不同的对象实例

        一个类通过使用new运算符可以创建多个不同的对象实例,这些对象实例将在堆中被分配不同的内存空间,改变其中一个对象的状态不会影响其他对象的状态。例如:

Rectangle r1= new Rectangle(3,5);
Rectangle r2= new Rectangle(4,6);

此时,将在堆内存中分别为两个对象的成员变量 width 、 height 分配内存空间,两个对象在堆内存中占据的空间是互不相同的。如果有:

Rectangle r1=new Rectangle(3,5);
Rectangle r2=r1;

则在堆内存中只创建了一个对象实例,在栈内存中创建了两个对象引用,两个对象引用同时指向一个对象实例。

d)包装类

        基本类型都有对应的包装类:如int对应Integer类,double对应Double类等,基本类型的定义都是直接在栈中,如果用包装类来创建对象,就和普通对象一样了。例如:int i=0;i直接存储在栈中。Integer i(i此时是对象)= new Integer(5);这样,i对象数据存储在堆中,i的引用存储在栈中,通过栈中的引用来操作对象。

e)String

        可以参考(http://blog.chinaunix.net/uid-25304914-id-4763978.html)

        String是一个特殊的包装类数据。可以用以下两种方式创建:String str = new String(“abc”);String str = “abc”; 第一种创建方式,和普通对象的的创建过程一样; 第二种创建方式,要先引入常量池概念(常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它主要保存字面量(即基本数据常量和字符串常量)和符号引用)。第二种创建方式,就是在编译期就已经确定好的字符串常量“abc”,所以会被保存在常量池中 ,而str就是指向“abc”这个字符串常量的引用。

f)数组

        当定义一个数组,int x[];或int[] x;时,在栈内存中创建一个数组引用,通过该引用(即数组名)来引用数组。x=new int[3];将在堆内存中分配3个保存 int型数据的空间,堆内存的首地址放到栈内存中,每个数组元素被初始化为0。

g)静态变量

        用static修饰的变量和方法,实际上是指定了这些变量和方法在内存中的”固定位置”-static storage,可以理解为所有实例对象共有的内存空间,存放在方法区。static变量有点类似于C中的全局变量的概念;静态表示的是内存的共享,就是它的每一个实例都指向同一个内存地址。把static拿来,就是告诉JVM它是静态的,它的引用(含间接引用)都是指向同一个位置,在那个地方,你把它改了,它就不会变成原样,你把它清理了,它就不会回来了。

        那静态变量与方法是在什么时候初始化的呢?对于两种不同的类属性,static属性与instance属性,初始化的时机是不同的。instance属性在创建实例的时候初始化,static属性在类加载,也就是第一次用到这个类的时候初始化,对于后来的实例的创建,不再次进行初始化。

我们常可看到类似以下的例子来说明这个问题:

class Student{
	static int numberOfStudents =0;
	public Student(){
		numberOfStudents ++;
	}
}

每一次创建一个新的Student实例时,成员numberOfStudents都会不断的递增,并且所有的Student实例都访问同一个numberOfStudents变量,实际上intnumberOfStudents变量在内存中只存储在一个位置上。

5.java的内存管理实例

        Java程序的多个部分(方法,变量,对象)驻留在内存中以下两个位置:即堆和栈,现在我们只关心三类事物:实例变量,局部变量和对象: 实例变量和对象驻留在堆上, 局部变量驻留在栈上, 让我们查看一个 java 程序,看看他的各部分如何创建并且映射到栈和堆中:

public class Dog {
	Collar c;
	String name;
	
	//1.main()方法位于栈上
	public static void main(String[] args) {
		//2.在栈上创建引用变量d,但Dog对象尚未存在
		Dog d;
		//3.创建新的Dog对象,并将其赋予d引用变量
		d = new Dog();
		//4.将引用变量的一个副本传递给go()方法
		d.go(d);
	}
	
	//5.将go()方法置于栈上,并将dog参数作为局部变量
	void go(Dog dog){
		//6.在堆上创建新的Collar对象
		c = new Collar();
	}
	
	//7.将setName()添加到栈上,并将dogName参数作为其局部变量
	void setName(String dogName){
		//8.name的实例对象也引用String对象
		name =dogName;
	}
	//9.程序执行完成后,setName()将会完成并从栈中清除,此时,局部变量dogName也会消失,尽管它所引用的String仍在堆上
}


java如何将图片类型的数据存入mysql 数据库 源文件不含库 博文链接:https://liyaxi.iteye.com/blog/474188 立即下载

相关推荐

Java中的各种数据类型在内存的的存储方式

Java内存管理机制是什么样的?java中数据在内存中是如何存储的?

初识C语言(Ⅲ)

操作符 算术操作符 + - * / % %是取模,即取余数,取余的对象只能是整数 移位操作符 >> << 移位操作符的对象是二进制位 以4字节整型12为例 eg. 00000000000000000000000000001100 向右移1位 00000000000000000000000000000110 左边补0 位操作符 & ^ | &(按位与) eg. int a=3 b=5; c=...

qq_52363432的博客 869

单片机笔记十二:华大HC32L136超低功耗设计实战

本文详细介绍了华大HC32L136单片机的超低功耗设计实战,包括深度睡眠模式下仅0.5μA的电流消耗、五种功耗模式的对比与配置、外设使用技巧及硬件级优化方法。通过实际项目案例,展示了如何利用ARM Cortex-M0+内核的HC32L136显著延长电池寿命,适用于智能门锁、额温枪等低功耗设备。

weixin_29189373的博客 394

Java学习(二)Java中存储数据的三种方法

Java学习(二)Java中存储数据的三种方法 一:Session存储 此方法多用于浏览器,当多方处理时不安全。具有一定的即时性。 1.HttpSession session = request.getSession(); 2. session.setAttribute("code", result);//存入数据 3. String codetest = (String) session.getAttribute("code");//取出数据 二:Map存储数据 比较基础的方法 1.

qq_45240245的博客 4957

组态王|组态王通过选择日期实现历史数据的查询

②在弹出的【插入通用控件】对话框选择【Calender Control】控件,然后点击【确定】按钮,关闭对话框,然后在画面上适当的位置按住鼠标左键并拖动,绘制出一个矩形框,放开鼠标,就完成了控件的绘制。此函数将指定的时间格式(年,月,日,时,分,秒)转换为以秒为单位的长整型数,转换的时间基准是UTC(格林尼治)1970年1月1日00:00:00。实现内容,通过两个日历控件选择开始日期和结束日期,然后点击【历史数据查询】按钮,在报表中显示对应时间段的数据集。另外你用过哪些组态软件?

做有价值的事,积累有价值的笔记! 4563

科研ABC - The Results Section(SCI论文写作补充)

1 前言 1.1 IMRD格式 1.2 Results部分意义 1.3 Results部分主要内容 2 Results & Discussion关系 2.1 Results & Discussion部分的搭配方式 2.2 Results & Discussion部分的区分 3 Results部分的结构 3.1 Move 1: Set the Stage 3.1....

洋洋洋2020的blog 1619

Java数据类型在内存中储存方式

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

qq_63196986的博客 3069

Orange3实战教程:文本挖掘---主题建模

主题建模通过LDA、LSI或HDP算法分析文档集合,自动发现隐含主题结构。组件输入为文档语料库,输出包括带主题权重的语料库、主题词分布及完整主题数据。不同算法特性各异:LSI允许正负权重但解释性较弱,LDA更易解释,HDP参数复杂需谨慎设置。结果可结合词云、热力图等可视化工具分析主题特征及分布。示例显示如何通过预处理文本、选择算法(如提取5个LDA主题),并利用MDS和箱线图探索主题间关系及关键词分布。

err2008的专栏 362

java 数据存储方式

比喻:集合存储就像是你在家里放衣服的衣柜,你可以把不同种类的衣服(对象)放进衣柜里,然后通过不同的方式(如按颜色、款式等)来查找和取出衣服。比喻:数据库存储就像是你在公司里的资料库,里面存储着大量的文件和资料(数据),你可以通过特定的方式(如查询语句)来查找和获取你需要的资料。比喻:数组存储就像是你在图书馆里找到的一排书架,每一本书(数据)都按照顺序排列好,你可以通过书的编号(索引)快速找到你想要的书。比喻:变量存储就像是你在超市购物时用的购物车,你可以把需要的东西(数据)放进购物车(变量)里,随时取用。

weixin_57763462的博客 1008

垂直领域论坛数据挖掘:Python突破Discuz!加密与用户画像构建指南

在垂直领域论坛,如专业技术论坛、兴趣爱好社区等,积累了大量有价值的信息和用户数据。这些数据不仅可以帮助我们了解用户的行为模式和兴趣点,还能为社区运营、产品优化、商业决策等提供有力支持。然而,许多基于Discuz!系统的论坛对数据进行了加密保护,给数据挖掘带来了一定的挑战。本文将详细探讨如何使用Python突破Discuz!论坛的加密机制,并构建用户画像,实现数据掘金。

u014481728的博客 1693

Vivado ILA抓DDR信号(各种IO信号:差分、ISERDES、IOBUFDS等)

Vivado ILA抓DDR信号(各种IO信号:差分、ISERDES、IOBUFDS等)

千歌叹尽执夏的博客 1097

Java对象存储深度解析:从本地到云端的4大主流方案实战(附完整代码)

"作为Java全栈开发者,你是否还在为海量非结构化数据存储方案选型而困惑?本文深度剖析4种企业级对象存储实现方案:本地存储的高效实现、自建MINIO集群的部署技巧、阿里云OSS的SDK最佳实践,以及FastDFS在分布式场景下的独特优势。通过完整的代码示例和性能对比数据,带您掌握不同场景下的技术选型策略。特别包含SpringBoot集成方案、多存储源动态切换等进阶技巧,适用于需要处理图片/视频存储、日志归档等场景的中高级开发者。文末附各方案的成本效益分析表,助您做出最优架构决策。"

Zyw907155124的博客 5253

硬核反坑!YOLOv5训练避坑指南:根治梯度消失、不收敛、检测漏框三大核心问题(附实战代码+调优清单)

数据是基础,超参数是关键,模型是工具,训练策略是保障。梯度消失、不收敛、检测漏框这三大问题,本质上都是“数据-模型-训练”不匹配的结果。梯度消失/爆炸:优先调整学习率策略+梯度裁剪,其次优化模型结构;训练不收敛:优先清洗数据集,其次调优超参数,最后检查配置文件;检测漏框:优先重新聚类锚框,其次增强浅层特征,最后调整推理参数。YOLOv5训练的最高境界,不是调参,而是让数据、模型、训练策略三者完美匹配。按本文的方法反坑,你的YOLOv5训练一定能一次成功!🚀。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 233

Java中的8种基本数据类型及其存储方式

对于boolean类型占用32bit的空间并不构成浪费,因为不管boolean类型多大,在实际存储中都会占用4kb的内存页的存储空间。在CPU缓存行中,boolean类型数据占用32bit空间,会使得缓存行中的数据密度降低,单个缓存行的读取需求减少,从而提高传输效率,传输到CPU内部之后,boolean类型会转变为int类型进行处理。负数的存储为其绝对值的原码取反码再加1得到的补码形式存储,正数的原码即为其补码,因此计算机中数值都是以补码的形式进行存储。,52位作为数值位,其表达的数值为。

dawn191228的博客 1011

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java中的基础数据类型及其包装类

在 Java 中,​​基础数据类型(Primitive Data Types)​​ 是语言内置的基本数据类型,它们不是对象,而是直接存储值的数据类型。Java 的基础数据类型共有 ​​8 种​​,分为 ​​4 类​​:​​整数类型​​、​​浮点类型​​、​​字符类型​​ 和 ​​布尔类型​​。类别数据类型位数(bits)字节(bytes)取值范围默认值​​整数型​​byte81-128 ~ 1270short1620int324。

qq_57019146的博客 917

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java中的基本数据类型和引用数据类型的存储方式有什么不同

在Java中,基本数据类型和引用数据类型的存储方式有显著的不同。总结来说,基本数据类型的变量直接存储其值在栈内存中,而引用数据类型的变量则存储对象的引用在栈内存中,实际的对象存储在堆内存中。这种设计不仅提高了程序运行的效率,还方便了内存管理和垃圾回收机制的实现.

破损的天堂鸟博客 800

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Java的数据类型及不同种类的数据类型的存储方式

Java基础知识(二) Java有八种基本数据类型 整型 byte、short、int、long 类型 存储需求 取值范围 byte 1字节 -128~-127 short 2字节 -32768~32767 int 4字节 -2147483648~2147483647 long 8字节 -9223372036854775808~9223372036854775807 浮点型 float、double 布尔型 boolean 字符型 char 创建Java文件时,类名文件名要一

夏夏夏°的博客 1007

【Java基础】Java数据类型以及数据类型之间的转换

Java数据类型小技巧,今天你学废了吗?

程序员青戈 6700

Java基础——对象的存储方式、操作方式、创建和销毁

对象的存储方式,操作方式、创建和销毁

yexiann的博客 2215

JAVA中的数据类型

在介绍java基本数据类型前,先介绍计算机中的基本单位-比特;

m0_69932385的博客 1643

java i数据类型_java基础数据类型

java基础数据类型java中数据类型分为两种,一种为基础数据类型,另外一种为引用数据类型。基本数据类型又分为整数型、浮点型、字符型和布尔型。一、基础数据类型分类型别类型整数型byte short int long浮点型float double字符型char布尔型boolean二、基础数据类型类型关键字内存占用取值范围字节型byte1个字节\(-2^7\)~\(2^7-1\) (\(-...

weixin_29102619的博客 422

String属于基础的数据类型么?

八大基础数据类型有哪些? 整形: byte 一个byte类型在内存中占8位,表示数的范围是-128~+127 short 16位,-32768~32767 int 32位,-2147483648~2147483647 long 64位,(-263)~(263) 浮点型 float double 字符型 char 布尔型 boolean 小结 所以String类型不属于基础数据类型,但是为什么会...

老狼的博客 5976

Java基础:Java数据类型

Java 是一种强类型语言,这就意味着必须为每一个变量声明一种类型。在 Java 中基本数据类型共有 8 种,包括 4 种整型、2 种浮点型、1 种用于表现 Unicode 编码的字符单元的字符类型 char 和一种用于表示真值的 boolean 类型 本篇主要记录内容包括:基础数据类型、对象包装器、字符串、数组

栗筝i的博客 5957

Java基础---基本数据类型

数据类型:它定义了变量或表达式可以存储数据的种类。java是一种强数据类型语言。

jlihan的博客 1万+

java中的基本数据类型和引用数据类型以及它们的存储方式堆内存和栈内存

java中的基本数据类型和引用数据类型以及它们的存储方式堆内存和栈内存

awq520tt1314的博客 9401
上一篇: java基础(五)——数据类型和方法传递类型
下一篇: java基础(七)——类型转换
冷静BB
博客等级 码龄12年 298粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值