欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java中关于字符串特别有意思的事

程序员文章站 2024-03-12 21:07:20
...

先让我们看一组比较有意思的测试代码,在本次测试中我们分别定义了两个不同的字符串,但赋予他们相同的值,先不要看结果,先让我们猜猜两个字符串所指向的地址是否一样呢。(我们以哈希地址来间接的查看地址是否相同)

class test{
	String s1="1";
	String s2="2";
	public static void main(String[] args) {
		String s1="1";
		String s2="1";
		System.out.println(s1.hashCode());//输出s1的哈希地址
		System.out.println(s2.hashCode());//输出s2的哈希地址
		System.out.println(s1==s2);//判断是对象内存地址是否相等
	}
	
}

让我们看一下测试结果:
Java中关于字符串特别有意思的事
从图片上我们可以发现结果显示为true,这也就意味着是s1和s2都指向了同一内存块
当我们在此改变一下测试案例,将s1和s2的值改为不相同,让我们在此看下结果。

class test{
	String s1="1";
	String s2="2";
	public static void main(String[] args) {
		String s1="1";
		String s2="2";
		System.out.println(s1.hashCode());
		System.out.println(s2.hashCode());
		System.out.println(s1==s2);
	}
	
}

Java中关于字符串特别有意思的事
此时我们发现两个变量此时分别指向了不同内存。
让我们以String类的构造函数来初始化

class test{
	String s1="1";
	String s2="2";
	public static void main(String[] args) {
		String s1=new String("1");
		String s2=new String("1");
		System.out.println(s1.hashCode());
		System.out.println(s2.hashCode());
		System.out.println(s1==s2);
	}
	
}

结果测试:
Java中关于字符串特别有意思的事
此时我们发现两个对象的哈希地址相同,但结果却显示false。此时我们可以由flase得到的结论是两者指向的的内存地址是不相同的
那我们再次看下第一次测试和本次测试发现两次测试的的哈希地址均是相同的的,由此我们得到结论哈希地址并不能代表对象的内存地址,不具有唯一性
接下来看最后一组测试案例

class test{
	String s1="1";
	String s2="2";
	public static void main(String[] args) {
		String s1=new String("1");
		String s2=new String("2");
		System.out.println(s1.hashCode());
		System.out.println(s2.hashCode());
		System.out.println(s1==s2);
	}
	
}

测试结果如下:
Java中关于字符串特别有意思的事
由此我们可以得出结论,当我们采用字符串直接赋值时,当两个对象的内容相同时,将会指向统一内存地址,而当内容不同时,将分别指向两个不同的地址。当采用字符串的构造方法赋值时,无论内容是否相同,都不会指向统一内存地址。
如有错误,恳请指出。感谢。