equals是一个类的方法,应该只有new出来的字符串才可以调用,为什么一个定义的字符串变量也可以调用,不明白,求高手指教。
String就是一个类啊,所以你定义的String s1 = "hellow" 就相当于 String s1 = new String("hellow");
你没有new 定义的字符串对象就是不是对象?,定义对象的方法有很多,不要只局限于new ,
另外,Java中从来没有过字符串变量,只有字符串对象,
你声明的变量是一个字符串对象,该对象的类有这个方法,当然可以调用。请去学习一下java的存储机制。
谢谢各位,初学java,非常感谢。
String就是一个类啊,所以你定义的String s1 = "hellow" 就相当于 String s1 = new String("hellow");
String s1 = "hellow"
String s2 = "hellow"
我认为 String s1 ="hellow" 是不等于 String s1 = new String("hellow");
因为 你可以试一下 上面的程序:
String s1 ="hellow"
String s2 = new String("hellow");
这时 s1 == s2 结果是 false
String s1 =new String("hellow");
String s2 = new String("hellow");
这时 s1 == s2 结果是 仍然false
可是
String s1 = "hellow"
String s2 = "hellow"
s1 == s2 结果竟然是 true
原因是:s1=new String("hellow") 和 s2 =new String("hellow")是申请一块内存 并且 里面放入 字符序列hellow 然后把 这个内存的地址(java中把内存地址叫做对象实例的引用)返回给s1,和s2
这时 s1 和 s2 分别用2个地址引用 s1 s2 里边分别存储着 "hellow"和 "hellow"
所以: equlas 方法比较 内存中存储的序列是 相同的 返回 true !
== 比较 两个内存引用是否是一个 内存引用这是 返回 false :原因 因为s1,s2 分别是2个引用地址
引起歧义的是:
String s1 = "hellow"
String s2 = "hellow"
s1 == s2 结果竟然是 true
原因是
这段代码行为是:
第一步 java 虚拟机 解析String s1 = “hellow”这段指令时 new String(“hellow”)一个内存地址保存对象实例存放“hellow”序列。 记录这个内存地址引用并且把 内存地址引用返回给 s1
第二步 java 虚拟机 解析String s2 = “hellow”这段指令时 并没有 发生new String(“hellow”) 而是直接把之前 存放“hellow”内存的地址引用返回给了 s2
所以这时候 s1 和 s2 指向同一内存地址的 一个String 实例
那么 == 运算 就成立了!
equals 当然就更没有问题了。
因为它是字面将,编译器会自动将它看作一个对象,所以当然可以调用!
只要是引用类型的变量都可以调用equals方法比较,对象只是引用中的一类。
equals是一个类的方法,但不应该只有new出来的字符串才可以调用,因为字符串是一个类,类的实例对象是通过该类的引用来使用类的成员方法的,虽然你给的例子是通过字面量(常量)来关联String类型的引用,但从该引用上调用String的类成员方法是没有歧义的。
equals是一个类的方法,但不应该只有new出来的字符串才可以调用,因为字符串是一个类,类的实例对象是通过该类的引用来使用类的成员方法的,虽然你给的例子是通过字面量(常量)来关联String类型的引用,但从该引用上调用String的类成员方法是没有歧义的。
搞这么复杂干嘛。。新手都别你你们弄懵了
equals:
1.比较两个引用数据类型句柄所指对象的内容是否一样
2.是比较两个对象,而非两个基本数据类型的变量
== :
1.比较两个引用数据类型句柄是否是指向同一对象,即这两个句柄所指向的内存地址是否一样
2.比较两个基本数据类型的值
这样看不就清楚多了