Java 基础概念整理


整理了几个在Java中,容易忽略的几个问题。


equals与==区别

基本类型比较:

==比较两个值是否相等

引用类型比较:

都是比较的是一个对象在内存中的地址值,在Object中equals初始化比较的是内存地址,只是许多Java类中都重写了equals方法,比如String(重写后equals判断内容是否相等),
所以equals方法具体的作用要看当前的那个类是如何实现重写父类中该方法的。如果没有重写该方法,那么equals和==号等价。

hashCode:用来计算hash值,hash值用来确定hash表索引的,方法给对象返回一个hash code值。
当我们向哈希表(如HashSet、HashMap等)中添加对象object时,首先调用hashCode()方法计算object的哈希码,通过哈希码可以直接定位object在哈希表中的位置(一般是哈希码对哈希表大小取余)。
如果该位置没有对象,可以直接将object插入该位置;如果该位置有对象(可能有多个,通过链表实现),则调用equals()方法比较这些对象与object是否相等,如果相等,则不需要保存object;如果不相等,则将该对象加入到链表中。
所以equals()相等,则hashCode()必须相等。如果两个对象equals()相等,则它们在哈希表(如HashSet、HashMap等)中只应该出现一次;如果hashCode()不相等,那么它们会被散列到哈希表的不同位置,哈希表中出现了不止一次。
在集合查找时,hashcode能大大降低对象比较次数,提高查找效率!

String的hashCode()计算公式为:s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1]

  1. 使用质数计算哈希码,由于质数的特性,它与其他数字相乘之后,计算结果唯一的概率更大,哈希冲突的概率更小。
  2. 使用的质数越大,哈希冲突的概率越小,但是计算的速度也越慢;31是哈希冲突和性能的折中,实际上是实验观测的结果。
  3. JVM会自动对31进行优化:31 * i == (i << 5) – i

类型转换

a=a+1会被强制转换为更高的数据类型,a=a+b --> a=a+b;//返回类型是a类型与b类型中的最高类型
a+=1不会被转换类型,也就是数据类型不变,a+=b --> a=(a.Type)(a+b);//返回的是a类型
+=的执行效率会稍微高一点,结果一样。

流close

一般用了虚拟机之外的资源如端口、显存、文件等。虚拟机无法通过垃圾回收释放这些资源,只能调用close方法来释放资源。
读一个文件,忘记关闭了流,在操作系统里对这个文件的写、删除等操作就会报错,告诉这个文件被某个进程占用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值