java String类中,
String s = "abc";
s = "d";
我知道上面个s和下面个s的地址值不一样,但是怎么证明呢,我这样写,就相当于
把上面s‘’abc‘’的地址覆盖了,那我怎么拿到第一个s的地址呢
在需要的地方打断点调试,可以直接看变量的地址
Java不允许程序员管理内存,内存地址对Java程序员来说是透明的,你是看不到的
public static void main(String[] args) {
String s = "abc";
System.out.println(System.identityHashCode(s));
s = "d";
System.out.println(System.identityHashCode(s));
}
我将我的理解打出来看看, 不知对不对, 不对的话请大家指教一下
public class Test {
public static void main(String[] args) {
String s = "abc";
//将 x 指向 s 指向的地址
String x = s;
System.out.println(s == x);
//s 指向 "b"
s = "d";
System.out.println(s == x);
s = x;
System.out.println(s);
}
}
地址你是看不到的,可通过代码验证
要想获得直接的证据,可以用jmap等jvm调试工具dump内存,然后看看到对象的存储。不过根据java的语言规范,可以推断,比如用==号。
java不存在字符串“覆盖”一说,字符串是只读的。
同意楼上,打断点,找出变量的地址,不过我建议分别用指针定义出两个变量的地址,不会出现重复的
题主有强迫症!!!!String s ="abc"; 了类似于 String s = new String("abc"); s = "b"; 相当于 s = new String("d"); 没有覆盖abc的地址, 而且是s 是一个新的地址,abc还在内存中等待GC来拉走处理掉!
java本身就在防止真实地址被看到
第一个句话,创建了一个s的string对象,第二句把指针指向一个新地址,从代码角度来说,第一个地址已经被重新指向了,就是被覆盖了。打断点也是可以看的,去看看深入理解jvm虚拟机吧,会对你的疑惑有很全面的解释
放到临时变量中
String s="abc";
String temp=s;
s="d";
然后temp==s比较
public static void main(String[] args) {
String s = "abc";
System.out.println(System.identityHashCode(s));
s = "d";
System.out.println(System.identityHashCode(s));
}
不知道题主是怎么理解string的。 一般理解应该是,每新建一个字符串就是new了一个对象,对象一的地址和对象二的地址当然不同,你都给s当然就没有意义了
第一个s的地址是"abc"的地址
重新定义个变量不就行了
java 中String类型一旦初始化便无法修改其值,可以将两个s地址打印出来做比较
分别打印出哈希地址做对比
在第二次对s赋值时,第一个字符串的地址已经被丢弃了,等待gc回收
第一个赋值相等,第二个在内存里申请了空间,两个则不相等
JVM将会使用常量池(constant pool)管理这些字符串,当使用new String("abc")时,JVM会先使用常量池管理“abc”常量,再调用String类创建构造器来创建
新的String对象,新创建的String对象被保存在堆内存中。常量池(constant pool)专门用于管理在编译时被确定并保存在已编译的.class文件中的一些数据
它包括类、方法、接口中的常量,还包括字符串常量
每新建一个字符串就是分配一块存储空间、new了一个对象
String s = "abc"; //相当于new 了一个String的对象,会在堆内存中开辟一个存储空间,存放"abc",s是"abc"值地址的引用
s = "d";//会在内存中新开辟一个存储空间存放'd',s变量重新引用一个新的地址,指向堆内存中的值"d"
第一个地址没有被引用,"abc"会等待GC处理回收
字符串的比较是==比较引用,equals 比较值
上面人给你讲过了 我就不讲了,急需要积分下载navicat破解版,楼主行行好~~~
String s = "abc" 相当于 String s = new String("abc");这时候堆内存中的“abc”是被栈内存的“s”变量指向的
s = "d";也相当于 s = new String("d"); 相当于新new了一个String对象指向了栈内存的"s"变量,而此时“abc”没有任何对象,变为垃圾等待回收
怎么拿到第一个s的地址: String temp=s;
怎么证明上面个s和下面个s的地址值不一样:判断 if( s==temp)
s原本是指向"abc"的地址的,但是现在指向了一个新的地址,原本的地址应该是取不到了哦
直接String a= “abc”,获取的就是原abc的字符串对象的引用,也就是它保存的字符串的地址,前提:被释放引用的字符串对象未被GC回收。
用==比较地址,或者打印出地址都可以
用idea断点调试 能看到他俩的地址
执行完s = "d";以后就拿不到"abc"的地址了,"abc"这个对象稍后会被GC回收
String.length()求字符串长度
哦输出两次每个s的地址