首页 > 代码库 > Java中与String有关的且不得不说的事

Java中与String有关的且不得不说的事

如果以下有与Java堆栈和JVM常量池有关的可以访问下面的连接

Java当中的堆与栈详细解析

JVM中的常量池解析

前期记得自己学习编程语言的时候,只要能写出代码就可以。编程语言不就是写程序的吗?自己报着这种目的性很强的心态去学习,忽略了其中的精彩部分,学完C++之间学Java感觉Java中的String和C++中的没有什么区别,都是能存储大小随意变化的字符串。

如:String s="12345"; s  = "0";如果是字符串数组的话那就不,感觉很方便很好用。

话不多说了,看一段代码如果能直接看出结果的你可以回头了。

package com.tzx.ne;

public class Text {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String a = "1234561";
		String a1 = new String("1234561");
		String a2 = new String();
		a2 = "1234561";
		System.out.println(a==a1);
		System.out.println(a==a2);
		System.out.println(a1==a2);
		System.out.println("=================");
		String b = "1234561";
		String b1 = "123456";
		String b2 = "1";
		String b4 = "123456" + 1;
		System.out.println(b==b4);
		String b5 = b1 + b2;
		System.out.println(b==b5);
		System.out.println(b4==b5);
		String b6 = "123456" + b2;
		System.out.println(b==b6);
		System.out.println(b4==b6);
		System.out.println(b5==b6);
	}
	/**
	 * false
	 * true
	 * false
	 * =================
	 * true
	 * false
	 * false
	 * false
	 * false
	 * false
	 * */
}

String类的本质是字符数组char[],其次String类是final的,是不可被继承的,String还是特殊的封装类型,使用String时可以直接赋值,也可以用new来创建对象,但是这二者的实现机制是不同的。Java运行时维护一个String池,池中的String对象不可重复,没有创建,有则作罢。

第一句String a = "12341561";是在String池当中创建一个"123461"的常量。

第二句String a1 = new String("123461");是首先在栈当中创建一个a1的引用,在堆当中创建一个String对象,其内容是"123461",而a1指向的是堆内存中这个对象的首地址。

在这里添加一点东西:Java当中比较一共有两种方式一种是a==a1,一种是a.equals(a1);前者比较的是地址,后者比较的是内容。

所以a1和a的指向不一样他们的地址也就不一样。

第三句a2 = new String();先是a2指向new的这个对象的堆中的地址空间,然后a2 = "123461";这时因为"132461"在常量池当中已经存在了,所以a2指向的是常量池当中"1234561",这时判断a和a2他们的地址必然是相等的,而a1和a2也必然是不等的。


下面主要说的是Sring的+:

第四句:b4 = "123456" + 1;因为"1234156"和1都是存储在常量池当中的,所以Java首先解析的是"1324561" + 1它的结果是一个字符串常量,在常量池当中找"1234561"如果有那就返回它的引用,如果没有那么就创建后返回该引用。结果是有的所以b==b4.

第六句和第九句分别是b5=b1+b2;b6="123456" + b2;因为String不是基础类型,所以这个时候他们返回的就不是字符串常量了,而是一个对象,对象时存储的堆当中的,所以b5和b6是指向等式后面的返回的堆中对象的地址。