首先,在了解区别前要知道如何判断创建对象的个数。
String name0 = new String("Katty");//创建两个String类型的对象
String name1 = "jim";//一个String类型的对象
String name2 ="Ka"+"te";//一个String类型的对象。
String str = "To";
String name3 = str+"mmy";//创建两个String类型的对象
String letters = "a";
for(int i=1;i<3;i++) {
letters = "a"+letters;// i=1 aa i=2 aaa
}//创建多少个String对象 :3个String类型
另从上面可以看出for循环中出现了3个对象,java中为了避免创建多个对象占据内存,有这样的方法来解决
StringBuffer sb = new StringBuffer("a");
for(int i=1;i<3;i++) {
sb.append("a");
}
System.out.println(sb.toString());
System.out.println(sb.length());//返回字符个数
sb = new StringBuffer("asf");
System.out.println(sb.reverse());//反转
==的作用:基本数据类型比较的是数值是否相等;引用数据类型比较的是地址是否相同,不论哪种数据类型
double a = 10.0;
int b = 10;
System.out.println(a==b);//不论是什么数据类型,可以不是一种,只比较数值。
String str1 = "Jim";
String str2 = "Jim";
System.out.println(str1==str2);//比较地址
equals的作用:比较地址是否相同。
但String类重写了equals方法,用于比较俩个字符串是否相同。
这里我们需要分析 String中一段代码
public boolean equals(Object anObject) {//anObject变量存的是上转型对象地址
if (this == anObject) {//比较地址是否相同
return true;
}
if (anObject instanceof String) {//判断anObject变量所指向的对象是否是String类型
String anotherString = (String)anObject;//将上转型对象下转型
int n = value.length;//调用equals方法String对象每一个字符组成的char类型数组的长度。
if (n == anotherString.value.length) {
char v1[] = value;;//调用equals方法String对象每一个字符组成的char类型数组
char v2[] = anotherString.value;//anObject所对应的字符串构成的char类型数组
int i = 0;
while (n-- != 0) {//对比每个字符
if (v1[i] != v2[i])//对应字符不同,则俩个字符一定不同
return false;
i++;
}
return true;
}
}
return false;
}
通过上面可以看出俩者的区别。