str.equals(str2)======>true
str == str2 =======>false
str == str2 =======>false
解决方案 »
- equals " " 和 " " equalse有区别吗
- 在线等急啊
- java中arraylist能否转为map?
- 请问,如何让mouse移动到某个位置时显示一些文字,以浮动的窗口,浮动窗口的底色为黄色,字为黑色
- javaBean哦~~郁闷!
- 求助,在JAVA里面如何读取文件的最后N行的数据啊?(每一行的数据长度不定)急!!
- 获取目录信息该用什么哪个API?
- 各位前辈是否可以把当初练手的项目共享出来一下,供初学者学习学习。谢谢
- Java程序能否以后台方式运行?
- 关于配置rmi server?高手帮忙!!!
- 求救有关rose生成java代码的问题
- 如何将字符串变成java.sql.Date日期类型?
因为"=="是用来比较的地址,在java中常用来和null比较,其他情况很少用。
因为String是类, == 比较的两个引用的地址,当然不同了。
你用==来比较能相等才怪呢呵呵
c语言学的太多,一时转不过脑子来是吧,跟我刚开始一样
不一样!
看你怎么 比较!!
str.equals(str2)======>true
str == str2 =======>false
String s2="abc";
System.out.println("s1==s2?"+(s1==s2));
而"=="确切的说是比较两个对象引用的对象实例是否为同一个!
如:
String s1="abc";
String s2="abc";
则s1==s2的值为true,因为s1、s2都引用同一个字符串实例,当然都指向同一个内存地址了!
equal是比较值
equal是比较值!
eg:String s="Hello";
编译器在上述程序编译时,将字符H,e,l,l,o放入这个类文件的特殊区,这个区称为类文件的常量缓冲区(Constant pool)(一个由字符串常数和其他常数组成的集合)
编译器还会产生字节码指令,间接地将这个值的索引赋给字符串变量,编译器不会在缓冲区放置字符串常数的多个副本,如,即使源代码出现多个"abc"字符串常数,编译器也只在常量缓冲区放置这个字符串的一个副本(去掉双引号)(后面有个例子)。
在jvm加载类文件时,它为每个常量缓冲区中的字符串常数创建一个字符串对象(创建过程发生于幕后),将每个字符串对象的值初始化为String对象的值初始化为字符串常数包含的字符,并修改常量缓冲区的内存副本,使得加载字符串常数(在缓冲区中)索引的字节指令获得字符串对象的引用。
上面这段话很难理解(我花了半天才弄明白一点点),上过程即为:将源代码中描述的每个字符串常量变为运行时的一个字符串对象。
又如:String s=new String("Hello");
该段代码创建一个对象,错!!实际上其创建了两个对象,首先在加载类文件时,创建一个包含H,e,l,l,o的字符串对象,然后将该对象的引用作为参数传递给String(String str)构造函数,从而创建一个内部char数组(长度为5),然后构造函数从这个字符串对象中抽取Hello的值放入该数组中,最后将新的String对象的引用赋给s中。说了这么多,做两个练习。^_^
eg:
1. String s1="abc",s2="abc";
s1==s2;//true
String s1="abc",s2=new String("abc";)
s1==s2;//false
解:当编译器在源代码中遇到"abc"时,将其放入常量缓冲区中,但如果编译器遇到该字符串的第二个副本,就不将其放入常量缓冲区中,而是产生字节码指定来引用第一个字符串常量,在运行时当s1和s2都被赋值为对字符串对象(加载类文件时创建)的引用,它们实际指向包含"abc"的同一String对象。
通常缓冲区中的由字符串常量创建的字符串对象是固定的,即这些字符串对象保存在包含唯一字符串(即字符串带唯一的字符序列)内存缓冲区中,String类对这个内存缓冲区进行维护,只有两种方法可以固定String
一,在源代码中使用String常数。二,使用String的intern方法。
eg:String s1="abc",s2=new String ("abc").intern;
s1==s2;//true
下面给出整个源代码
public class StringTest{
public static void main(String[] args){
String s1,s2,s3,s4;
s1="abc";
s2="abc";
s3=new String("abc");
s4=new String("abc").intern();
System.out.println(s1==s2);
System.out.println(s1==s3);
System.out.println(s1==s4);
}
}