两个必须存放在堆中 str指向堆中的Hello对象 也就是说 两个对象和str的地址全部存放在堆中 String str="abc"; * 引用数据类型肯定存放在堆中 栈中放置的是参数变量而不能放对象 对象只能放在堆中 它只创建一个对象 在堆中创建一个对String类的对象引用变量str(引用变量肯定是存放在堆里的)...
java中字符串常量放在哪里
回答的人好多,建议找本书看看,误人子弟的多 - -!
自己试验一下的好。
注意两个问题 一个是String的equals方式是被重写过的。默认情况下 equals 就是==
第二只要是new操作必然产生新对象,以及对象对内存地址的引用。
因此str1==str2 为false 但是equals却是true
而str1 和 2 是两个内存地址,指向的内存对象也是2个
String str1 = "Hello";此方式jvm会在new String的时候进行一个判断,如果已经存在那么会直接指向那个地址。因此字符串的操作要比stringbuffer操作字符串慢很多2013-05-08
/* * 看程序写结果 * 字符串如果是变量相加,先开空间,在拼接。 * 字符串如果是常量相加,是先加,然后在常量池找,如果有就直接返回,否则,就创建。 */public class StringDemo4 {public static void main(String[] args) {String s1 = "hello";String s2 = "world";String s3 = "helloworld";System.out.println(s3 == s1 + s2);// falseSystem.out.println(s3.equals((s1 + s2)));// trueSystem.out.println(s3 == "hello" + "world");// false 这个我们错了,应该是trueSystem.out.println(s3.equals("hello" + "world"));// true// 通过反编译看源码,我们知道这里已经做好了处理。// System.out.println(s3 == "helloworld");// System.out.println(s3.equals("helloworld"));}}2015-12-07
str1和str2分别
创建两个对象 Hello对象和str引用对象
两个必须存放在堆中
str指向堆中的Hello对象
也就是说 两个对象和str的地址全部存放在堆中
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
String str2 = "abc";
String str3=new String ("abc");
String str4 =new String ("abc");
equals:equals就是比较值 ==在基本类型里也是比较值 在引用类型里是比较地址 注意这个区别就OK了!
表示堆中的引用变量的值是否相同(引用类型变量比较的是他们本身的值,本身的值是通过引用变量地址指向的对象或字符串来得到的,不管这个被指向的字符串或者对象是在栈中还是堆中)
==:表示堆中或者栈中的基本类型的值或者引用变量的地址是否相同(基本类型比较的是他们本身的值,引用类型变量比较的是地址)
当equals为true时,==不一定为true;2013-05-08
这个是在内存中存放的地址,你必须str1.equals(str2)才可以判断的。
你可以输出地址看看,你这样比较的是两个地址,当然是false了。
第一个直接缓存 数据共享Hello,是true。2013-05-08
第一种方式首先在栈中创建一个变量 str1,str2,然后通过引用去字符串常量池中查找是否有"hello"字符串,如果没有则将"hello "字符串存入字符串常量池,并使 str1和str2 指向此常量。如果有此字符串则直接指向。
第二种方式是用new来新建对象,存放在堆中,每次调用都会新建一个对象。不会指向同一个引用对象。2013-05-08
但是堆区对象中也有一个引用,那么着两个对象里的引用指向的是同一个并且存放在数据区中的那个Hello么?
=============
不是同一个,指向的堆栈不一样
还是每一个对象各自引用一个Hello,如果是这样那么这个Hello又放在哪里?
=============
在内存里新开了一块地方存这个Hello2013-05-08
不是同一个,数据就在堆里面啊,每一个对象都在堆里有一个Hello2013-05-08