A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

*******************
String str="abc"; *    引用数据类型肯定存放在堆中  栈中放置的是参数变量而不能放对象 对象只能放在堆中
*******************
它只创建一个对象 在堆中创建一个对String类的对象引用变量str(引用变量肯定是存放在堆里的),然后查找栈中是否有"abc",若没有则将"abc"存放进栈,并令str指向"abc",若已经存在则直接令str指向"abc".(也就是说引用变量本身只能存放在堆中 它的值是所指向的字符串abc 它的地址存放在栈中) 它创建多个"abc"字符串在内存中其实只存在一个对象而已,这样有利于节省内存空间同时在一定程度上提高程序运行速度
******************************
String str=new String("abc");*  所以通过new操作符的操作都是在堆完成的
******************************
它创建两个对象 abc对象和str引用对象 两个必须存放在堆中 str指向堆中的abc对象 也就是说 两个对象和str的地址全部存放在堆中 因为使用了new操作符 所以下面的例子里str2str3str4即使是值都为abc因为str2的地址在栈中 str3str4的地址各自开辟空间 所以他们的地址肯定不一样了
但是它们的值是一样的 那就是abc
*******
equals:* equals就是比较值  ==在基本类型里也是比较值 在引用类型里是比较地址 注意这个区别就OK了!
*******
表示堆中的引用变量的值是否相同(引用类型变量比较的是他们本身的值,本身的值是通过引用变量地址指向的对象或字符串来得到的,不管这个被指向的字符串或者对象是在栈中还是堆中)
****
==*
****
表示堆中或者栈中的基本类型的值或者引用变量的地址是否相同(基本类型比较的是他们本身的值,引用类型变量比较的是地址)
equalstrue时,==不一定为true
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true
String str3=new String ("abc");
String str4 =new String ("abc");
System.out.println(str3==str4); // false
----------------------我是分割线---------------------------------
理解下堆和栈的区别
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区—常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
【】例子程序
这是一个前辈写的,非常详细
//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b;
char s[] = "abc";
char *p2;
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得1020字节的区域就在堆区。
strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}  


评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

4 个回复

倒序浏览
值得学习ing!
回复 使用道具 举报
误区: String str="abc"  ,字符串常量"abc"不是在栈中,也不是在堆中,是方法区中的静态区,叫常量池,栈中的引用变量str 指向常量池中的字符串常量"abc","abc"有自己的内存地址, str持有该地址
误区:全局变量和静态变量不会在同一个区域,静态只能修饰全局的,静态变量存在静态区中,而全局变量是对象的属性是在堆中
误区:静态方法中不可有静态修饰的变量

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
总结的很全面
回复 使用道具 举报
是这样吗
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马