JAVA面试之java基础1

1、String类为什么是final的


主要是为了“效率” 和 “安全性” 的缘故。若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所以String被定义成final。
我们都知道不可变就是当创建这个对象或类的实例后,就不允许修改它的值了。那么为什么当我们定义String s = "hello";s +="world";System.out.println(s)输出结果为helloworld呢?
其实那是因为当我们用String创建一个对象的时候,首先在常量池中查找,如果找到,就直接创建对象;如果不存在,先在常量池中创建,再创建一个对象。所以上面的代码执行后,s指向的的对象被改变了,并不是说其内容被改变了。
所以问 String s = “abc”创建一个对象时,应该是1个或两个。取决于在常量池中是否存在abc这样的内容。
那么就可以引申到,如何判定常量池中存在这个对象,答案是调用equals方法。那么可以说到怎样判定equals和==的区别和重载一个对象的equals,是否要重载hashcode方法。

2、equals方法、==和hashcode的区别


==运算符是用来比较两个变量的值是否相等,及比较的是在内存中所存储的数值是否相同。具体而言,如果比较的是两个基本类型,那么直接使用==运算符就能确定两者是否相等。如果比较的是非基本类型,那么由于其占用两个内存空间,如果比较的是连个变量是否指向同一个对象,那么可以使用==运算符,如果要比较的是两者之间的内容,那么就要用equals方法了
equals方法,是object类提供的方法。object中定义的equals方法是直接使用==运算符的,所以在没有覆盖equals方法的前提下,equals和==是相等的,比较的是引用,而不是其内容。但是equals方法的特殊在于它可以被覆盖。当重写equals方法后,比较的就是两者之间的内容而不是引用了。
hashcode()方法也是从object类继承而来的,其返回值是对象在内存中的地址的int值。所以在没有重写hashcode()方法,任何对象的hashcode()方法都是不想等的。一般情况下,如果用户判断出equals方法是相等,那么他们之间的hashcode()方法的返回值肯定是相同的。如果hashcode()方法返回值相同,equals方法的返回值可能相同,也可能不相同,但如果hashcode()返回值不相同,那么equals方法的返回值肯定不相同。

3、重载一个对象的equals,是否要重载hashcode方法


其实这个问题在上面有简单地提过,重载一个对象的equals,是否要重载hashcode方法,答案是肯定的。hashcode()方法是从object类继承而来的,其返回值是对象在内存中的地址的int值。所以在没有重写hashcode()方法,任何对象的hashcode()方法都是不想等的。所以在这种情况下,重载equals方法,肯定要重载hashcode方法。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值