java 存储讨论

1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 
2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。) 
3. 堆:存放所有new出来的对象。 
4. 静态域:存放静态成员(static定义的) 
5. 常量池:存放字符串常量和基本类型常量(public static final)。 
6. 非RAM存储:硬盘等永久存储空间

这里我们主要关心栈,堆和常量池,对于栈和常量池中的对象可以共享,对于堆中的对象不可以共享。栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。堆中的对象的由垃圾回收器负责回收,因此大小和生命周期不需要确定,具有很大的灵活性。 
对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。 
如以下代码:

Java代码 
1.String s1 = "china";  
2.String s2 = "china";  
3.String s3 = "china";  
4.String ss1 = new String("china");  
5.String ss2 = new String("china");  
6.String ss3 = new String("china");  
对于通过new产生一个字符串(假设为”china”)时,会先去常量池中查找是否已经有了”china”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”china”对象的拷贝对象。这也就是有道面试题:String s = new String(“xyz”);产生几个对象?一个或两个,如果常量池中原来没有”xyz”,就是两个。 
对于基础类型的变量和常量:变量和引用存储在栈中,常量存储在常量池中。 
如以下代码:

Java代码 
1.int i1 = 9;  
2.int i2 = 9;  
3.int i3 = 9;   
4.public static final int INT1 = 9;  
5.public static final int INT2 = 9;  
6.public static final int INT3 = 9;

对于成员变量和局部变量:成员变量就是方法外部,类的内部定义的变量;局部变量就是方法或语句块内部定义的变量。局部变量必须初始化。 
形式参数是局部变量,局部变量的数据存在于栈内存中。栈内存中的局部变量随着方法的消失而消失。 
成员变量存储在堆中的对象里面,由垃圾回收器负责回收。 
如以下代码:

Java代码 
1.class BirthDate {  
2.    private int day;  
3.    private int month;  
4.    private int year;      
5.    public BirthDate(int d, int m, int y) {  
6.        day = d;   
7.        month = m;   
8.        year = y;  
9.    }  
10.    省略get,set方法………  
11.}  
12.  
13.public class Test{  
14.    public static void main(String args[]){  
15.int date = 9;  
16.        Test test = new Test();        
17.           test.change(date);   
18.        BirthDate d1= new BirthDate(7,7,1970);         
19.    }    
20.  
21.    public void change1(int i){  
22.        i = 1234;  
23.    }  
对于以上这段代码,date为局部变量,i,d,m,y都是形参为局部变量,day,month,year为成员变量。下面分析一下代码执行时候的变化: 
1. main方法开始执行:int date = 9; 
date局部变量,基础类型,引用和值都存在栈中。 
2. Test test = new Test(); 
test为对象引用,存在栈中,对象(new Test())存在堆中。 
3. test.change(date); 
i为局部变量,引用和值存在栈中。当方法change执行完成后,i就会从栈中消失。 
4. BirthDate d1= new BirthDate(7,7,1970);  
d1 为对象引用,存在栈中,对象(new BirthDate())存在堆中,其中d,m,y为局部变量存储在栈中,且它们的类型为基础类型,因此它们的数据也存储在栈中。 day,month,year为成员变量,它们存储在堆中(new BirthDate()里面)。当BirthDate构造方法执行完之后,d,m,y将从栈中消失。 
5.main方法执行完之后,date变量,test,d1引用将从栈中消失,new Test(),new BirthDate()将等待垃圾回收。

来源:http://blog.csdn.net/yuan22003/article/details/6822221

时间: 2024-10-12 16:12:28

java 存储讨论的相关文章

Java学习(三):Java存储区分类

Java中把存储区分为6类.分别为寄存器(register).栈(stack).堆(heap).静态存储区(static storage).常量存储区(constant storage)以及非随机存取存储区(Non-RAM). 1. 寄存器(register).寄存器与其他的存储区不同,它位于CPU中,所以它是存取速度最快的存储区.但是由于CPU中寄存器的数量是非常有限的,所以寄存器的使用是由CPU按需进行分配.编程的时候我们没有必要去对它进行直接控制.并且在程序中也没办法找到到底什么时候使用了

Java存储密码用字符数组

字符数组和字符串都可以用于存储文本数据,但是在选择具体哪一种时,如果你没有针对具体的情况是很难回答这个问题的.但是任何与字符串相关的问题一定有线索可以在字符串的属性里面找到,比如不可变性.他就用这种方式去说服面试官.这里我们就来探讨一些关于为什么你应该使用char[] 来存储密码而不是字符串. 因为字符串是不可变对象,如果作为普通文本存储密码,那么它会一直存在内存中直至被垃圾收集器回收.因为字符串从字符串池中取出的(如果池中有该字符串就直接从池中获取,否则new 一个出来,然后把它放入池中),这

Java存储区详解

    Java中把存储区分为6类.分别为寄存器(register).栈(stack).堆(heap).静态存储区(static storage).常量存储区(constant storage)以及非随机存取存储区(Non-RAM). 1. 寄存器(register).寄存器与其他的存储区不同,它位于CPU中,所以它是存取速度最快的存储区.但是由于CPU中寄存器的数量是非常有限的,所以寄存器的使用是由CPU按需进行分配.编程的时候我们没有必要去对它进行直接控制.并且在程序中也没办法找到到底什么时

Java存储数据的几个地方

1. 寄存器 这是最快的存储区,位于处理器内部,不能直接控制.    2. 堆栈 位于RAM中,堆栈指针向下移则分配新的内存:堆栈指针向上移则释放内存.存储速度仅次于存储器. 创建程序时Java系统必须知道存储在堆栈内的所有项的生命周期,以便上下移动堆栈指针.通常用于存放对象引用,对象并不存放在堆栈中. *特例:Java基本类型,不用new来创建变量,而是创建一个并非是引用的"自动"变量.这个变量直接存储"值",并置于堆栈中.基本类型存储了实际的值,而并非对象的引用

java 存储对象

一.存储区域: 1)寄存器.这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器根据需求进行分配.你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象. 2)栈.位于通用RAM(随机访问存储器)中,但通过堆栈指针可以从处理器那里获得直接支持.推栈指针若向下移动,则分配新的内存:若向上移动,则释放那些内存.这是一种快速有效的分配存储方法,仅次于寄存器.创建程序时,Java系统必须知道存储在栈内所有项的确切生命周期,以便上下移动堆栈指针.这一约束

一个挺有意思的Java技术讨论

为什么Java中1000==1000为false而100==100为true? 这是一个挺有意思的讨论话题. 如果你运行下面的代码: 基本知识:我们知道,如果两个引用指向同一个对象,用==表示它们是相等的.如果两个引用指向不同的对象,用==表示它们是不相等的,即使它们的内容相同. 因此,后面一条语句也应该是false . 这就是它有趣的地方了.如果你看去看 Integer.Java 类,你会发现有一个内部私有类,IntegerCache.java,它缓存了从-128到127之间的所有的整数对象.

Java 存储和读取 oracle CLOB 类型字段的实用方法

package oracle.clob; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.sql.Connection; import java.sql.DriverManager; import java

可能是最全的Java单例模式讨论

单例模式 最简单但是也挺困难的. 要保证在一个JVM中只能存在一个实例,要考虑到如下的情况: Java能够使用那些方式构建对象 Java在创建对象时多线程并发情况下是否仍然只能创建一个实例 Java创建对象的方法: new 最常用的,直接使用构造器创建. 每new一次都会产生新的实例.所以单例中应该只new一次,当再想用对象时都返回该对象的值 Class.newInstance() 该方法会调用public 的无参构造器. 为了防止这个方式创建,只要把构造器设置为private的就可以了.这是如

java存储位置经典例子

String a="a";String b="b";String c="ab";String d="ab";String e=a+b; 程序中用来存放数据的内存分为四块1.全局区(静态区)(static)2.文字常量区 :常量字符串就是放在这块区域,即是我们常说起的常量池.3.栈区(stack):存放函数的参数值,局部变量的值等.4.堆区(heap) : 存放对象 当我们定义字符串String a = "a"