Java堆与栈内存分配及String小记(4)

1. 在Java中如果“==”被使用于两个对象类型的变量,他是用于比较两个变量是否引用自同一对象。

2.因此,不可用“==”比较两个字符串的字符内容是否相同,如果要比较两个字符串对象的字符值是否相同,要使用equals()方法。

3.在java中,使用“+”串联字符串会产生一个新的字符串对象。

4.intern()方法会先检查String池中是否存在字符部分相同的字符串对象,如果有就返回。如:

String str1 = "fly";
String str2 = "weight";
String str3 = "flyweight";
String str4 = null;
str4 = str1 + str2;
System.out.println(str3 == str4);//新对象,false
str4 = (str1 + str2).intern();
System.out.println(str3 = str4);//true

5.如果程序中想要附加字符串,并不建议使用“+”来进行字符串的串联,因为“+”会产生一个新的String实例。在面向对象程序设计中,最好是能重复运用已生成的对象,对象的生成需要内存空间和时间,不断地产生String实例是一个没有效率的行为。StringBuilder的出现就解决了这个问题,这个类产生的对象默认为16个字符的长度,若附加的字符过长,其会自动加长。两者的效率比较如下:

package ying.string;

public class AppendStringTest {
public static void main(String[] args) {
String text = "";
long beginTime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
text += i;
}
long endTime = System.currentTimeMillis();
System.out.println("+号执行时间: " + (endTime - beginTime));

StringBuilder builder = new StringBuilder();
beginTime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
builder.append(String.valueOf(i));
}
endTime = System.currentTimeMillis();
System.out.println("StringBuilder执行时间: " + (endTime - beginTime));
}

}

结果:+号执行时间: 709
StringBuilder执行时间: 14

因此,当你为一个类编写toString()方法时,如果字符串操作比较简单,那就可以信赖编译器,它会为你合理地构造最终的字符串结果。如果你要在toSring()方法中使用循环,最好自己创建一个StringBuilder对象,用它来构造最终的结果。如:


     package ying.string;

import java.util.Random;

public class UsingStringBuilder {

// public static Random rand=new
// Random(System.currentTimeMillis());//以当前时间为参数
public static Random rand = new Random(47);// new Random也是有算法的,47相当于给了一个

// 初始值,因此以后每次rand.nextInt(100)都不变;如果不设初始值即new Random(),每次执行值都会变
public String toString() {
StringBuilder result = new StringBuilder("[");
for (int i = 0; i < 25; i++) {
result.append(rand.nextInt(100));
result.append(", ");
}
result.delete(result.length() - 2, result.length());
result.append("]");
return result.toString();
}

public static void main(String[] args) {
UsingStringBuilder usb = new UsingStringBuilder();
System.out.println(usb);

}

}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwpdxs.html