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,.