Java中堆栈一直是让人头痛的问题。这里总结一下。
Java把内存划分成两种:一种是栈内存,一种是堆内存。栈中存放是基本类型与引用类型,堆中存放的是对象类型与数组(当然数组也是对象类型)。
栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本 类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。
栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义:
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”。
比较类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用==,下面用例子说明上面的理论。
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); // false
用new的方式是生成不同的对象。每一次生成一个。
因此用第二种方式创建多个”abc”字符串,在内存中其实只存在一个对象而已. 这种写法有利与节省内存空间. 同时它可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。
另一方面, 要注意: 我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为,创建了String类的对象str。担心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的对象。只有通过new()方法才能保证每次都创建一个新的对象。 由于String类的immutable性质,当String变量需要经常变换其值时,应该考虑使用StringBuffer类,以提高程序效率。
分享到:
相关推荐
在 Java 中,基本类型变量存储在栈中,而引用类型的对象存储在堆中,对象的引用地址存储在栈中。因此,在 finally 中改变基本类型变量的值对返回值没有任何影响,而改变引用类型变量的值则有影响。 通过上面的讨论...
- **对象的作用域**:与基本类型不同,Java对象的作用域更加灵活。当我们使用`new`关键字创建对象时,该对象可以在其作用域之外继续存在。例如: ```java { String s = new String("this is a string"); } ``` ...
本课件主要介绍了Java面向对象编程的基础知识,包括类和对象的关系、面向对象的思想、构造方法、对象创建的内存模型、垃圾回收机制、Java中的关键字等。 一、类和对象的关系 在面向对象编程中,类和对象是两个基本...
Java 中各种数据的默认值有 Byte、short、int、long 等整形默认为 0,Boolean 默认为 false,Char 类型的默认值是 ’ ’,Float 和 double 类型的默认值是 0.0,对象类型的默认值是 null。 2. Java 中有哪些常用包...
4. **多态的应用**:通过父类引用调用子类对象,根据实际对象类型决定具体执行哪个版本的方法。 **例题解析**: 1. **选择题**: - 下列关于抽象类的说法中错误的是: - A) 抽象类中可以没有抽象方法。 - B) ...
第二章:Java 基本类型 * Byte:字节,用于表示 Java 字节类型。 * Char:字符,用于表示 Java 字符类型。 * Boolean:布尔,用于表示 Java 布尔类型。 * Short:短整型,用于表示 Java 短整型类型。 * Int:整形,...
在Java与面向对象程序设计部分,书中从基本语言知识开始,包括基本数据类型、运算符、流程控制语句、字符串以及数组等,然后转向Java的面向对象特性,涉及类与对象的使用、继承的概念、接口的定义以及异常处理机制和...
Hibernate是一个开源的对象关系映射(ORM)框架,它简化了Java应用与数据库之间的交互。通过Hibernate,开发者可以用面向对象的方式处理数据库操作,减少直接编写SQL的复杂性。了解Hibernate的基本概念、配置、实体...
- **加载与存储指令**: 介绍了如何从堆栈中加载数据到寄存器,以及如何将数据从寄存器存储回堆栈。 - **算术指令**: 包括加法、减法、乘法、除法等基本运算指令。 - **类型转换指令**: 如何在不同类型之间进行转换。...
1. **基础语法**: 书中首先介绍了Java的基础语法,包括数据类型(如基本类型和引用类型)、变量、运算符、流程控制(if语句、for循环、while循环等)以及函数的定义和调用。 2. **面向对象编程**: 针对Java的核心...
Java 中有基本数据类型(整数、浮点数、字符、布尔值等)和引用数据类型(数组、类、接口等)。 * Java 中什么是继承?继承是指一个类从另一个类继承属性和行为的机制。 * 如何实现继承?使用 extends 关键字实现...
Java基础知识点总结 Java是一种面向对象的编程语言,它广泛应用于Android应用程序开发、Web应用程序开发、企业软件开发、嵌入式系统开发等领域。下面是Java基础知识点的总结: ...* 对象类型的默认值是null
在本章节中,我们将深入探讨Java的基础知识,包括基本数据类型、流程控制语句、字符串处理以及数组的使用,这些都是构建更复杂数据结构和算法的基础。此外,我们还将详细讲解Java的面向对象特性,如类与对象的概念、...
- **基本数据类型及运算**:介绍Java中的基本数据类型如整型(`int`, `long`)、浮点型(`float`, `double`)、字符型(`char`)等,以及它们之间的基本运算规则。 - **流程控制语句**:包括条件语句(`if-else`)...
第一章主要介绍了Java语言基础知识,包括基本数据类型、运算、流程控制语句、字符串、数组等,同时详细讨论了Java的面向对象特性,例如类与对象、继承、接口以及异常处理和Java与指针的概念。 第二章介绍了数据结构...