java数据存储

Java中数据存储区域包括:


1.寄存器:最快的存储区,由编译器根据需求进行分配,我们在程序中无法控制. 


2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)


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


特别注意的是,这种字面值的引用与类对象的引用不同。假定两个类对象的引用同时指向一个对象,如果一个对象引用变量修改了这个对象的内部状态,那么另一个对象引用变量也即刻反映出这个变化。相反,通过字面值的引用来修改其值,不会导致另一个指向此字面值的引用的值也跟着改变的情况。如上例,我们定义完a与b的值后,再令a=3;那么,b不会等于3,还是等于7。在编译器内部,遇到a=3;时,它就会重新搜索栈中是否有3的字面值,如果没有,重新开辟地址存放3的值;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。  


3. 堆:存放所有new出来的对象。 


4. 静态域:存放静态成员(static定义的) 


5. 常量池:在堆中分配出来的一块存储区域,用于存储显式 Stringfloat或者integer.例如String str="abc"; abc这个字符串是显式声明,所以存储在常量池。


6. 非RAM存储:硬盘等永久存储空间 


7.String特殊区域说明:String,String类型时不可变,因此它需要被存储在常量池中;它的可变版本为StringBuffer;


String的类定义是public final class String,即它不可以被继承.而且String对象存储的值是不可变的.如果一个String对象存储了"abc"的值,你不可能把abc修改成abcd.除

非改变string变量的引用,让它指向另外一个String对象. 

StringBuffer和StringBuilder可以存储字符串,也可以改变所存储对象的值. 

不同的是StringBuffer是线程安全的,在多线程里面使用这个,不会出现每运行一次就有不同的结果这种情况发生,但也因此牺牲了性能. 


StringBuilder不是线程安全的,比较适合单线程的情况.不过也因此,它在性能上比StringBuffer要好.

 
在单线程,需要对存储字符串的值做改动时,优先使用StringBuilder.

String有两种建立方法:


(1)String str=“string”;直接赋值给常量str,并将数据存放在常量池中。


(2)String str=new String(“string”);a.先去常量池中查找是否已经有了”string”对象,如果有,则直接在堆上new 一个"string"对象,建立了一个对象;如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”string”对象的拷贝对象,因此建立了两份对象。


在常量池里的,内容相同需要共享一个存储区域;若放在堆里,内容相同,仍然新建存储区域。


(3)而String str4 = str1+str2,则相当于新建了对象str4,其值为str1+str2,仍然放在堆里。


(4)String str4 = "a"+"bc";    //在编译时被优化成String str4= "abc";    

<span style="font-size:18px;">public class StringTest {


	public static void main(String[] args) {
	   
		String str1="a";
		String str2="bc";
		String str3="abc";
                String str4="a"+"bc";//此种情况下是true
		
		String str4=str1+str2;//此种情况下是false
	        String str4=new String("abc");//false
		System.out.println(str4==str3);

			
	}

}</span>

引用下大神的图片


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值