Java中关于字符串对象一些易错的点

Java字符串对象一些易错的点


1.字符串直接量:

		String s1="abc";
		
		String s2="a"+"bc";
		
		System.out.println(s1==s2);

上面的结果输出为true,我相信大家都是没有疑问的,s2在编译时期就能确定下来,字符串对象为"abc",所以s2就会直接指向与字符串常量池中s1定义的字符串对象存储的位置,所以结果为true。


2.new 出一个字符串:

		String s1="abc";
		
		String s2=new String("abc");
		
		System.out.println(s1==s2);

上面的结果为 false。你能理解吗?
首先 s1为一个字符串直接量,当定义了s1后,首先会在字符串池中查找是否存在该字符串,即"abc",如果不存在,就会创建一个字符串对象"abc",并将该对象存入字符串池中,当下次再使用"abc"时,就会直接指向字符串池中的该字符串。

而s2定义时是首先在堆里new了一个字符串对象,该对象又指向了字符串直接量"abc"。我们对于引用使用(==)来比较,你还记得是怎么定义的吗?是比较引用中所存的对象的地址。s1存的地址是字符串池中的字符串的位置,而s2存放的是堆中的new出来的那一块内存地址。所以s1==s2输出当然为false。

另外s2在创建时一共创建了1个或者2个对象(我是这么理解的),第一个是new出来的存放在堆当中的,第二个是"abc"这个直接量。


3.字符串的运算

		String s1="abc";
		
	        String s5="a";
		
	        String s6=s5+"bc";
	
		System.out.println(s1==s6);

上面的结果会输出为false。
		
		String s1="abc";
		
	        final String s5="a";
		
	        String s6=s5+"bc";
	
		System.out.println(s1==s6);

上面的结果会输出为true。

为什么一个输出为false,一个输出为true呢?
第一段代码中之所以会这样,是因为s6的字符串连接中存在变量,无法再编译时期确定下来s6的准确值,所以无法直接指向s1定义过的已经存放在字符串常量池内的字符串。‘
第二段代码与第一段代码的区别在于 s5定义成为了final类型的,所以在编译时期就能将s6中的s5直接替换成“a”,最终s6也就指向了与s1相同的内存区域。这里使用到了宏变量和宏替换的概念,不清楚这概念可以百度查查。






 上面的结果输出为true,我相信大家都是没有疑问的。

你可能感兴趣的:(Java知识)