Java String小结

Categories: Java; Tagged with: ; @ February 5th, 2009 0:25

String

String对象是不可改变的.

String s1 = “s”;

改语句声明了一个指向对象的引用, 名为s1, 目前指向一个String对象, 其内容为”s”;

String s2 = “s”;

上一句则声明一个指向”s” 的引用 – 目前Sun的JVM会对此过程进行优化, 会将s2指向s1所指向的对象. 而非创建新的对象.

String s3 = s2;

声明了一个引用, 改引用指向s2所指向的String对象.

String s4 = new String(“s”);

声明一个引用s4, 同事通过String类创建String对象, s4指向该对象.

通过new String()函数创建String, 每次都会创建一个String对象,相比使用直接数, 效率低.

== 与 equals

首先需要明确:

在Java中, “==” 用于判断两个对象是否相同 – 可以理解为引用了相同的内存地址

而equals()则是Object类中的一个方法, 在 具体的类中有着具体的实现.

在String中, equals被冲写为:

    public boolean equals(Object anObject) {
	if (this == anObject) {
	    return true;
	}
	if (anObject instanceof String) {
	    String anotherString = (String)anObject;
	    int n = count;
	    if (n == anotherString.count) {
		char v1[] = value;
		char v2[] = anotherString.value;
		int i = offset;
		int j = anotherString.offset;
		while (n-- != 0) {
		    if (v1[i++] != v2[j++])
			return false;
		}
		return true;
	    }
	}
	return false;
    }

可见, 如果两个String”==” – 即相同, 则equals直接返回true. 如果不同 则先比较长度 , 再逐字比较. 一般来说, 在重写equals时也应重写hashCode.

在String中:

使用直接数赋值时,  具有优化作用的JVM会先搜索是否已经存在内容相同的Stinig对象, 如果存在, 则返回一个引用, 如果不存在则先创建,再返回引用.因此如果使用new String()进行操作, 则将丧失JVM优化的作用.

因此,

String s1 = “s”;

String s2 = “s”;

是相同的.

而使用String s1 = new(“s1”); 时, 将会创建一个新的String对象, 因此

String s1 = “s”

String s2 = new String(“s”);

是不同的, 但是相等的.

因此有:

		String s1 = "s";
		String s2 = new String("s");
		String s3 = "s";
		String s4 = new String(s1);
		System.out.println("s1 == s2 - " + (s1 == s2));
		System.out.println("s1.equals(s2)) - " + s1.equals(s2));

		System.out.println("s1 == s3 - " + (s1 == s3));
		System.out.println("s1.equals(s3) - " + s1.equals(s3));

		System.out.println("s4 == s1 - " + (s4 == s1));
		System.out.println("s4 == s2 - " + (s4 == s2));

输出信息如下:
s1 == s2 – false
s1.equals(s2)) – true
s1 == s3 – true
s1.equals(s3) – true
s4 == s1 – false
s4 == s2 – false

另外:

String s1  = “s1”;

String s2 = s1;

s1 = “ss”;

执行完之后 , s2 内容为”s1″, s1的内容为”ss”;

表明第二行代码中, s2 引用了 s1指向的String地址, 此后s2与s1再无关系.

<->



// Proudly powered by Apache, PHP, MySQL, WordPress, Bootstrap, etc,.