问题 如题.
比如 有int a = 0;
那么怎么才能看到 这个a 在内存中的地址呢?
还有一个问题就是 如果我也定义一个 变量 int b = 0;定义在同一个类中,那么是不是意味着a 和b 的地址是同一个呢.如果是同一个那么 对a 进行操作时,如何保证不影响 b 呢.
因为 String 类型时有 String str1 = "abcd";
String str2 = "abcd";
str1 和str2 在内存中是同一个空间故有此疑问.
比如 有int a = 0;
那么怎么才能看到 这个a 在内存中的地址呢?
还有一个问题就是 如果我也定义一个 变量 int b = 0;定义在同一个类中,那么是不是意味着a 和b 的地址是同一个呢.如果是同一个那么 对a 进行操作时,如何保证不影响 b 呢.
因为 String 类型时有 String str1 = "abcd";
String str2 = "abcd";
str1 和str2 在内存中是同一个空间故有此疑问.
String str1 = "abcd";和String str2 = "abcd"; 也不可能在一块类存区,除非中间用个str1=str2;
他们是占用同一块内存空间的。
所有在程序中出现的“abcd”这样的东西,都是在编译时就确定的,会将他们放在常量池里,如果出现多次相同的,常量池里只会有一个。如果你担心这样是不是会str1 = "xxxx",这样str2就变了,那么别忘记String 是 final的。
另外如果String是new出来的或者通过其他方式得来的,这个是在运行时才申请空间的。String str1 = new String("abcd");
String str2 = new String("abcd");
str1 == str2就不成立了。
hashCode() 有人说是可以看,但是我自己试了一下 .这个方法 对String 来说似乎要解释成 是String里面的内容跟合理一些.
String as = new String("te45");
String as2 = new String("te1");输出
System.out.println(as.hashCode());
System.out.println(as2.hashCode());3554482
114656把as改为 String as = new String("te2");
输出为:
114657
114656
String的值是不变的,String a = "abc",会把a放在常量池中,如果再声明
String b ="abc", 则a和b是指向同一个引用.你可以用==或equals()验证.
如:System.out.pringln(a==b);或System.out.pringln(a.equals(b));
用同样的方法,看看和上面的区别.你就能明白一些了.
String a=new String("abc")
String b=new String("abc")
a,b就不会占用相同的内存空间
字符串特殊....整形完全没有这个的说
兄台 能否 告知如何用 hashCode 看地址呢?
他提供了一个数值范围的对象池,可能有助于提高运行效率,实则鸡肋的特性。
a 并不是 直接操作内存,而是由jvm操作的,c++就可以直接操作内存块,所以你要得到a的内存的地址,我个人
觉得比较有难度,当然要得到也是可以的。至于hashcode,这个不是内存地址吧,还有我觉得java都明白的告诉
你要让java比c++减少更多的编程错误,其中,指针的概念就是为此而消失的。
当String s=new String(“123”)时,这是才会在内存中开辟一个空间存取“123”,其中的S其实只是指向了对象“123”的首地址,这是我们只要操作这个句柄S就可以对对象进行操作了!(很多人都把S叫成对象,其实它并不是对象)
按LZ说的String str1 = "abcd";
String str2 = "abcd";
确实是它们指向了同一个内存地址,是因为本来就有“abcd”这个对象,现在将“abcd”的首地址同时给了str1,str2,所以str1,str2才指向了同一个内存地址,只有当你用NEW这个关键字的时候才会在内存中开辟空间!
现在在做个比较 String s1=new String("abcd");
String s2=new String("abcd");
这里用NEW开辟了两个内存空间,都是用来存取“abcd”,并分别用s1,s2来引用他们的首地址!LZ可以想想,在内存中开辟两个空间,你说它们在内存中的地址会一样吗,虽然都是存放的是相同的东西!
当我们用“s1==s2”去比较它们的时候是比较他们的地址,所以s1,s2是不相等的,但是当我们用的“s1.equals(s2)”时是比较的内容(特别注意,在用equals比较时,只有String ,Date,File以及封装类时是比较的内容,因为它们对ToString()方法进行了重写,其他的并没有进行重写,所以还是比较的HashCode,也就是比较的是地址值,是不相等的)很多人都以为equals()都是比较的内容,但是前提是进行了重写!!!
然后我还想在请教一个问题. String有这样的特性(str1 = "abc" str2 = "abc" str1 的地址和str2的地址一样). 我的新问题是: Integer Float Double Character 有这样的性质吗?
int float double char 没有这样的性质是吗?
还有个 疑问是如果 Integer 也有和String 一样的性质(Integer i1 = 2; Integer i2 = 2; i1 = i2)那 它如何做到数据 修改不互相影响的.因为String是固定的所以没有这个问题.但是Integer 不是固定的啊.要是两个对象指向同一个地址,修改了一个那另一个不是也改了?
String b="abcd";
System.out.println(a==b);
这样输出true,就可以知道a和b指向同一块内存了,然后改变a="efgh";System.out.println(b);输出还是abcd,就可以知道了,
改变a的值(其实是a的指向),并不会影响到b的值(即b的指向).至于int类型的,根本不是引用类型...
但是同样的代码用VC 编译 运行就会发现值相同的话,输出的地址是一样的.
所以我主要是想知道.JAVA 是否也是 值相同就放到 同一个空间里.如果是放到同一个空间里.那么如何解决的,对一个值修改但是又不影响其他值的? 因为他们是两个不同变量,从理论上讲他们应该彼此没有关系的,修改任一个的值不会 影响其他的.
int a =1;int b=1;
在java中值相同,a和b是使用同一块内存空间的,a,b只是这块空间不同的引用而已。一同指向值为1的空间。
很多人误以为开辟了2块空间。