Java 中的堆和栈
Java把内存划分成两种:一种是栈内存,一种是堆内存.
1. 在函数中定义的一些基本类型的变量,对象的引用变量,都在函数的栈内存中分配
当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间.
2. 堆内存用来存放由new创建的对象和数组
新创建的对象和数组存放在堆内存中.不过它们的引用变量存放在栈内存中,这个变量的值等于数组或对象在堆内存中的首地址.
3. 栈的优点缺点
栈的优势是,存取速度很快,仅次于寄存器;栈数据可以共享(后面会详细介绍);这些决定了栈内存中主要存放一些基本类型的变量(int, short, byte, char, double...)以及对象引用.
缺点是,存在栈中的数据大小与生存周期必须在编译时就确定.
4 堆的优点缺点
堆是一个运行时数据区,优势是可以动态地分配内存大小,生存期也不必事先告诉编译器;缺点是存取速度较慢.
5 栈的一个重要特征: '数据共享'
存在栈中的数据可以共享,假设我们同时定义:
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,它是由编译器完成的,它有利于节省空间.而
一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量.
6 String中的equals()和==
可以用两种方式来创建一个String对象:
-
String str =
new
String(
"abc"
);
-
String str = "abc"
;
String str = new String("abc");
String str = "abc";
第一种是用new()来新建对象的,它会在存放于堆内存中.每调用一次就会创建一个新的对象;而第二种是先在栈中创建一个引用变量str,然后查找栈中有
没有存放'abc',如果没有,则将'abc'存放进栈,并令str指向'abc';如果已经有'abc',则直接令str指向'abc';
比较类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用==.下面用例子说明上面的理论.
-
String str1 =
"abc"
;
-
String str2 = "abc"
;
-
System.out.println(str1==str2);
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true
可以看出str1和str2是指向同一个对象的.
-
String str1 =
new
String (
"abc"
);
-
String str2 =new
String (
"abc"
);
-
System.out.println(str1==str2);
String str1 =new String ("abc");
String str2 =new String ("abc");
System.out.println(str1==str2); // false
用new的方式是生成不同的对象,每一次生成一个.因此用第二种方式创建多个'abc'字符串,在内存中其实只存在一个对象而已.这种写法有利与节省内存
空间.同时它可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象.而对于String str =
new String("abc")的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担.
最后附上几个实例比较,打印结果自己跑一下就知道了,:)
-
String a =
"abc"
;
-
String b ="abc"
;
-
String c = new
String (
"abc"
);
-
System.out.println(a==b);
-
System.out.println(a.equals(b));
-
System.out.println(a==c);
-
System.out.println(a.equals(c));
-
System.out.println(System.identityHashCode(a));
-
System.out.println(System.identityHashCode(b));
-
System.out.println(System.identityHashCode(c));
String a ="abc";
String b ="abc";
String c = new String ("abc");
System.out.println(a==b);
System.out.println(a.equals(b));
System.out.println(a==c);
System.out.println(a.equals(c));
System.out.println(System.identityHashCode(a)); //打印的是内存的地址(可以这么认为!)
System.out.println(System.identityHashCode(b));
System.out.println(System.identityHashCode(c));
分享到:
相关推荐
Java 中 equals 和 == 的区别 Java 中的 equals 和 == 是两个不同的概念,很多开发者容易混淆它们。理解这两个概念的区别是非常重要的,因为它们对编程的正确性和性能都有很大的影响。 首先,我们需要了解 Java ...
Java 中 equals 和 == 的区别 Java 中的 equals 和 == 是两个不同的运算符,它们之间的区别是非常重要的。 首先,我们需要了解 Java 中的内存模型。在 Java 中,变量可以分为两种:基本类型(primitive type)和...
第5 版 清华大学出版社<br> “SCJP学习指南” 人民邮电出版社<br> “Java 编程思想” 第3版 机械工业出版社<br> 教学内容和要求<br>知识点 重要程度 使用频度 难度<br>Java 入门 高 中 易<br>变量和运算符 高 ...
== 比较的是栈中的值,基本数据类型是变量值,引用类型是堆中内存对象的地址 equals:在Object中模式采用==比较,通常会重写 String对象重写了 equals,比较的是变量值 从上面我们笼统的来说明了一下两者的不同,...
在 Java 中,栈和堆都是自动管理的,程序员不能直接地设置栈或堆。Java 的垃圾收集器会自动收走这些不再使用的数据。 栈有一个很重要的特殊性,就是存在栈中的数据可以共享。例如,int a = 3; 和 int b = 3;,它们...
在Java编程语言中,了解`==`和`equals()`的区别是非常关键的,因为它们在处理不同类型的数据时有不同的行为。这两个运算符在比较基本数据类型(如int、char)时表现相同,但当涉及到对象时,它们的行为就有所不同。 ...
"Java 堆和栈的区别" Java 堆和栈是 Java 中的两种内存管理机制,它们都是 Java 用来在 RAM 中存放数据的地方。但是,它们有很多不同之处。 Java 堆是一个运行时数据区,类的对象从中分配空间。这些对象通过 new、...
### Java中的比较运算符==与equals()方法 在Java编程语言中,经常需要对变量进行比较,这涉及到了两种常见的比较方式:`==`运算符和`equals()`方法。这两种方式有着本质的区别,并且适用于不同类型的数据。下面将...
#### 二、技术栈与环境配置 ##### 技术栈 - **JSP (JavaServer Pages)**:用于创建动态网页。 - **Java**:服务器端处理逻辑的主要编程语言。 ##### 环境配置 - **JDK (Java Development Kit)**:确保系统安装了...
以下代码片段展示了如何在Java中使用栈和堆内存: ```java String a = "abc"; String b = "abc"; String c = new String("abc"); System.out.println(a == b); // true System.out.println(a.equals(b)); // true ...
Java编程语言将内存划分为两种主要区域:栈内存和堆内存。栈主要用于存储基本类型变量和对象的引用,而堆则是用于存储由`new`关键字创建的对象和数组。 栈内存的特点在于它的快速存取和自动管理。当在代码中定义一...
在Java编程语言中,`equals()` 和 `==` 是两种常用的比较操作,它们在处理不同数据类型时有着明显的区别。本文将深入探讨这两个操作符在Java中的行为,特别是在处理引用类型,尤其是`String`类时的差异。 首先,...
- **使用拦截器**:在 `<action>` 中通过 `<interceptor-ref>` 或 `<interceptor-stack>` 使用已定义的拦截器或拦截器栈。 ##### 2. **结果类型配置** - **定义结果类型**:通过 `<result-type>` 元素可以定义新的...
### 使用栈实现多层返回功能 #### 背景与目的 在开发用户界面时,一个常见的需求就是实现用户在不同层级页面之间的返回操作。...同时,由于栈的实现相对简单,因此在实际项目中也比较容易维护和扩展。
Java中Object.equals和String.equals的区别详解 Java中的Object.equals和String.equals是两个不同的equals方法,它们之间的区别是非常重要的,理解这两个方法的区别对于我们编写高质量的Java代码非常重要。 首先,...