关于本节课的equlas方法思考
看了Objects的源码,equals返回的是引用地址的相等是否,这里没有用String的equals
如图所示,java不会给直接等号赋值的字符串额外分配一个内存,而給new方法新建的相同字符串重新分配一个内存值,也就是这里的req.getServletPath是返回的同一个字符串?
由于这里的HttpRequestServlet是一个接口,我看不到里面的具体实现,所以我只能猜测这个方法只是简单的返回了一个字符串引用,那么问题是:
调用Objects.equals("/cart/list.do",req.getServletPath())方法,应该是新建了一个"/cart/list.do"String对象,他应该是新分配的内存空间才对,怎么会和req.getServletPath()相等?
正在回答
Object中的两个参数的equals方法也不是比较的地址值。楼上的老师提供过Object中的两个参数的equals方法的源码
同学可以解读一下
如果“/cart/list.do”和req.getServletPath() 完全相等包括地址值的话,那个肯定 a==b 就是true了。
那如果他们地址值不相同,但是是一样的字符串呢?它就是去执行||后边的判断
只要a不是null,他就会去调用字符串的equals方法,既然同学理解字符串的equals方法,那同学肯定能理解下边的这个判断。
“/cart/list.do”.equals(req.getServletPath())
他们也会返回true。
|| 符合,只要有一个是true,返回值就会是true。
如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
额,同学是把equals和==搞混了。==是比较地址值的。但是String中equals重写了,它不比较地址值:这里我写了个案例:
package File; public class HelloWorld { public static void main(String[] args) { String a = "HelloWorld"; String b = "HelloWorld"; String c = new String ("HelloWorld"); //用==比较 System.out.println("用==比较比较a和b: "+(a==b)); System.out.println("用==比较比较a和c: "+(a==c)); //用equals比较 System.out.println("===================================="); System.out.println("用equals比较a和b :"+(a.equals(b))); System.out.println("用equals比较a和c : "+(a.equals(c))); } }
运行结果如下
同学可以通过案例看到 ,String中重写的equals方法是不在乎地址值的。
Objects.equals("/cart/list.do",req.getServletPath())方法 和String中的这个是一个道理的。
如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
同学可以通过这张图来理解一下同学提到的问题:
str1声明的imooc会进入常量池,当常量池中存在一个imooc后,再进行字符串str2声明时,就会指向常量池的imooc,不会再重新定义一个新的imooc,所以实际上str1和str2的地址是相同的,是同一个内容;
而通过new创建的字符串对象会进入堆中,如果在通过new创建一个字符串对象,会再开辟一块新的空间,这也是字符串的特殊性。String普通声明会进入常量池,创建对象会开辟空间进入堆中。
在进行字符串声明时,如果没有创建对象的过程,就会直接指向常量池,在常量池中进行寻找。
这些内容在《Java零基础》课程中涉及到了,同学如果感兴趣的话,可以学习一下《Java零基础》课程: https://class.imooc.com/sc/18
如果解决了你的疑惑,请采纳,祝学习愉快!
首先Objects类中equals()方法的源码是这样的:
也就是说,a和b的地址相同 或者 a在不为空的情况下,a的值和b的值相同,都会返回true。
当传入的a和b如果是字符串,那么a.equals(b)调用的就是String类中的equals()方法。
String类的equals()方法比较的内容,而不是地址。
同学所提到的问题是:
Objects.equals("/cart/cart.do",req.getServletPath()) 这句代码中a位和b位的地址是否相同?
这个地方可以看做是两个常量在进行比较,因为没有创建对象的过程,所以可以看做字符串常量;
常量在比较的时候就是比较的内容了,和地址没有关系的。
如果解决了你的疑惑,请采纳,祝学习愉快!
相似问题
登录后可查看更多问答,登录/注册
- 参与学习 人
- 提交作业 1088 份
- 解答问题 10205 个
如果你有Java语言基础,又想以后从事Java Web开发,那么本路径是你的不二选择!本路径从网页搭建开始入手,通过大量案例来学习Java Web基础。定能助你完成Java Web小白的蜕变!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星