黑马程序员技术交流社区
标题: String与New String的区别,搞不清楚的进来看看吧~ [打印本页]
作者: 马年出黑马 时间: 2014-4-3 04:06
标题: String与New String的区别,搞不清楚的进来看看吧~
*******************
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操作符 所以下面的例子里str2,str3和str4即使是值都为abc因为str2的地址在栈中 str3和str4的地址各自开辟空间 所以他们的地址肯定不一样了
但是它们的值是一样的 那就是abc
*******
equals:* equals就是比较值 ==在基本类型里也是比较值 在引用类型里是比较地址 注意这个区别就OK了!
*******
表示堆中的引用变量的值是否相同(引用类型变量比较的是他们本身的值,本身的值是通过引用变量地址指向的对象或字符串来得到的,不管这个被指向的字符串或者对象是在栈中还是堆中)
****
==:*
****
表示堆中或者栈中的基本类型的值或者引用变量的地址是否相同(基本类型比较的是他们本身的值,引用类型变量比较的是地址)
当equals为true时,==不一定为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);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}
作者: 许庭洲 时间: 2014-4-25 10:18
值得学习ing!
作者: 张志成 时间: 2014-4-29 00:36
误区: String str="abc" ,字符串常量"abc"不是在栈中,也不是在堆中,是方法区中的静态区,叫常量池,栈中的引用变量str 指向常量池中的字符串常量"abc","abc"有自己的内存地址, str持有该地址
误区:全局变量和静态变量不会在同一个区域,静态只能修饰全局的,静态变量存在静态区中,而全局变量是对象的属性是在堆中
误区:静态方法中不可有静态修饰的变量
作者: Ricky_Nick 时间: 2014-5-7 10:21
总结的很全面
作者: 张志民 时间: 2014-5-11 22:21
是这样吗
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |