文章目录
关于final关键字的总结
final 关键字可以修饰在三个地方: 变量、方法、类
-
对一个final变量:如果final修饰的是的变量是基本数据类型,则其数值不能被修改。如果修饰的是引用数据类型,其引用不能指向其他的对象。
-
final修饰类: 被final修饰的类不能被继承,final修饰的类默认的成员方法会被隐式的使用final;
-
final修饰方法:将方法锁定,防止任何继承的类改变方法的含义
线程、进程和程序的概念,以及他们之间的关系
- 线程
一个进程可以产生多个线程,多个线程之间功能进程的内存空间和操作系统资源,所以线程间的切换带来的系统开销要小于进程间的切换。线程是CPU调度的最小单元,进程是操作系统分配资源的最小单元,线程又被成为轻量级的进程
- 程序
程序是有数据和文件足称,也就是常说的代码,它是一个静态的概念,被存储在计算机的硬盘设备上。
- 进程
当静态的程序被编译、链接后载入到内存中的时候。一个程序转换为了一个进程,由静态的概念转变为动态的概念。进程就是程序一次的执行过程,它在计算机中一个指令一个指令的执行着,同时它还占据着系统的内存资源,CPU时间、文件、输入输出设备等。
hashCode 和 equals的规定
- 两个对象相等,它们的hashCode相同
- 两个对象的hashCode相同,它们不一定相同
- 两个对象相同,分别调用两次equals方法都返回true
- 因此,equals方法被覆盖,则hashCode方法也必须被覆盖
- hashCode方法默认是作用是对堆上的对象产生独特的值。如果没有重写hashCode(),则该class的两个对象一定不相同,哪怕是它们都指向的是相同的数据。
hashCode有什么作用
在HashSet中,添加一个元素的时候,首先对对象计算一次hashCode值,用来判断元素应该添加到什么位置,同时会和已经添加的元素的hashCode值做比较,如果没有相同的hashCode值,认为这个元素没有被添加过,如果存在相同的hashCode值,才会调用equals方法判断这两个元素的各个属性是否相同,如果相同,不会将元素插入;否则的话会重新计算hashCode,判断该放在什么位置。
为什么要重写hashCode()和equals()呢
当我们把一个对象放入到散列表中的时候,Map中做key,Set中做元素的时候。需要考虑的对象的判重问题。我们知道Java中一个Class默认继承自Object类,在Object中定义了两个方法,equals()和hashCode()。equals()方法的默认实现是比较两个对象的地址,hashCode方法是一个native方法,默认也是根据对象的地址计算hashCode。就会出现这种情况,两个对象它们的属性值完全一样,但是它们的hashCode值不一样,在调用Set add(),Map put() 都会被认为没有添加过该元素,就导致了Set集合去重“失效",Map集合 "key重复"的这种异常现象。所以当我们的对象需要放到HashSet或者放到HashMap中做key的时候,应该重写它的equals()和hashCode()方法。