抽象类和接口的区别
区别:
- 抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
- 抽象类要被子类继承,接口要被类实现。
- 接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现
- 接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
- 抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
- 抽象方法只能申明,不能实现。abstract void abc();不能写成abstract void abc(){}。
- 抽象类里可以没有抽象方法
- 如果一个类里有抽象方法,那么这个类只能是抽象类
- 抽象方法要被实现,所以不能是静态的,也不能是私有的。
- 接口可继承接口,并可多继承接口,但类只能单根继承。
类不能继承多个类 接口可以继承多个接口 类可以实现多个接口
final的用途
- 被final修饰的类不可以被继承
- 被final修饰的方法不可以被重写
- 被final修饰的变量不可以被改变(切记不可变的是变量的引用而非引用指向对象的内容。)
- 被final修饰的方法,JVM会尝试为之寻求内联,这对于提升Java的效率是非常重要的。因此,假如能确定方法不会被继承,那么尽量将方法定义为final的,具体参见运行期优化技术的方法内联部分
- 被final修饰的常量,在编译阶段会存入调用类的常量池中,具体参见类加载机制最后部分和Java内存区域
访问修饰符public、private、protected、default
- public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包(package)访问。
- private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的类、属性以及方法只能被该类的对象访问,其子类不能访问,更不能允许跨包访问。
- protect: 介于public 和 private 之间的一种访问修饰符,一般称之为“保护形”。被其修饰的类、属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。
- default:即不加任何访问修饰符,通常称为“默认访问模式“。该模式下,只允许在同一个包中进行访问。
Set
哈希值:是 JDK 根据对象的地址 或者字符串或者数字算出来的 int 类型的数值。
- Object 类中 public int hashCode() 方法 返回对象的哈希值
对象的哈希值特点
- 同一个对象多次调用hashCode()方法返回的哈希值是相同的
- 默认情况下,不同对象的哈希值是不同的,而重写hashCode()方法,可以实现对象哈希值相同
哈希表
- 底层采用
数组+链表实现,可以说是一个元素为链表的数组
HashSet保证 元素唯一性分析
- 是通过元素的两个方法,hashCode和equals来完成的。
- 如果元素的HashCode值相同,才会判断equals是否为true。
- 如果元素的HashCode值不同,不会调用equals。
- 要保证元素的唯一性,需要重写
hashCode()方法 和equals()方法
LinkedHashSet特点
- 哈希表和链表实现的Set接口,具有可预测的迭代次序
- 由链表保证元素有序,元素的存储和取出的顺序是一致的
- 由哈希表保证元素唯一,没有重复的元素