java中的堆和栈

news/2024/5/20 9:18:04 标签: ,

基本数据类型是放在中还是放在中,这取决于基本类型声明的位置。
中存放:
new出来的对象和数组。
全局变量
全局基本类型,有默认值。

中分配的内存,由Java虚拟机的自动垃圾回收器来管理。不会立即释放

中存放:
局部变量(基本类型、引用类型)
当声明的是引用变量时,所声明的变量(该变量实际上是在方法中存储的是内存地址值)是放在方法的中,该变量所指向的对象是放在类存中的。

函数体内定义的变量

函数体运行完毕立即释放,这就局部变量只能在方法中有效的原因。

当在一段代码块定义一个变量时,Java就在中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。
中产生了一个数组或对象后,还可以在中定义一个特殊的变量,让中这个变量的取值等于数组或对象在内存中的首地址,中的这个变量就成了数组或对象的引用变量。
引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用中的引用变量来访问中的数组或对象。

有一个很重要的特殊性,就是存在中的数据可以共享。假设我们同时定义:
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=4;那么编译器会重新搜索中是否有4值,如果没有,则将4存放进来,并令a指向4;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。

要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况a的修改并不会影响到b, 它是由编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。

String是一个特殊的包装类数据。可以用:
String str = new String(“abc”);
String str = “abc”;
两种的形式来创建,第一种是用new()来新建对象的,它会在存放于中。每调用一次就会创建一个新的对象。
而第二种是先在中创建一个对String类的对象引用变量str,然后查找中有没有存放"abc",如果没有,则将"abc"存放进,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。

我们在使用诸如String str = “abc”;的格式定义类时,总是想当然地认为,创建了String类的对象str。担心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的 对象。只有通过new()方法才能保证每次都创建一个新的对象。
由于String类的immutable(不可更改)性质,当String变量需要经常变换其值时,应该考虑使用StringBuffer类,以提高程序效率。
在这里插入图片描述


http://www.niftyadmin.cn/n/830386.html

相关文章

java layoutmanager_Java Swing 探索(一)LayoutManager

1.BorderLayoutjava.lang.Object--java.awt.BorderLayout将版面划分成东、西、南、北、中五个区域,将加入�的组件按指定位置放置。BorderLayout.EASTBorderLayout.WESTBorderLayout.SOUTHBorderLayout.NORTHBorderLayout.CENTER构造函数:Bord…

回文数c语言 字符串,回文数与回文字符串的判断

1.回文数字:判断一个数字是不是回文数。(回文数的特点是正反序是同一个数字,如:12321,3443)。2.回文字符串:判断一个字符串是不是回文字符串。(回文字符串特点是原字符串与字符串逆序之后一样,如:"abc…

java参数传递

基本类型: 形式参数的改变对实际参数没有影响。在参数传递过程中,形参和实参占用了两个完全不同的内存空间。 引用类型: 形式参数的改变直接影响实际参数。在参数传递的过程中,形参和实参指向的是同一块内存空间。

jdbc mysql 返回游标_使用JDBC编程,应如何控制结果集ResultSet的指针,使之能够上下移动,以及移动到结果集的第一行和最后一行?...

展开全部说明:Statement stmt con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);通用格式为:Statement stmtcon.createStatement(int type,int concurrency);我们在访问数据库的时候,在读取返…

static,this,private关键字

1:成员变量和局部变量的区别(理解) (1)在类中的位置不同 成员变量:类中方法外 局部变量:方法定义中或者方法声明上 (2)在内存中的位置不同 成员变量:在堆中 局部变量:在栈中 (3)生命周期不同 成员变量:随着对象的创建而…

c语言中常用的格式输出的函数名称,c语言中文本输出的函数名称是什么?

c语言中文本输出的函数名称是printf。printf函数的语法是“printf("格式控制字符串",输出列表)”;该函数功能是按照“格式控制字符串”指定的格式,输出“输出列表”中的内容,格式控制串可由格式字符串和非格式字符串两种…

mysql -h 日志打印_18.mysql日志

在任何一种数据库中,都会有各种各样的日志,记录着数据库工作的方方面面,以帮助数据库管理员追踪数据库曾经发生过的各种事件。MySQL 也不例外,在 MySQL 中,有 4 种不同的日志,分别是错误日志、二进制日志(B…

几个问题的理解

静态方法在类加载时就会加载到静态区,为其分配固定的内存空间,当调用它时加载到栈内存,直到程序结束时销毁。非静态方法则是调用完就销毁 //用static修饰的变量是全局变量,只能修饰全局变量,且static变量不能在方法中定…