String str = new String("abc")内存分配问题

 

 

一、JAVA数据存储类型:栈和堆 

好处:1 栈:优点:数据可以共享,存取速度快仅次于CPU中寄存器,

   缺点:存在栈中的数据大小和生命周期必须是固定的,缺乏灵活性

 

2 堆:好处:可以动态分配内存大小,生存期不必告诉编译器,垃圾回收器自动回收不适用的数据 

              缺点:由于动态分配内存使得存取速度快 ;

 

 

二、数据的存放

基本数据类型存放在栈中: 

基本数据类型如:int, short, long, byte, float, double, boolean, char;他们大小固定,生存期可知,

出于追求速度,就存在栈中了

堆中存放:对象,类以及应用等信息 

如:Integer,String,Double等Java用new()语句来显示告诉编译器,在运行时才根据需要动态创建,

因此比较灵活,但缺点占用更多的时间。

 

三、理解栈数据的共享

如:int a=3; int b=3 ;

程序执行:1 创建a的一个引用, 2查找是否有值为3的地址,如果有则讲a指向3的地址,没有则创建一个存放数值为3的地址,然后指向即可

 然后处理  int b=3 ; 在创建完b的引用变量后,由于在栈中已经有3这个数值,便将b直接指向3的地址。这样,就出现了a与b同时均指向3的情况

引用变量存放在栈中,直接指向堆中内存区域的首地址。

 

四、String包装类的理解

这种类,既可以用String str = new String("abc");的形式来创建,也可以 String str = "abc"

1 理解String str = "abc"  ,这种形式和基础数据类型存储很相似, 

先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。 

2 中用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象在堆中。 

结论:

  1 因此用第二种方式创建多个”abc”字符串,在内存中其实只存在一个对象而已. 这种写法有利与节省内存空间. 

           同时它可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。

  2 对于String str = new String("abc");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。 

       另一方面, 要注意: 我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为,创建了String类的对象str。

      担心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的对象。只有通过new()方法才能保证每次都创建一个新的对象。

   3 由于String类的immutable性质,当String变量需要经常变换其值时,应该考虑使用StringBuffer类,以提高程序效率。

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值