public static void main(String[] args) {
StringBuffer s1 = new StringBuffer("a");
StringBuffer s2 = new StringBuffer("a");
if(s1.equals(s2))System.out.println("true");
else System.out.println("false");
if(s1==s2)System.out.println("true");
else System.out.println("false");
}
大哥帮帮忙!!
为什么都是输出false,String 和 stringbuffer有什么区别。和共同点呢,,小弟在次谢谢了!
StringBuffer s1 = new StringBuffer("a");
StringBuffer s2 = new StringBuffer("a");
if(s1.equals(s2))System.out.println("true");
else System.out.println("false");
if(s1==s2)System.out.println("true");
else System.out.println("false");
}
大哥帮帮忙!!
为什么都是输出false,String 和 stringbuffer有什么区别。和共同点呢,,小弟在次谢谢了!
解决方案 »
- 使用java读取xlsx格式的execl,除了poi还有哪些方式?
- 线程并发的问题
- 小应用程序中setLayout(new GridLayout(0,1));是什么意思?
- 生成jar文件问题
- 如何通过按ESC键,退出当前Frame??
- 请高手指点,java 中将字符串数组转换为整型数组
- jdialog和jframe
- 还是JAVA中文的问题
- 如何定义graphics2D.drawLine()方法画出来的直线的粗细?
- eclipse module使用方法
- 公共类的设计小问题.
- 为什么Cat mimi = new Cat("mimi"); Cat cici = new Cat("cici"); 中的cici要加引号》?如果我定义的构造函数是Cat(double x){}那么我再new一个cat需要加引号?
StringBuffer:定义的字符串可以随时改变。可看作不固定长度的字符串变量。
String定义的字符串要比StringBuffer定义的字符串消耗资源多一点。
二、StringBuffer的equals方法没有覆盖Object的方法,所以StringBuffer a=new StringBuffer("ss");StringBuffer b=new StringBuffer("ss");,生成了两个对象,
a.equals(b)=false,比较的是地址。三、等号比较的是地址,String a = "a";String b=a;只生成了一个对象a==b true。
StringBuffer a=new StringBuffer("a");StringBuffer b = a; 也是生成一个对象a==b true。
四、String a="ss";String b="ss"; a.equals(b)=true a==b true因为也是一个对象。这是因为编译时只产生了一个对象"ss"。String a=new String("ss");String b=new String("ss");a.equals(b)=true,没有疑问,a==b false。因为a,b是在运行时才产生的对象,产生了2个对象。
http://bbs.chinajavaworld.com/thread.jspa?threadID=54173&start=45&tstart=0下边是StringBuffer的equals方法:
public boolean equals(Object obj) {
return (this == obj);
}
下边是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;
}
}
StringBuffer:定义的字符串可以随时改变。可看作不固定长度的字符串变量
同时它继承的Object的equals方法是比较object reference的 类同==
串,相反,如果你希望改动,则应使用StringBuffer类作为替换.
eg1:
......
//omit some code
String s1="You are hired!";
System.out.println(s1.replace('h','f'));//用f把字串中的h替换了
System.out.println(s1);
......
//omit some code
运行结果:
You are fired!
You are hired!
结果分析:
从结果,明显可知,s1的值并没有被改变,而第一行结果只是屏幕内容的替换.
eg2:
......
//omit some code
StringBuffer s2=new StringBuffer("Hello from Java!");
s2.replace(6,10,"to");
System.out.println(s2);
......
//omit some code
运行结果:
Hello to Java!
结果分析:
显然,s2的值已改变.以上为转载~~~~~~~
StringBuffer可以改变
反编译的代码:
public boolean equals(Object obj) {
return (this == obj);
}很明显StringBuffer的equals()方法和==都是比较地址的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是定长的字符串,对其的任何修改都会产生新的对象,消耗内存
不过String覆盖了Object的equals() 覆盖后比较对象的值 还有基本类型的包装类也是如此
而StringBuffer的equals还是比较对象的引用(是否指向同一对象)